{"id":15377123,"url":"https://github.com/crashmax-dev/stenodb","last_synced_at":"2025-04-15T16:41:44.026Z","repository":{"id":65633333,"uuid":"589293248","full_name":"crashmax-dev/stenodb","owner":"crashmax-dev","description":"✍ Easy to use local JSON database. Ready to use in Browser (localStorage, sessionStorage), Nest.js and Node.js.","archived":false,"fork":false,"pushed_at":"2023-05-27T14:25:47.000Z","size":1050,"stargazers_count":15,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-27T06:04:00.211Z","etag":null,"topics":["json","json-database","localstorage","monorepository","nestjs","nodejs","sessionstorage","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crashmax-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-01-15T17:52:52.000Z","updated_at":"2024-04-02T10:42:45.000Z","dependencies_parsed_at":"2023-06-28T14:33:06.621Z","dependency_job_id":null,"html_url":"https://github.com/crashmax-dev/stenodb","commit_stats":{"total_commits":162,"total_committers":2,"mean_commits":81.0,"dds":0.03703703703703709,"last_synced_commit":"ca72707f81b3ccf062f21e93a9b0de6042792d30"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":"crashmax-dev/node-esm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crashmax-dev%2Fstenodb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crashmax-dev%2Fstenodb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crashmax-dev%2Fstenodb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crashmax-dev%2Fstenodb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crashmax-dev","download_url":"https://codeload.github.com/crashmax-dev/stenodb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249110319,"owners_count":21214308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["json","json-database","localstorage","monorepository","nestjs","nodejs","sessionstorage","typescript"],"created_at":"2024-10-01T14:09:45.866Z","updated_at":"2025-04-15T16:41:44.004Z","avatar_url":"https://github.com/crashmax-dev.png","language":"TypeScript","readme":"# stenodb [![](https://img.shields.io/npm/v/stenodb)](https://www.npmjs.org/package/stenodb)\n\n\u003e ✍ Easy to use local JSON database.\n\n## Install\n\n```sh\nnpm install stenodb\n```\n\n```sh\nyarn add stenodb\n```\n\n```sh\npnpm add stenodb\n```\n\n| Package | Version | Description |\n| ------- | ------ | ----------- |\n| [@stenodb/node](./packages/node) | [![](https://img.shields.io/npm/v/@stenodb/node)](https://npm.im/@stenodb/node) | Node.js |\n| [@stenodb/browser](./packages/browser) | [![](https://img.shields.io/npm/v/@stenodb/browser)](https://npm.im/@stenodb/browser) | Browser (localStorage, sessionStorage) |\n| [@stenodb/nest](./packages/nest) | [![](https://img.shields.io/npm/v/@stenodb/nest)](https://npm.im/@stenodb/nest) | Nest.js module |\n| [@stenodb/fastify](./packages/fastify) | [![](https://img.shields.io/npm/v/@stenodb/fastify)](https://npm.im/@stenodb/fastify) | Fastify plugin |\n| [@stenodb/lodash](./packages/lodash) | [![](https://img.shields.io/npm/v/@stenodb/lodash)](https://npm.im/@stenodb/lodash) | Lodash wrapper for Node.js and Browser |\n| [@stenodb/logger](./packages/logger) | [![](https://img.shields.io/npm/v/@stenodb/logger)](https://npm.im/@stenodb/logger) | Logger |\n\n## Examples\n\n\u003e **Note**\\\n\u003e You can find more detailed examples [here](./examples)\n\n\u003cdetails\u003e\n  \u003csummary\u003eclass-transformer entity\u003c/summary\u003e\n\n  ```ts\n  // entities.ts\n  import { Type } from 'class-transformer'\n\n  export class Users {\n    @Type(() =\u003e User)\n    users: User[]\n\n    constructor(...users: User[]) {\n      this.users = users\n    }\n  }\n\n  export class User {\n    username: string\n\n    @Type(() =\u003e Post)\n    posts: Post[]\n\n    constructor(username: string, ...posts: Post[]) {\n      this.username = username\n      this.posts = posts\n    }\n\n    addPost(post: Post) {\n      this.posts.push(post)\n    }\n  }\n\n  export class Post {\n    title: string\n\n    constructor(text: string) {\n      this.title = title\n    }\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e@stenodb/node\u003c/summary\u003e\n\n  ```ts\n  import 'reflect-metadata'\n  import { dirname, resolve } from 'node:path'\n  import { fileURLToPath } from 'node:url'\n  import { AsyncAdapter, NodeProvider } from '@stenodb/node'\n  import { Users, User, Post } from './entities.js'\n\n  const path = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'db')\n  const initialData = new Users(new User('John Doe'))\n  const adapter = new AsyncAdapter('users', Users, initialData)\n  const provider = new NodeProvider({ path })\n  const db = await provider.create(adapter)\n\n  await db.read()\n  db.data?.users[0]?.addPost(new Post('Lorem ipsum'))\n  await db.write()\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e@stenodb/browser\u003c/summary\u003e\n\n  ```ts\n  import 'reflect-metadata'\n  import { LocalStorage, BrowserProvider } from '@stenodb/browser'\n  import { Users, User, Post } from './entities.js'\n\n  const initialData = new Users(new User('John Doe'))\n  const adapter = new LocalStorage('users', Users, initialData)\n  const provider = new BrowserProvider()\n  const db = provider.create(adapter)\n\n  db.read()\n  db.data?.users[0]?.addPost(new Post('Lorem ipsum'))\n  db.write()\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e@stenodb/nest\u003c/summary\u003e\n\n  ```ts\n  // users.dto.ts\n  import { Exclude, Type } from 'class-transformer'\n  import { Length, Max, Min } from 'class-validator'\n\n  export class Users {\n    @Type(() =\u003e CreateUserDto)\n    users: CreateUserDto[] = []\n\n    constructor(...users: CreateUserDto[]) {\n      this.users = users\n    }\n  }\n\n  export class CreateUserDto {\n    @Exclude({ toPlainOnly: true })\n    id: number\n\n    @Length(1, 20)\n    name: string\n\n    @Min(12)\n    @Max(100)\n    age: number\n\n    constructor(id: number, name: string, age: number) {\n      this.id = id\n      this.name = name\n      this.age = age\n    }\n  }\n\n  // app.module.ts\n  import { resolve } from 'node:path'\n  import { Module } from '@nestjs/common'\n  import { StenoModule } from '@stenodb/nest'\n\n  @Module({\n    imports: [\n      StenoModule.register({\n        path: resolve(process.cwd(), 'db')\n      })\n    ]\n  })\n  export class AppModule {}\n\n  // users.service.ts\n  import { Injectable, OnModuleInit } from '@nestjs/common'\n  import { Steno, StenoService } from '@stenodb/nest'\n  import { Users, CreateUserDto } from './users.dto'\n\n  @Injectable()\n  export class UsersService implements OnModuleInit {\n    private usersProvider: Steno.NodeProvider\u003cUsers\u003e\n\n    constructor(private readonly stenoService: StenoService) {}\n\n    async onModuleInit(): Promise\u003cvoid\u003e {\n      this.usersProvider = await this.stenoService.create(\n        'users',\n        Users,\n        new Users(\n          new CreateUserDto(1, 'John', 22)\n        )\n      )\n\n      await this.usersProvider.read()\n    }\n\n    get users(): CreateUserDto[] {\n      return this.usersProvider.data.users\n    }\n  }\n  ```\n\u003c/details\u003e\n\n## Credits\n\n- [steno](https://github.com/typicode/steno) - Specialized fast async file writer.\n- [fastify-plugin](https://github.com/fastify/fastify-plugin) - Plugin helper for Fastify.\n- [nest](https://github.com/nestjs/nest) - A progressive Node.js framework for building efficient and scalable server-side applications.\n- [class-transformer](https://github.com/typestack/class-transformer) - Decorator-based transformation, serialization, and deserialization between objects and classes.\n- [class-validator](https://github.com/typestack/class-validator) - Decorator-based property validation for classes.\n- [class-validator-jsonschema](https://github.com/epiphone/class-validator-jsonschema) - Convert `class-validator` decorated classes into JSON schema.\n- [json-difference](https://github.com/lukascivil/json-difference) - A simple way to find the difference between two objects or json diff.\n- [tslog](https://github.com/fullstack-build/tslog) - Universal Logger for TypeScript and JavaScript.\n\n## License\n\nMIT - [crashmax](https://github.com/crashmax-dev)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrashmax-dev%2Fstenodb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrashmax-dev%2Fstenodb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrashmax-dev%2Fstenodb/lists"}