Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
2 changes: 1 addition & 1 deletion examples/with-fastify/src/api/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export function userController(
{ schema: userBodySchema },
async (request, reply) => {
const { username, age } = request.body
const newUser = service.addUser(username, age)
const newUser = await service.addUser(username, age)
if (!newUser) return reply.status(400).send('Username exist')
return newUser
}
Expand Down
4 changes: 2 additions & 2 deletions examples/with-fastify/src/api/users/users.service.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { User, Users } from '../../dto/users.dto.js'
import type { Steno } from '@stenodb/fastify'
import type { AsyncProvider } from '@stenodb/fastify'
import type { FastifyInstance } from 'fastify'

export class UserService {
#users: Steno.NodeProvider<Users>
#users: AsyncProvider<Users>

constructor(private readonly fastify: FastifyInstance) {
this.#users = this.fastify.steno.get<Users>('users')!
Expand Down
3 changes: 2 additions & 1 deletion examples/with-fastify/src/dto/users.dto.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Exclude, Type } from 'class-transformer'
import { IsNumber, IsString, Length } from 'class-validator'
import { IsNumber, IsOptional, IsString, Length } from 'class-validator'
import { Post } from './posts.dto.js'

export class Users {
Expand All @@ -13,6 +13,7 @@ export class Users {

export class User {
@Exclude({ toPlainOnly: true })
@IsOptional()
@IsNumber()
userId: number

Expand Down
6 changes: 1 addition & 5 deletions examples/with-fastify/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,7 @@ const usersInitialData = new Users(
new User(2, 'alice', 23)
)

const usersAdapter = new AsyncAdapter(
'users',
Users,
usersInitialData
)
const usersAdapter = new AsyncAdapter('users', Users, usersInitialData)

fastify.register(FastifySteno, {
path: resolve(dirname(fileURLToPath(import.meta.url)), '..', 'db'),
Expand Down
4 changes: 2 additions & 2 deletions examples/with-nest/src/app.service.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Injectable, OnModuleInit } from '@nestjs/common'
import { Steno, StenoService } from '@stenodb/nest'
import { AsyncProvider, StenoService } from '@stenodb/nest'
import { CreateUserDto, initialUsersData, Users } from './dto/users.dto'

@Injectable()
export class UsersService implements OnModuleInit {
private usersProvider: Steno.NodeProvider<Users>
private usersProvider: AsyncProvider<Users>

constructor(private readonly stenoService: StenoService) {}

Expand Down
12 changes: 10 additions & 2 deletions examples/with-nest/src/dto/users.dto.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
import { Exclude, Type } from 'class-transformer'
import { IsNumber, IsString, Length, Max, Min } from 'class-validator'
import {
IsNumber,
IsOptional,
IsString,
Length,
Max,
Min
} from 'class-validator'

export class Users {
@Type(() => CreateUserDto)
Expand All @@ -11,8 +18,9 @@ export class Users {
}

export class CreateUserDto {
@IsNumber()
@Exclude({ toPlainOnly: true })
@IsOptional()
@IsNumber()
id: number

@IsString()
Expand Down
1 change: 1 addition & 0 deletions examples/with-node/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"extends": "@crashmax/tsconfig",
"compilerOptions": {
"moduleResolution": "NodeNext",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"outDir": "dist"
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@
"dev:examples": "turbo run dev --filter=./examples/*",
"build": "turbo run build --filter=./packages/*",
"build:examples": "turbo run build --filter=./examples/*",
"test": "turbo run test",
"format": "prettier --write --ignore-unknown **"
},
"devDependencies": {
"@crashmax/prettier-config": "3.0.1",
"@crashmax/tsconfig": "1.0.2",
"ava": "5.2.0",
"cross-env": "7.0.3",
"nodemon": "2.0.20",
"ts-node": "10.9.1",
Expand Down
15 changes: 13 additions & 2 deletions packages/browser/package.json
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
{
"name": "@stenodb/browser",
"description": "✍ Easy to use local JSON database",
"type": "module",
"version": "3.4.1",
"exports": {
".": {
"types": "./dist/index.d.ts",
"require": "./dist/index.js",
"default": "./dist/index.mjs"
"default": "./dist/index.js"
}
},
"types": "./dist/index.d.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"module": "./dist/index.js",
"files": [
"dist",
"src"
Expand Down Expand Up @@ -52,6 +53,16 @@
"peerDependencies": {
"@stenodb/logger": "workspace:3.4.1"
},
"ava": {
"snapshotDir": "test/snapshots",
"extensions": {
"ts": "module"
},
"nodeArguments": [
"--loader=ts-node/esm",
"--no-warnings"
]
},
"engines": {
"node": ">=14.16"
}
Expand Down
4 changes: 2 additions & 2 deletions packages/browser/src/adapter/LocalStorage.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { BrowserStorage } from './WebStorage.js'
import type { Steno } from '../types.js'
import type { ClassEntity } from '@stenodb/utils'

export class LocalStorage<T> extends BrowserStorage<T> {
constructor(name: string, entity: Steno.Entity<T>, initialData?: T) {
constructor(name: string, entity: ClassEntity<T>, initialData?: T) {
super(name, localStorage, entity, initialData)
}
}
4 changes: 2 additions & 2 deletions packages/browser/src/adapter/SessionStorage.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { BrowserStorage } from './WebStorage.js'
import type { Steno } from '../types.js'
import type { ClassEntity } from '@stenodb/utils'

export class SessionStorage<T> extends BrowserStorage<T> {
constructor(name: string, entity: Steno.Entity<T>, initialData?: T) {
constructor(name: string, entity: ClassEntity<T>, initialData?: T) {
super(name, sessionStorage, entity, initialData)
}
}
4 changes: 2 additions & 2 deletions packages/browser/src/adapter/WebStorage.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { dataTransformer, entityTransformer } from '@stenodb/utils'
import type { Steno } from '../types.js'
import type { BaseLogger } from '@stenodb/logger'
import type { ClassEntity } from '@stenodb/utils'
import type { DataTransformer, EntityTransformer } from '@stenodb/utils'

export class BrowserStorage<T> {
Expand All @@ -17,7 +17,7 @@ export class BrowserStorage<T> {
constructor(
name: string,
storage: Storage,
entity: Steno.Entity<T>,
entity: ClassEntity<T>,
initialData?: T
) {
this.name = name
Expand Down
1 change: 1 addition & 0 deletions packages/browser/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './adapter/LocalStorage.js'
export * from './adapter/SessionStorage.js'
export * from './provider/BrowserProvider.js'
export * from './provider/StorageProvider.js'
export * from './types.js'
10 changes: 5 additions & 5 deletions packages/browser/src/provider/BrowserProvider.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import { StorageProvider } from './StorageProvider.js'
import type { Steno } from '../types.js'
import type { BrowserProviderOptions, BrowserStorageAdapter } from '../types.js'

export class BrowserProvider {
#options: Steno.BrowserProviderOptions
#options: BrowserProviderOptions

constructor(options: Steno.BrowserProviderOptions = {}) {
constructor(options: BrowserProviderOptions = {}) {
this.#options = options
}

private registerAdapterModules<T>(adapter: Steno.BrowserAdapter<T>) {
private registerAdapterModules<T>(adapter: BrowserStorageAdapter<T>): void {
if (!this.#options?.logger) return
const logger = this.#options.logger(adapter.name)
adapter.registerLogger(logger)
}

create<T>(adapter: Steno.BrowserAdapter<T>): StorageProvider<T> {
create<T>(adapter: BrowserStorageAdapter<T>): StorageProvider<T> {
this.registerAdapterModules(adapter)
return new StorageProvider(adapter)
}
Expand Down
6 changes: 3 additions & 3 deletions packages/browser/src/provider/StorageProvider.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { Steno } from '../types.js'
import type { BrowserStorageAdapter } from '../types.js'

export class StorageProvider<T> {
#adapter: Steno.BrowserAdapter<T>
#adapter: BrowserStorageAdapter<T>

constructor(adapter: Steno.BrowserAdapter<T>) {
constructor(adapter: BrowserStorageAdapter<T>) {
this.#adapter = adapter
}

Expand Down
12 changes: 3 additions & 9 deletions packages/browser/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import type { LocalStorage } from './adapter/LocalStorage.js'
import type { SessionStorage } from './adapter/SessionStorage.js'
import type { StorageProvider } from './provider/StorageProvider.js'
import type { CreateLogger } from '@stenodb/logger'
import type { ClassEntity } from '@stenodb/utils'

export namespace Steno {
export type Entity<T> = ClassEntity<T>
export type BrowserAdapter<T> = LocalStorage<T> | SessionStorage<T>
export type BrowserProvider<T> = StorageProvider<T>
export type BrowserStorageAdapter<T> = LocalStorage<T> | SessionStorage<T>

export interface BrowserProviderOptions {
logger?: CreateLogger
}
export interface BrowserProviderOptions {
logger?: CreateLogger
}
16 changes: 14 additions & 2 deletions packages/fastify/package.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
{
"name": "@stenodb/fastify",
"version": "3.4.1",
"type": "module",
"exports": {
".": {
"types": "./dist/index.d.ts",
"require": "./dist/index.js",
"default": "./dist/index.mjs"
"default": "./dist/index.js"
}
},
"types": "./dist/index.d.ts",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"module": "./dist/index.js",
"files": [
"dist",
"src"
Expand All @@ -21,6 +22,7 @@
},
"dependencies": {
"@stenodb/node": "workspace:3.4.1",
"@stenodb/utils": "workspace:3.4.1",
"class-validator-jsonschema": "5.0.0",
"fastify-plugin": "4.5.0"
},
Expand All @@ -32,6 +34,16 @@
"@stenodb/node": "workspace:3.4.1",
"fastify": "^4.0.0"
},
"ava": {
"snapshotDir": "test/snapshots",
"extensions": {
"ts": "module"
},
"nodeArguments": [
"--loader=ts-node/esm",
"--no-warnings"
]
},
"engines": {
"node": ">=14.16"
}
Expand Down
7 changes: 4 additions & 3 deletions packages/fastify/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { AsyncAdapter, Steno, SyncAdapter } from '@stenodb/node'
import { AsyncAdapter, AsyncProvider } from '@stenodb/node'
import fp from 'fastify-plugin'
import { StenoPlugin } from './plugin.js'
import type { StenoOptions } from './types.js'
import type { ClassEntity } from '@stenodb/utils'

const FastifySteno = fp(StenoPlugin.createInstance, {
name: '@stenodb/fastify',
fastify: '4.x'
})

export { FastifySteno, AsyncAdapter, SyncAdapter }
export type { StenoOptions, Steno }
export { FastifySteno, AsyncAdapter, AsyncProvider }
export type { StenoOptions, ClassEntity }
export default StenoPlugin.createInstance
32 changes: 16 additions & 16 deletions packages/fastify/src/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { AsyncAdapter, NodeProvider, SyncAdapter } from '@stenodb/node'
import { AsyncAdapter, NodeProvider } from '@stenodb/node'
import { targetConstructorToSchema } from 'class-validator-jsonschema'
import type { StenoOptions } from './types'
import type { Steno } from '@stenodb/node'
import type { AsyncProvider } from '@stenodb/node'
import type { ClassEntity } from '@stenodb/utils'
import type { FastifyInstance } from 'fastify'

export class StenoPlugin {
#fastify: FastifyInstance
#options: StenoOptions
#provider: NodeProvider
#databases: Map<string, Steno.NodeProvider<any>>
#db: NodeProvider
#providers: Map<string, AsyncProvider<any>>

constructor(fastify: FastifyInstance, options: StenoOptions) {
this.#fastify = fastify
this.#options = options
this.#provider = new NodeProvider(options)
this.#databases = new Map<string, Steno.NodeProvider<any>>()
this.#db = new NodeProvider(options)
this.#providers = new Map<string, AsyncProvider<any>>()
this.#fastify.decorate('steno', { get: this.getDatabase.bind(this) })
}

Expand All @@ -33,18 +34,17 @@ export class StenoPlugin {
this.registerEntities()

for (const adapter of this.#options.adapters) {
const db = await this.#provider.create(adapter)
let provider: AsyncProvider<any>

if (adapter instanceof SyncAdapter) {
db.read()
} else if (adapter instanceof AsyncAdapter) {
await db.read()
if (adapter instanceof AsyncAdapter) {
provider = await this.#db.create(adapter)
await provider.read()
} else {
throw new TypeError('Invalid adapter')
}

this.addSchema(adapter.entity)
this.#databases.set(adapter.fileName, db)
this.#providers.set(adapter.fileName, provider)
}
}

Expand All @@ -55,7 +55,7 @@ export class StenoPlugin {
}
}

private addSchema(entity: Steno.Entity<any>): void {
private addSchema(entity: ClassEntity<any>): void {
if (this.#fastify.getSchema(entity.name)) return
const schema = targetConstructorToSchema(
entity,
Expand All @@ -65,9 +65,9 @@ export class StenoPlugin {
this.#fastify.addSchema({ ...schema, $id: entity.name })
}

private getDatabase<T extends Steno.Entity<any>>(
private getDatabase<T extends ClassEntity<any>>(
name: string
): Steno.NodeProvider<T> | undefined {
return this.#databases.get(name)
): AsyncProvider<T> | undefined {
return this.#providers.get(name)
}
}
Loading