@wxn0brp/db-storage-web 0.100.0 → 0.110.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.js +10 -2
- package/dist/indexed.d.ts +29 -0
- package/dist/indexed.js +275 -0
- package/dist/storage.d.ts +2 -2
- package/dist/storage.js +11 -11
- package/package.json +6 -5
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ This plugin provides web storage (localStorage/sessionStorage) operations for Va
|
|
|
8
8
|
npm install @wxn0brp/db-storage-web
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## LocalStorage
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
14
|
import { createWebStorageValthera } from "@wxn0brp/db-storage-web";
|
|
@@ -20,4 +20,16 @@ const db = createWebStorageValthera("my-db", {
|
|
|
20
20
|
{ id: 2, name: "Mieszko" }
|
|
21
21
|
]
|
|
22
22
|
});
|
|
23
|
-
```
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## IndexedDB
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { createIndexedDBValthera } from "@wxn0brp/db-storage-web";
|
|
29
|
+
|
|
30
|
+
const db = createIndexedDBValthera("my-db");
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## License
|
|
34
|
+
|
|
35
|
+
MIT
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import { ValtheraClass } from "@wxn0brp/db-core";
|
|
|
2
2
|
import { Data } from "@wxn0brp/db-core/types/data";
|
|
3
3
|
import { Collection } from "@wxn0brp/db-core/helpers/collection";
|
|
4
4
|
export * from "./storage.js";
|
|
5
|
+
export * from "./indexed.js";
|
|
5
6
|
export declare function createWebStorageValthera<T extends Record<string, Data[]>>(name: string, data?: T, storage?: Storage): ValtheraClass & {
|
|
6
7
|
[K in keyof T]: Collection<T[K][number]>;
|
|
7
8
|
};
|
|
9
|
+
export declare function createIndexedDBValthera<T extends Record<string, Data[]>>(name: string): ValtheraClass & {
|
|
10
|
+
[K in keyof T]: Collection<T[K][number]>;
|
|
11
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { forgeValthera, ValtheraClass } from "@wxn0brp/db-core";
|
|
2
2
|
import { WebStorageActions } from "./storage.js";
|
|
3
|
+
import { IndexedDBActions } from "./indexed.js";
|
|
3
4
|
export * from "./storage.js";
|
|
5
|
+
export * from "./indexed.js";
|
|
4
6
|
export function createWebStorageValthera(name, data, storage = localStorage) {
|
|
5
7
|
const db = new ValtheraClass({
|
|
6
|
-
dbAction: new WebStorageActions(name, storage)
|
|
8
|
+
dbAction: new WebStorageActions(name, storage),
|
|
7
9
|
});
|
|
8
10
|
if (!data)
|
|
9
11
|
return forgeValthera(db);
|
|
10
12
|
for (const collection of Object.keys(data)) {
|
|
11
|
-
db.
|
|
13
|
+
db.adapter._write(collection, data[collection]);
|
|
12
14
|
}
|
|
13
15
|
return forgeValthera(db);
|
|
14
16
|
}
|
|
17
|
+
export function createIndexedDBValthera(name) {
|
|
18
|
+
const db = new ValtheraClass({
|
|
19
|
+
adapter: new IndexedDBActions(name),
|
|
20
|
+
});
|
|
21
|
+
return forgeValthera(db);
|
|
22
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ActionsBase } from "@wxn0brp/db-core/base/actions";
|
|
2
|
+
import { DataInternal } from "@wxn0brp/db-core/types/data";
|
|
3
|
+
import { VQueryT } from "@wxn0brp/db-core/types/query";
|
|
4
|
+
export declare class IndexedDBActions extends ActionsBase {
|
|
5
|
+
name: string;
|
|
6
|
+
db: IDBDatabase;
|
|
7
|
+
_version: number;
|
|
8
|
+
_inited: boolean;
|
|
9
|
+
constructor(name: string);
|
|
10
|
+
_getDBName(): string;
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
_loadVersion(): Promise<void>;
|
|
13
|
+
_saveVersion(): Promise<void>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
_changeSchema(upgradeFn: (db: IDBDatabase) => void): Promise<void>;
|
|
16
|
+
_getStore(collection: string, mode: IDBTransactionMode): Promise<IDBObjectStore>;
|
|
17
|
+
_getAllEntries(collection: string): Promise<DataInternal[]>;
|
|
18
|
+
ensureCollection(collection: string): Promise<boolean>;
|
|
19
|
+
issetCollection(collection: string): Promise<boolean>;
|
|
20
|
+
getCollections(): Promise<string[]>;
|
|
21
|
+
removeCollection(collection: string): Promise<boolean>;
|
|
22
|
+
add(query: VQueryT.Add): Promise<DataInternal>;
|
|
23
|
+
find(query: VQueryT.Find): Promise<DataInternal[]>;
|
|
24
|
+
findOne(query: VQueryT.FindOne): Promise<DataInternal | null>;
|
|
25
|
+
update(query: VQueryT.Update): Promise<DataInternal[]>;
|
|
26
|
+
updateOne(query: VQueryT.Update): Promise<DataInternal | null>;
|
|
27
|
+
remove(query: VQueryT.Remove): Promise<DataInternal[]>;
|
|
28
|
+
removeOne(query: VQueryT.Remove): Promise<DataInternal | null>;
|
|
29
|
+
}
|
package/dist/indexed.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { ActionsBase } from "@wxn0brp/db-core/base/actions";
|
|
2
|
+
import { addId } from "@wxn0brp/db-core/helpers/addId";
|
|
3
|
+
import { findObj, matchObj, updateObj } from "@wxn0brp/db-core/utils/process";
|
|
4
|
+
export class IndexedDBActions extends ActionsBase {
|
|
5
|
+
name;
|
|
6
|
+
db = null;
|
|
7
|
+
_version = 1;
|
|
8
|
+
_inited = false;
|
|
9
|
+
constructor(name) {
|
|
10
|
+
super();
|
|
11
|
+
this.name = name;
|
|
12
|
+
}
|
|
13
|
+
_getDBName() {
|
|
14
|
+
return "vdb_" + this.name;
|
|
15
|
+
}
|
|
16
|
+
async init() {
|
|
17
|
+
if (this.db)
|
|
18
|
+
return;
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const request = indexedDB.open(this._getDBName());
|
|
21
|
+
request.onerror = () => reject(request.error);
|
|
22
|
+
request.onsuccess = () => {
|
|
23
|
+
this.db = request.result;
|
|
24
|
+
this._version = this.db.version;
|
|
25
|
+
this._loadVersion()
|
|
26
|
+
.then(() => resolve())
|
|
27
|
+
.catch(reject);
|
|
28
|
+
};
|
|
29
|
+
request.onupgradeneeded = event => {
|
|
30
|
+
const db = request.result;
|
|
31
|
+
this._version = db.version;
|
|
32
|
+
if (!db.objectStoreNames.contains("_meta")) {
|
|
33
|
+
db.createObjectStore("_meta");
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async _loadVersion() {
|
|
39
|
+
if (!this.db)
|
|
40
|
+
return;
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const tx = this.db.transaction("_meta", "readonly");
|
|
43
|
+
const store = tx.objectStore("_meta");
|
|
44
|
+
const request = store.get("version");
|
|
45
|
+
request.onerror = () => reject(request.error);
|
|
46
|
+
request.onsuccess = () => {
|
|
47
|
+
this._version = request.result || 1;
|
|
48
|
+
resolve();
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async _saveVersion() {
|
|
53
|
+
if (!this.db)
|
|
54
|
+
return;
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const tx = this.db.transaction("_meta", "readwrite");
|
|
57
|
+
const store = tx.objectStore("_meta");
|
|
58
|
+
const request = store.put(this._version, "version");
|
|
59
|
+
request.onerror = () => reject(request.error);
|
|
60
|
+
request.onsuccess = () => resolve();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async close() {
|
|
64
|
+
if (this.db) {
|
|
65
|
+
this.db.close();
|
|
66
|
+
this.db = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async _changeSchema(upgradeFn) {
|
|
70
|
+
if (!this.db)
|
|
71
|
+
throw new Error("Database not initialized");
|
|
72
|
+
const newVersion = this.db.version + 1;
|
|
73
|
+
this.db.close();
|
|
74
|
+
this.db = null;
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const request = indexedDB.open(this._getDBName(), newVersion);
|
|
77
|
+
request.onerror = () => reject(request.error);
|
|
78
|
+
request.onsuccess = () => {
|
|
79
|
+
this.db = request.result;
|
|
80
|
+
this._version = this.db.version;
|
|
81
|
+
this._saveVersion()
|
|
82
|
+
.then(() => resolve())
|
|
83
|
+
.catch(reject);
|
|
84
|
+
};
|
|
85
|
+
request.onupgradeneeded = () => {
|
|
86
|
+
const db = request.result;
|
|
87
|
+
if (!db.objectStoreNames.contains("_meta")) {
|
|
88
|
+
db.createObjectStore("_meta");
|
|
89
|
+
}
|
|
90
|
+
upgradeFn(db);
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async _getStore(collection, mode) {
|
|
95
|
+
if (!this.db)
|
|
96
|
+
throw new Error("Database not initialized");
|
|
97
|
+
const tx = this.db.transaction(collection, mode);
|
|
98
|
+
return tx.objectStore(collection);
|
|
99
|
+
}
|
|
100
|
+
async _getAllEntries(collection) {
|
|
101
|
+
const store = await this._getStore(collection, "readonly");
|
|
102
|
+
return new Promise((resolve, reject) => {
|
|
103
|
+
const request = store.getAll();
|
|
104
|
+
request.onerror = () => reject(request.error);
|
|
105
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async ensureCollection(collection) {
|
|
109
|
+
if (!this.db)
|
|
110
|
+
throw new Error("Database not initialized");
|
|
111
|
+
if (this.db.objectStoreNames.contains(collection))
|
|
112
|
+
return false;
|
|
113
|
+
await this._changeSchema(db => {
|
|
114
|
+
if (!db.objectStoreNames.contains(collection)) {
|
|
115
|
+
db.createObjectStore(collection, {
|
|
116
|
+
keyPath: "_id",
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
async issetCollection(collection) {
|
|
123
|
+
if (!this.db)
|
|
124
|
+
throw new Error("Database not initialized");
|
|
125
|
+
return this.db.objectStoreNames.contains(collection);
|
|
126
|
+
}
|
|
127
|
+
async getCollections() {
|
|
128
|
+
if (!this.db)
|
|
129
|
+
throw new Error("Database not initialized");
|
|
130
|
+
const collections = [];
|
|
131
|
+
for (let i = 0; i < this.db.objectStoreNames.length; i++) {
|
|
132
|
+
const name = this.db.objectStoreNames.item(i);
|
|
133
|
+
if (name && name !== "_meta") {
|
|
134
|
+
collections.push(name);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return collections;
|
|
138
|
+
}
|
|
139
|
+
async removeCollection(collection) {
|
|
140
|
+
if (!this.db)
|
|
141
|
+
throw new Error("Database not initialized");
|
|
142
|
+
if (!this.db.objectStoreNames.contains(collection))
|
|
143
|
+
return false;
|
|
144
|
+
await this._changeSchema(db => {
|
|
145
|
+
if (db.objectStoreNames.contains(collection)) {
|
|
146
|
+
db.deleteObjectStore(collection);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
async add(query) {
|
|
152
|
+
if (!this.db)
|
|
153
|
+
throw new Error("Database not initialized");
|
|
154
|
+
await this.ensureCollection(query.collection);
|
|
155
|
+
await addId(query, this);
|
|
156
|
+
const { collection, data } = query;
|
|
157
|
+
const store = await this._getStore(collection, "readwrite");
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
const request = store.put(data);
|
|
160
|
+
request.onerror = () => reject(request.error);
|
|
161
|
+
request.onsuccess = () => resolve(data);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async find(query) {
|
|
165
|
+
if (!this.db)
|
|
166
|
+
throw new Error("Database not initialized");
|
|
167
|
+
await this.ensureCollection(query.collection);
|
|
168
|
+
const entries = await this._getAllEntries(query.collection);
|
|
169
|
+
return entries.map(entry => findObj(query, entry)).filter(Boolean);
|
|
170
|
+
}
|
|
171
|
+
async findOne(query) {
|
|
172
|
+
if (!this.db)
|
|
173
|
+
throw new Error("Database not initialized");
|
|
174
|
+
await this.ensureCollection(query.collection);
|
|
175
|
+
const entries = await this._getAllEntries(query.collection);
|
|
176
|
+
for (const entry of entries) {
|
|
177
|
+
const result = findObj(query, entry);
|
|
178
|
+
if (result)
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
async update(query) {
|
|
184
|
+
if (!this.db)
|
|
185
|
+
throw new Error("Database not initialized");
|
|
186
|
+
await this.ensureCollection(query.collection);
|
|
187
|
+
const store = await this._getStore(query.collection, "readwrite");
|
|
188
|
+
const entries = await new Promise((resolve, reject) => {
|
|
189
|
+
const request = store.getAll();
|
|
190
|
+
request.onerror = () => reject(request.error);
|
|
191
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
192
|
+
});
|
|
193
|
+
const updated = [];
|
|
194
|
+
for (const entry of entries) {
|
|
195
|
+
if (matchObj(query, entry)) {
|
|
196
|
+
const updatedEntry = updateObj(query, entry);
|
|
197
|
+
updated.push(updatedEntry);
|
|
198
|
+
await new Promise((resolve, reject) => {
|
|
199
|
+
const putRequest = store.put(updatedEntry);
|
|
200
|
+
putRequest.onerror = () => reject(putRequest.error);
|
|
201
|
+
putRequest.onsuccess = () => resolve();
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return updated;
|
|
206
|
+
}
|
|
207
|
+
async updateOne(query) {
|
|
208
|
+
if (!this.db)
|
|
209
|
+
throw new Error("Database not initialized");
|
|
210
|
+
await this.ensureCollection(query.collection);
|
|
211
|
+
const store = await this._getStore(query.collection, "readwrite");
|
|
212
|
+
const entries = await new Promise((resolve, reject) => {
|
|
213
|
+
const request = store.getAll();
|
|
214
|
+
request.onerror = () => reject(request.error);
|
|
215
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
216
|
+
});
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
if (matchObj(query, entry)) {
|
|
219
|
+
const updatedEntry = updateObj(query, entry);
|
|
220
|
+
await new Promise((resolve, reject) => {
|
|
221
|
+
const putRequest = store.put(updatedEntry);
|
|
222
|
+
putRequest.onerror = () => reject(putRequest.error);
|
|
223
|
+
putRequest.onsuccess = () => resolve();
|
|
224
|
+
});
|
|
225
|
+
return updatedEntry;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
async remove(query) {
|
|
231
|
+
if (!this.db)
|
|
232
|
+
throw new Error("Database not initialized");
|
|
233
|
+
await this.ensureCollection(query.collection);
|
|
234
|
+
const store = await this._getStore(query.collection, "readwrite");
|
|
235
|
+
const entries = await new Promise((resolve, reject) => {
|
|
236
|
+
const request = store.getAll();
|
|
237
|
+
request.onerror = () => reject(request.error);
|
|
238
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
239
|
+
});
|
|
240
|
+
const removed = [];
|
|
241
|
+
for (const entry of entries) {
|
|
242
|
+
if (matchObj(query, entry)) {
|
|
243
|
+
removed.push(entry);
|
|
244
|
+
await new Promise((resolve, reject) => {
|
|
245
|
+
const deleteRequest = store.delete(entry._id);
|
|
246
|
+
deleteRequest.onerror = () => reject(deleteRequest.error);
|
|
247
|
+
deleteRequest.onsuccess = () => resolve();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return removed;
|
|
252
|
+
}
|
|
253
|
+
async removeOne(query) {
|
|
254
|
+
if (!this.db)
|
|
255
|
+
throw new Error("Database not initialized");
|
|
256
|
+
await this.ensureCollection(query.collection);
|
|
257
|
+
const store = await this._getStore(query.collection, "readwrite");
|
|
258
|
+
const entries = await new Promise((resolve, reject) => {
|
|
259
|
+
const request = store.getAll();
|
|
260
|
+
request.onerror = () => reject(request.error);
|
|
261
|
+
request.onsuccess = () => resolve(request.result || []);
|
|
262
|
+
});
|
|
263
|
+
for (const entry of entries) {
|
|
264
|
+
if (matchObj(query, entry)) {
|
|
265
|
+
await new Promise((resolve, reject) => {
|
|
266
|
+
const deleteRequest = store.delete(entry._id);
|
|
267
|
+
deleteRequest.onerror = () => reject(deleteRequest.error);
|
|
268
|
+
deleteRequest.onsuccess = () => resolve();
|
|
269
|
+
});
|
|
270
|
+
return entry;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
package/dist/storage.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CustomActionsBase } from "@wxn0brp/db-core/base/custom";
|
|
2
2
|
export declare class WebStorageActions extends CustomActionsBase {
|
|
3
3
|
name: string;
|
|
4
|
-
|
|
5
|
-
constructor(name: string,
|
|
4
|
+
_storage: Storage;
|
|
5
|
+
constructor(name: string, _storage?: Storage);
|
|
6
6
|
_getPath(collection: string): string;
|
|
7
7
|
_read(collection: string): any;
|
|
8
8
|
_write(collection: string, data: object[]): void;
|
package/dist/storage.js
CHANGED
|
@@ -2,44 +2,44 @@ import { CustomFileCpu } from "@wxn0brp/db-core";
|
|
|
2
2
|
import { CustomActionsBase } from "@wxn0brp/db-core/base/custom";
|
|
3
3
|
export class WebStorageActions extends CustomActionsBase {
|
|
4
4
|
name;
|
|
5
|
-
|
|
6
|
-
constructor(name,
|
|
5
|
+
_storage;
|
|
6
|
+
constructor(name, _storage = localStorage) {
|
|
7
7
|
super();
|
|
8
8
|
this.name = name;
|
|
9
|
-
this.
|
|
9
|
+
this._storage = _storage;
|
|
10
10
|
this.fileCpu = new CustomFileCpu(this._read.bind(this), this._write.bind(this));
|
|
11
11
|
}
|
|
12
12
|
_getPath(collection) {
|
|
13
13
|
return "vdb_" + this.name + "_" + collection;
|
|
14
14
|
}
|
|
15
15
|
_read(collection) {
|
|
16
|
-
const data = this.
|
|
16
|
+
const data = this._storage.getItem(this._getPath(collection));
|
|
17
17
|
return data ? JSON.parse(data) : [];
|
|
18
18
|
}
|
|
19
19
|
_write(collection, data) {
|
|
20
|
-
this.
|
|
20
|
+
this._storage.setItem(this._getPath(collection), JSON.stringify(data));
|
|
21
21
|
}
|
|
22
22
|
async ensureCollection(collection) {
|
|
23
23
|
const key = this._getPath(collection);
|
|
24
|
-
if (!this.
|
|
25
|
-
this.
|
|
24
|
+
if (!this._storage.getItem(key))
|
|
25
|
+
this._storage.setItem(key, JSON.stringify([]));
|
|
26
26
|
return true;
|
|
27
27
|
}
|
|
28
28
|
async issetCollection(collection) {
|
|
29
|
-
return !!this.
|
|
29
|
+
return !!this._storage.getItem(this._getPath(collection));
|
|
30
30
|
}
|
|
31
31
|
async getCollections() {
|
|
32
32
|
const keys = [];
|
|
33
33
|
const prefix = "vdb_" + this.name + "_";
|
|
34
|
-
for (let i = 0; i < this.
|
|
35
|
-
const key = this.
|
|
34
|
+
for (let i = 0; i < this._storage.length; i++) {
|
|
35
|
+
const key = this._storage.key(i);
|
|
36
36
|
if (key.startsWith(prefix))
|
|
37
37
|
keys.push(key.replace(prefix, ""));
|
|
38
38
|
}
|
|
39
39
|
return keys;
|
|
40
40
|
}
|
|
41
41
|
async removeCollection(collection) {
|
|
42
|
-
this.
|
|
42
|
+
this._storage.removeItem(this._getPath(collection));
|
|
43
43
|
return true;
|
|
44
44
|
}
|
|
45
45
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wxn0brp/db-storage-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.110.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"author": "wxn0brP",
|
|
@@ -18,12 +18,13 @@
|
|
|
18
18
|
"vdb-adapter"
|
|
19
19
|
],
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"@wxn0brp/db-core": "
|
|
21
|
+
"@wxn0brp/db-core": "^0.11.5"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@wxn0brp/
|
|
25
|
-
"
|
|
26
|
-
"
|
|
24
|
+
"@wxn0brp/biome": "*",
|
|
25
|
+
"@wxn0brp/db-core": "^0.11.5",
|
|
26
|
+
"tsc-alias": "^1",
|
|
27
|
+
"typescript": "^7"
|
|
27
28
|
},
|
|
28
29
|
"files": [
|
|
29
30
|
"dist"
|