Skip to content

Commit 36b966a

Browse files
author
Eder Lima
committed
feat: add generic types to 'FsDB' namespace
1 parent 73287d9 commit 36b966a

File tree

3 files changed

+36
-30
lines changed

3 files changed

+36
-30
lines changed

src/@types/index.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
declare namespace FsDB {
2+
export type Collection<T> = DatabaseRecord<T>[]
3+
export type GenericDatabaseType = {
4+
[k: string]: Collection<any>
5+
}
6+
7+
export type DatabaseRecord<T> = { _id: string } & T
8+
}

src/fsdb/index.ts

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,35 @@ import { v4 } from 'uuid'
55
const kData = Symbol('kData')
66
const kDatabase = Symbol('kDatabase')
77

8-
export type GenericDatabaseType = {
9-
[k: string]: any[]
10-
}
11-
12-
export type DatabaseRecord<T> = { _id: string } & T
13-
148
type ArrayElement<T> = T extends readonly (infer ElementType)[]
159
? ElementType
1610
: never
1711

18-
type CollectionRef<T extends GenericDatabaseType, K extends keyof T> = {
12+
type CollectionRef<T extends FsDB.GenericDatabaseType, K extends keyof T> = {
1913
[kData]: Array<ArrayElement<T[K]>>
20-
[kDatabase]: FileSystemDatabase<T>
14+
[kDatabase]: Database<T>
2115
}
2216

23-
export default class FileSystemDatabase<T extends GenericDatabaseType> {
17+
export default class Database<T extends FsDB.GenericDatabaseType> {
2418
public [kData]: T | null
2519

2620
private constructor(private filename: string) {
2721
this[kData] = null
2822
}
2923

30-
static fromRef<T extends GenericDatabaseType>(
24+
static fromRef<T extends FsDB.GenericDatabaseType>(
3125
filename: string,
3226
ref: T
33-
): FileSystemDatabase<T> {
34-
const database = new FileSystemDatabase<T>(filename)
27+
): Database<T> {
28+
const database = new Database<T>(filename)
3529
database[kData] = ref
3630
return database
3731
}
3832

39-
static async fromFile<T extends GenericDatabaseType>(
33+
static async fromFile<T extends FsDB.GenericDatabaseType>(
4034
filename: string
41-
): Promise<FileSystemDatabase<T>> {
42-
const database = new FileSystemDatabase<T>(filename)
35+
): Promise<Database<T>> {
36+
const database = new Database<T>(filename)
4337
await database.load()
4438
return database
4539
}
@@ -63,8 +57,11 @@ export default class FileSystemDatabase<T extends GenericDatabaseType> {
6357
}
6458
}
6559

66-
export const collection = <T extends GenericDatabaseType, K extends keyof T>(
67-
database: FileSystemDatabase<T>,
60+
export const collection = <
61+
T extends FsDB.GenericDatabaseType,
62+
K extends keyof T
63+
>(
64+
database: Database<T>,
6865
key: K
6966
): CollectionRef<T, K> => {
7067
if (!database[kData]![key]) {
@@ -78,7 +75,7 @@ export const collection = <T extends GenericDatabaseType, K extends keyof T>(
7875
}
7976

8077
export const createDoc = async <
81-
T extends GenericDatabaseType,
78+
T extends FsDB.GenericDatabaseType,
8279
R extends keyof T
8380
>(
8481
collection: CollectionRef<T, R>,
@@ -96,7 +93,7 @@ export const createDoc = async <
9693
}
9794

9895
export const updateDoc = async <
99-
T extends GenericDatabaseType,
96+
T extends FsDB.GenericDatabaseType,
10097
R extends keyof T
10198
>(
10299
collection: CollectionRef<T, R>,
@@ -115,7 +112,10 @@ export const updateDoc = async <
115112
return collection[kData][index]
116113
}
117114

118-
export const getDoc = async <T extends GenericDatabaseType, R extends keyof T>(
115+
export const getDoc = async <
116+
T extends FsDB.GenericDatabaseType,
117+
R extends keyof T
118+
>(
119119
collection: CollectionRef<T, R>,
120120
id: string
121121
) => {
@@ -128,14 +128,17 @@ export const getDoc = async <T extends GenericDatabaseType, R extends keyof T>(
128128
return collection[kData][index]
129129
}
130130

131-
export const getDocs = async <T extends GenericDatabaseType, R extends keyof T>(
131+
export const getDocs = async <
132+
T extends FsDB.GenericDatabaseType,
133+
R extends keyof T
134+
>(
132135
collection: CollectionRef<T, R>
133136
) => {
134137
return collection[kData]
135138
}
136139

137140
export const deleteDoc = async <
138-
T extends GenericDatabaseType,
141+
T extends FsDB.GenericDatabaseType,
139142
R extends keyof T
140143
>(
141144
collection: CollectionRef<T, R>,

src/index.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
1-
import FileSystemDatabase, { collection, getDocs } from './fsdb'
2-
import type { DatabaseRecord } from './fsdb'
1+
import Database, { collection, getDocs } from './fsdb'
32

43
type Person = {
54
name: string
65
age: number
76
}
87

98
type DatabaseType = {
10-
people: Array<DatabaseRecord<Person>>
9+
people: FsDB.Collection<Person>
1110
}
1211

1312
const main = async () => {
14-
const database = await FileSystemDatabase.fromFile<DatabaseType>(
15-
'database.json'
16-
)
17-
13+
const database = await Database.fromFile<DatabaseType>('database.json')
1814
const people = await getDocs(collection(database, 'people'))
19-
2015
console.log(people)
2116
}
2217

0 commit comments

Comments
 (0)