✍ Easy to use local JSON database.
npm install stenodbyarn add stenodbpnpm add stenodb| Package | Version | Description | 
|---|---|---|
| @stenodb/node | Node.js | |
| @stenodb/browser | Browser (localStorage, sessionStorage) | |
| @stenodb/nest | Nest.js module | |
| @stenodb/fastify | Fastify plugin | |
| @stenodb/lodash | Lodash wrapper for Node.js and Browser | |
| @stenodb/logger | Logger | 
Note
You can find more detailed examples here
class-transformer entity
// entities.ts
import { Type } from 'class-transformer'
export class Users {
  @Type(() => User)
  users: User[]
  constructor(...users: User[]) {
    this.users = users
  }
}
export class User {
  username: string
  @Type(() => Post)
  posts: Post[]
  constructor(username: string, ...posts: Post[]) {
    this.username = username
    this.posts = posts
  }
  addPost(post: Post) {
    this.posts.push(post)
  }
}
export class Post {
  title: string
  constructor(text: string) {
    this.title = title
  }
}@stenodb/node
import 'reflect-metadata'
import { dirname, resolve } from 'node:path'
import { fileURLToPath } from 'node:url'
import { AsyncAdapter, NodeProvider } from '@stenodb/node'
import { Users, User, Post } from './entities.js'
const path = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'db')
const initialData = new Users(new User('John Doe'))
const adapter = new AsyncAdapter('users', Users, initialData)
const provider = new NodeProvider({ path })
const db = await provider.create(adapter)
await db.read()
db.data?.users[0]?.addPost(new Post('Lorem ipsum'))
await db.write()@stenodb/browser
import 'reflect-metadata'
import { LocalStorage, BrowserProvider } from '@stenodb/browser'
import { Users, User, Post } from './entities.js'
const initialData = new Users(new User('John Doe'))
const adapter = new LocalStorage('users', Users, initialData)
const provider = new BrowserProvider()
const db = provider.create(adapter)
db.read()
db.data?.users[0]?.addPost(new Post('Lorem ipsum'))
db.write()@stenodb/nest
// users.dto.ts
import { Exclude, Type } from 'class-transformer'
import { Length, Max, Min } from 'class-validator'
export class Users {
  @Type(() => CreateUserDto)
  users: CreateUserDto[] = []
  constructor(...users: CreateUserDto[]) {
    this.users = users
  }
}
export class CreateUserDto {
  @Exclude({ toPlainOnly: true })
  id: number
  @Length(1, 20)
  name: string
  @Min(12)
  @Max(100)
  age: number
  constructor(id: number, name: string, age: number) {
    this.id = id
    this.name = name
    this.age = age
  }
}
// app.module.ts
import { resolve } from 'node:path'
import { Module } from '@nestjs/common'
import { StenoModule } from '@stenodb/nest'
@Module({
  imports: [
    StenoModule.register({
      path: resolve(process.cwd(), 'db')
    })
  ]
})
export class AppModule {}
// users.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common'
import { Steno, StenoService } from '@stenodb/nest'
import { Users, CreateUserDto } from './users.dto'
@Injectable()
export class UsersService implements OnModuleInit {
  private usersProvider: Steno.NodeProvider<Users>
  constructor(private readonly stenoService: StenoService) {}
  async onModuleInit(): Promise<void> {
    this.usersProvider = await this.stenoService.create(
      'users',
      Users,
      new Users(
        new CreateUserDto(1, 'John', 22)
      )
    )
    await this.usersProvider.read()
  }
  get users(): CreateUserDto[] {
    return this.usersProvider.data.users
  }
}- steno - Specialized fast async file writer.
- fastify-plugin - Plugin helper for Fastify.
- nest - A progressive Node.js framework for building efficient and scalable server-side applications.
- class-transformer - Decorator-based transformation, serialization, and deserialization between objects and classes.
- class-validator - Decorator-based property validation for classes.
- class-validator-jsonschema - Convert class-validatordecorated classes into JSON schema.
- json-difference - A simple way to find the difference between two objects or json diff.
- tslog - Universal Logger for TypeScript and JavaScript.
MIT - crashmax