Skip to content

Commit 83ce22e

Browse files
committed
feat: rewrite api, new type exports
1 parent c287a01 commit 83ce22e

34 files changed

+165
-182
lines changed

examples/with-fastify/src/api/users/users.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function userController(
3434
{ schema: userBodySchema },
3535
async (request, reply) => {
3636
const { username, age } = request.body
37-
const newUser = service.addUser(username, age)
37+
const newUser = await service.addUser(username, age)
3838
if (!newUser) return reply.status(400).send('Username exist')
3939
return newUser
4040
}

examples/with-fastify/src/api/users/users.service.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { User, Users } from '../../dto/users.dto.js'
2-
import type { Steno } from '@stenodb/fastify'
2+
import type { AsyncProvider } from '@stenodb/fastify'
33
import type { FastifyInstance } from 'fastify'
44

55
export class UserService {
6-
#users: Steno.NodeProvider<Users>
6+
#users: AsyncProvider<Users>
77

88
constructor(private readonly fastify: FastifyInstance) {
99
this.#users = this.fastify.steno.get<Users>('users')!

examples/with-fastify/src/dto/users.dto.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Exclude, Type } from 'class-transformer'
2-
import { IsNumber, IsString, Length } from 'class-validator'
2+
import { IsNumber, IsOptional, IsString, Length } from 'class-validator'
33
import { Post } from './posts.dto.js'
44

55
export class Users {
@@ -13,6 +13,7 @@ export class Users {
1313

1414
export class User {
1515
@Exclude({ toPlainOnly: true })
16+
@IsOptional()
1617
@IsNumber()
1718
userId: number
1819

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { BrowserStorage } from './WebStorage.js'
2-
import type { Steno } from '../types.js'
2+
import type { ClassEntity } from '@stenodb/utils'
33

44
export class LocalStorage<T> extends BrowserStorage<T> {
5-
constructor(name: string, entity: Steno.Entity<T>, initialData?: T) {
5+
constructor(name: string, entity: ClassEntity<T>, initialData?: T) {
66
super(name, localStorage, entity, initialData)
77
}
88
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { BrowserStorage } from './WebStorage.js'
2-
import type { Steno } from '../types.js'
2+
import type { ClassEntity } from '@stenodb/utils'
33

44
export class SessionStorage<T> extends BrowserStorage<T> {
5-
constructor(name: string, entity: Steno.Entity<T>, initialData?: T) {
5+
constructor(name: string, entity: ClassEntity<T>, initialData?: T) {
66
super(name, sessionStorage, entity, initialData)
77
}
88
}

packages/browser/src/adapter/WebStorage.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { dataTransformer, entityTransformer } from '@stenodb/utils'
2-
import type { Steno } from '../types.js'
32
import type { BaseLogger } from '@stenodb/logger'
3+
import type { ClassEntity } from '@stenodb/utils'
44
import type { DataTransformer, EntityTransformer } from '@stenodb/utils'
55

66
export class BrowserStorage<T> {
@@ -17,7 +17,7 @@ export class BrowserStorage<T> {
1717
constructor(
1818
name: string,
1919
storage: Storage,
20-
entity: Steno.Entity<T>,
20+
entity: ClassEntity<T>,
2121
initialData?: T
2222
) {
2323
this.name = name

packages/browser/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './adapter/LocalStorage.js'
22
export * from './adapter/SessionStorage.js'
33
export * from './provider/BrowserProvider.js'
4+
export * from './provider/StorageProvider.js'
45
export * from './types.js'

packages/browser/src/provider/BrowserProvider.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { StorageProvider } from './StorageProvider.js'
2-
import type { Steno } from '../types.js'
2+
import type { BrowserProviderOptions, BrowserStorageAdapter } from '../types.js'
33

44
export class BrowserProvider {
5-
#options: Steno.BrowserProviderOptions
5+
#options: BrowserProviderOptions
66

7-
constructor(options: Steno.BrowserProviderOptions = {}) {
7+
constructor(options: BrowserProviderOptions = {}) {
88
this.#options = options
99
}
1010

11-
private registerAdapterModules<T>(adapter: Steno.BrowserAdapter<T>) {
11+
private registerAdapterModules<T>(adapter: BrowserStorageAdapter<T>): void {
1212
if (!this.#options?.logger) return
1313
const logger = this.#options.logger(adapter.name)
1414
adapter.registerLogger(logger)
1515
}
1616

17-
create<T>(adapter: Steno.BrowserAdapter<T>): StorageProvider<T> {
17+
create<T>(adapter: BrowserStorageAdapter<T>): StorageProvider<T> {
1818
this.registerAdapterModules(adapter)
1919
return new StorageProvider(adapter)
2020
}

packages/browser/src/provider/StorageProvider.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type { Steno } from '../types.js'
1+
import type { BrowserStorageAdapter } from '../types.js'
22

33
export class StorageProvider<T> {
4-
#adapter: Steno.BrowserAdapter<T>
4+
#adapter: BrowserStorageAdapter<T>
55

6-
constructor(adapter: Steno.BrowserAdapter<T>) {
6+
constructor(adapter: BrowserStorageAdapter<T>) {
77
this.#adapter = adapter
88
}
99

packages/browser/src/types.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import type { LocalStorage } from './adapter/LocalStorage.js'
22
import type { SessionStorage } from './adapter/SessionStorage.js'
3-
import type { StorageProvider } from './provider/StorageProvider.js'
43
import type { CreateLogger } from '@stenodb/logger'
5-
import type { ClassEntity } from '@stenodb/utils'
64

7-
export namespace Steno {
8-
export type Entity<T> = ClassEntity<T>
9-
export type BrowserAdapter<T> = LocalStorage<T> | SessionStorage<T>
10-
export type BrowserProvider<T> = StorageProvider<T>
5+
export type BrowserStorageAdapter<T> = LocalStorage<T> | SessionStorage<T>
116

12-
export interface BrowserProviderOptions {
13-
logger?: CreateLogger
14-
}
7+
export interface BrowserProviderOptions {
8+
logger?: CreateLogger
159
}

packages/fastify/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
},
2323
"dependencies": {
2424
"@stenodb/node": "workspace:3.4.1",
25+
"@stenodb/utils": "workspace:3.4.1",
2526
"class-validator-jsonschema": "5.0.0",
2627
"fastify-plugin": "4.5.0"
2728
},

packages/fastify/src/index.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { AsyncAdapter, Steno, SyncAdapter } from '@stenodb/node'
1+
import { AsyncAdapter, AsyncProvider } from '@stenodb/node'
22
import fp from 'fastify-plugin'
33
import { StenoPlugin } from './plugin.js'
44
import type { StenoOptions } from './types.js'
5+
import type { ClassEntity } from '@stenodb/utils'
56

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

11-
export { FastifySteno, AsyncAdapter, SyncAdapter }
12-
export type { StenoOptions, Steno }
12+
export { FastifySteno, AsyncAdapter, AsyncProvider }
13+
export type { StenoOptions, ClassEntity }
1314
export default StenoPlugin.createInstance

packages/fastify/src/plugin.ts

+16-16
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
import { AsyncAdapter, NodeProvider, SyncAdapter } from '@stenodb/node'
1+
import { AsyncAdapter, NodeProvider } from '@stenodb/node'
22
import { targetConstructorToSchema } from 'class-validator-jsonschema'
33
import type { StenoOptions } from './types'
4-
import type { Steno } from '@stenodb/node'
4+
import type { AsyncProvider } from '@stenodb/node'
5+
import type { ClassEntity } from '@stenodb/utils'
56
import type { FastifyInstance } from 'fastify'
67

78
export class StenoPlugin {
89
#fastify: FastifyInstance
910
#options: StenoOptions
10-
#provider: NodeProvider
11-
#databases: Map<string, Steno.NodeProvider<any>>
11+
#db: NodeProvider
12+
#providers: Map<string, AsyncProvider<any>>
1213

1314
constructor(fastify: FastifyInstance, options: StenoOptions) {
1415
this.#fastify = fastify
1516
this.#options = options
16-
this.#provider = new NodeProvider(options)
17-
this.#databases = new Map<string, Steno.NodeProvider<any>>()
17+
this.#db = new NodeProvider(options)
18+
this.#providers = new Map<string, AsyncProvider<any>>()
1819
this.#fastify.decorate('steno', { get: this.getDatabase.bind(this) })
1920
}
2021

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

3536
for (const adapter of this.#options.adapters) {
36-
const db = await this.#provider.create(adapter)
37+
let provider: AsyncProvider<any>
3738

38-
if (adapter instanceof SyncAdapter) {
39-
db.read()
40-
} else if (adapter instanceof AsyncAdapter) {
41-
await db.read()
39+
if (adapter instanceof AsyncAdapter) {
40+
provider = await this.#db.create(adapter)
41+
await provider.read()
4242
} else {
4343
throw new TypeError('Invalid adapter')
4444
}
4545

4646
this.addSchema(adapter.entity)
47-
this.#databases.set(adapter.fileName, db)
47+
this.#providers.set(adapter.fileName, provider)
4848
}
4949
}
5050

@@ -55,7 +55,7 @@ export class StenoPlugin {
5555
}
5656
}
5757

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

68-
private getDatabase<T extends Steno.Entity<any>>(
68+
private getDatabase<T extends ClassEntity<any>>(
6969
name: string
70-
): Steno.NodeProvider<T> | undefined {
71-
return this.#databases.get(name)
70+
): AsyncProvider<T> | undefined {
71+
return this.#providers.get(name)
7272
}
7373
}

packages/fastify/src/types.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1-
import type { Steno } from '@stenodb/node'
1+
import type {
2+
AsyncAdapter,
3+
AsyncProvider,
4+
NodeProviderOptions
5+
} from '@stenodb/node'
6+
import type { ClassEntity } from '@stenodb/utils'
27
import type { IOptions } from 'class-validator-jsonschema/build/options'
38

4-
export interface StenoOptions extends Steno.NodeProviderOptions {
5-
adapters: Steno.NodeAdapter<any>[]
6-
entities?: Steno.Entity<any>[]
9+
export interface StenoOptions extends NodeProviderOptions {
10+
adapters: AsyncAdapter<any>[]
11+
entities?: ClassEntity<any>[]
712
entityOptions?: IOptions
813
}
914

1015
declare module 'fastify' {
1116
export interface FastifyInstance {
1217
steno: {
13-
get: <T>(name: string) => Steno.NodeProvider<T> | undefined
18+
get: <T>(name: string) => AsyncProvider<T> | undefined
1419
}
1520
}
1621
}

packages/lodash/src/browser.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import lodash from 'lodash'
2-
import type { Steno } from '@stenodb/browser'
2+
import type { StorageProvider } from '@stenodb/browser'
33

44
export class BrowserLodash<T> {
5-
#provider: Steno.BrowserProvider<T>
5+
#provider: StorageProvider<T>
66
#chain: lodash.ExpChain<T>
77

8-
constructor(provider: Steno.BrowserProvider<T>) {
8+
constructor(provider: StorageProvider<T>) {
99
this.#provider = provider
1010
this.#chain = lodash.chain(provider).get('data')
1111
}

packages/lodash/src/node.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import lodash from 'lodash'
2-
import type { Steno } from '@stenodb/node'
2+
import type { AsyncProvider } from '@stenodb/node'
33

44
export class NodeLodash<T> {
5-
#provider: Steno.NodeProvider<T>
5+
#provider: AsyncProvider<T>
66
#chain: lodash.ExpChain<T>
77

8-
constructor(provider: Steno.NodeProvider<T>) {
8+
constructor(provider: AsyncProvider<T>) {
99
this.#provider = provider
1010
this.#chain = lodash.chain(provider).get('data')
1111
}

packages/logger/test/index.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { createRotation } from '../src/rotation.js'
88

99
const logsPath = resolve('logs')
1010

11-
test.before(async () => {
11+
test.beforeEach(async () => {
1212
if (existsSync(logsPath)) {
1313
await rm(logsPath, { recursive: true })
1414
}

packages/nest/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
},
4444
"dependencies": {
4545
"@nestjs/common": "9.3.7",
46-
"@stenodb/node": "workspace:3.4.1"
46+
"@stenodb/node": "workspace:3.4.1",
47+
"@stenodb/utils": "workspace:3.4.1"
4748
},
4849
"devDependencies": {
4950
"@swc/core": "1.3.35",

packages/nest/src/config.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { ConfigurableModuleBuilder } from '@nestjs/common'
2-
import type { Steno } from '@stenodb/node'
2+
import type { NodeProviderOptions } from '@stenodb/node'
33

44
export const {
55
ConfigurableModuleClass,
66
MODULE_OPTIONS_TOKEN,
77
OPTIONS_TYPE,
88
ASYNC_OPTIONS_TYPE
9-
} = new ConfigurableModuleBuilder<Steno.NodeProviderOptions>()
9+
} = new ConfigurableModuleBuilder<NodeProviderOptions>()
1010
.setExtras({ isGlobal: false }, (definition, extras) => ({
1111
...definition,
1212
global: extras.isGlobal

packages/nest/src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export * from './stenodb.module.js'
22
export * from './stenodb.service.js'
3-
export type { Steno } from '@stenodb/node'
3+
export type { ClassEntity } from '@stenodb/utils'

packages/nest/src/stenodb.service.ts

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { Inject, Injectable } from '@nestjs/common'
2-
import { AsyncAdapter, NodeProvider } from '@stenodb/node'
2+
import {
3+
AsyncAdapter,
4+
NodeProvider,
5+
SyncAdapter,
6+
SyncProvider
7+
} from '@stenodb/node'
38
import { MODULE_OPTIONS_TOKEN, OPTIONS_TYPE } from './config.js'
4-
import type { Steno } from '@stenodb/node'
9+
import type { AsyncProvider } from '@stenodb/node'
10+
import type { ClassEntity } from '@stenodb/utils'
511

612
@Injectable()
713
export class StenoService {
@@ -13,10 +19,19 @@ export class StenoService {
1319

1420
async create<T>(
1521
fileName: string,
16-
entity: Steno.Entity<T>,
22+
entity: ClassEntity<T>,
1723
initialData?: T
18-
): Promise<Steno.NodeProvider<T>> {
24+
): Promise<AsyncProvider<T>> {
1925
const adapter = new AsyncAdapter(fileName, entity, initialData)
2026
return await this.provider.create(adapter)
2127
}
28+
29+
createSync<T>(
30+
fileName: string,
31+
entity: ClassEntity<T>,
32+
initialData?: T
33+
): SyncProvider<T> {
34+
const adapter = new SyncAdapter(fileName, entity, initialData)
35+
return this.provider.createSync(adapter)
36+
}
2237
}

packages/node/src/adapter/AsyncAdapter.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { readFile } from 'node:fs/promises'
22
import { BaseAdapter } from './BaseAdapter.js'
3-
import type { Steno } from '../types.js'
3+
import type { ClassEntity } from '@stenodb/utils'
44

55
export class AsyncAdapter<T> extends BaseAdapter<T> {
6-
constructor(fileName: string, entity: Steno.Entity<T>, initialData?: T) {
6+
constructor(fileName: string, entity: ClassEntity<T>, initialData?: T) {
77
super(fileName, entity, initialData)
88
}
99

0 commit comments

Comments
 (0)