@incoqnito.io/bajadab 1.1.0

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/dist/basics.js ADDED
@@ -0,0 +1,434 @@
1
+ import { uuidv7, } from "uuidv7";
2
+ import { runMultiReentrantProtected, runReentrantProtected } from "@incoqnito.io/ts-iq-core";
3
+ import { EBArrayDeletionStrategy, EBAutoFlushStrategy, EBAutoIDStrategy, EBDirtyUnloadStrategy, EBDuplicateIDStrategy, EBMemStorageStrategy, } from "./base.js";
4
+ import { canonicalName } from "./utils.js";
5
+ /** Default {@link TGetIDFunction}: reads `v.id`, `undefined` if absent. */
6
+ export const DEFAULT_GET_ID = (v) => ("id" in v) ? v.id : undefined;
7
+ /** Default {@link TSetIDFunction}: assigns to `v.id`. */
8
+ export const DEFAULT_SET_ID = async (v, id) => { v.id = id; };
9
+ var MutexKeys;
10
+ (function (MutexKeys) {
11
+ // because of the spaces this will never be a collection name and as such is safe to use as a mutex key
12
+ MutexKeys["DATABASE"] = " database ";
13
+ })(MutexKeys || (MutexKeys = {}));
14
+ /** {@link IBCollectionConfig} used when a collection is created without an explicit one. */
15
+ export const DEFAULT_COLLECTION_CONFIG = {
16
+ arrayDeletionStrategy: EBArrayDeletionStrategy.IN_PLACE,
17
+ autoIDStrategy: EBAutoIDStrategy.AUTO_ID_UUID,
18
+ duplicateIDStrategy: EBDuplicateIDStrategy.OVERWRITE,
19
+ memStorageStrategy: EBMemStorageStrategy.MAP,
20
+ dirtyUnloadStrategy: EBDirtyUnloadStrategy.FLUSH,
21
+ autoFlushStrategy: EBAutoFlushStrategy.ALWAYS_AUTO_FLUSH,
22
+ };
23
+ /** {@link IBDatabaseConfig} used when `getDatabase()` creates a fresh database. */
24
+ export const DEFAULT_DATABASE_CONFIG = {
25
+ defaultCollectionConfig: DEFAULT_COLLECTION_CONFIG,
26
+ };
27
+ export class BDatabase {
28
+ config;
29
+ collections = new Map();
30
+ io;
31
+ functionRegistry;
32
+ constructor(io, config, functionRegistry) {
33
+ this.config = config ?? DEFAULT_DATABASE_CONFIG;
34
+ this.io = io;
35
+ this.functionRegistry = functionRegistry;
36
+ }
37
+ addCollection(collection) {
38
+ this.collections.set(collection.collectionName, collection);
39
+ }
40
+ async getCollection(collectionName, collectionConfig) {
41
+ return runReentrantProtected(MutexKeys.DATABASE, async () => {
42
+ const cname = canonicalName(collectionName);
43
+ let ret = this.collections.get(cname);
44
+ if (!ret) {
45
+ ret = await this.createCollection(collectionName, collectionConfig);
46
+ }
47
+ return ret;
48
+ });
49
+ }
50
+ async createCollection(collectionName, collectionConfig) {
51
+ return runReentrantProtected(MutexKeys.DATABASE, async () => {
52
+ const cname = canonicalName(collectionName);
53
+ if (this.collections.has(cname)) {
54
+ throw new Error(`cannot create already existing collection ${collectionName}`);
55
+ }
56
+ const id = uuidv7();
57
+ const ret = new BCollection(this, id, collectionName, collectionConfig ?? this.config.defaultCollectionConfig);
58
+ this.addCollection(ret);
59
+ return this.io.createCollection(ret);
60
+ });
61
+ }
62
+ async hasCollection(collectionName) {
63
+ return runReentrantProtected(MutexKeys.DATABASE, async () => {
64
+ return this.collections.has(canonicalName(collectionName));
65
+ });
66
+ }
67
+ async dropCollection(collectionName) {
68
+ const cname = canonicalName(collectionName);
69
+ return runMultiReentrantProtected([MutexKeys.DATABASE, cname], async () => {
70
+ const coll = this.collections.get(cname);
71
+ if (coll) {
72
+ coll.markDropped();
73
+ this.collections.delete(cname);
74
+ return this.io.deleteCollection(cname);
75
+ }
76
+ else {
77
+ throw new Error(`no such collection ${collectionName}`);
78
+ }
79
+ });
80
+ }
81
+ }
82
+ export class BCollection {
83
+ database;
84
+ collectionConfig;
85
+ collectionName;
86
+ collectionID;
87
+ mapData = new Map();
88
+ arrayData = [];
89
+ loaded = false;
90
+ dirty = false;
91
+ dropped = false;
92
+ constructor(database, collectionID, collectionName, collectionConfig) {
93
+ this.database = database;
94
+ this.collectionID = collectionID;
95
+ this.collectionName = canonicalName(collectionName);
96
+ this.collectionConfig = collectionConfig;
97
+ switch (collectionConfig.memStorageStrategy) {
98
+ case EBMemStorageStrategy.MAP:
99
+ // if (!collectionConfig.getID || !collectionConfig.setID) {
100
+ // throw new Error("need id accessors configured when using map mem storage");
101
+ // }
102
+ break;
103
+ default:
104
+ case EBMemStorageStrategy.ARRAY:
105
+ break;
106
+ }
107
+ }
108
+ async checkLoaded() {
109
+ if (!this.loaded) {
110
+ await this.reload();
111
+ }
112
+ }
113
+ async runProtected(fn) {
114
+ return runReentrantProtected(this.collectionName, async () => {
115
+ if (this.dropped) {
116
+ throw new Error(`collection "${this.collectionName}" has been dropped`);
117
+ }
118
+ return fn();
119
+ });
120
+ }
121
+ /**
122
+ * call this only within the proteing mutex
123
+ */
124
+ markDropped() {
125
+ this.dropped = true;
126
+ }
127
+ async get(predicate) {
128
+ return this.runProtected(async () => {
129
+ await this.checkLoaded();
130
+ switch (this.collectionConfig.memStorageStrategy) {
131
+ case EBMemStorageStrategy.MAP:
132
+ return !predicate ?
133
+ this.mapData.values().toArray() :
134
+ this.mapData.values().filter(predicate).toArray();
135
+ default:
136
+ case EBMemStorageStrategy.ARRAY:
137
+ return !predicate ?
138
+ // MARK this may be a bit slow for bigger collections
139
+ [...this.arrayData] :
140
+ this.arrayData.filter(predicate);
141
+ }
142
+ });
143
+ }
144
+ async delete(predicate) {
145
+ return this.runProtected(async () => {
146
+ await this.checkLoaded();
147
+ let ret = 0;
148
+ switch (this.collectionConfig.memStorageStrategy) {
149
+ case EBMemStorageStrategy.MAP:
150
+ for (const [key, value] of this.mapData) {
151
+ if (predicate(value)) {
152
+ ret++;
153
+ this.mapData.delete(key);
154
+ }
155
+ }
156
+ break;
157
+ default:
158
+ case EBMemStorageStrategy.ARRAY:
159
+ switch (this.collectionConfig.arrayDeletionStrategy) {
160
+ case EBArrayDeletionStrategy.IN_PLACE:
161
+ let writeIndex = 0;
162
+ for (let readIndex = 0; readIndex < this.arrayData.length; readIndex++) {
163
+ const item = this.arrayData[readIndex];
164
+ if (!predicate(item)) {
165
+ this.arrayData[writeIndex] = item;
166
+ writeIndex++;
167
+ }
168
+ else {
169
+ ret++;
170
+ }
171
+ }
172
+ this.arrayData.length = writeIndex;
173
+ break;
174
+ default:
175
+ case EBArrayDeletionStrategy.NEW_ARRAY:
176
+ const ol = this.arrayData.length;
177
+ this.arrayData = this.arrayData.filter(v => !predicate(v));
178
+ ret += (ol - this.arrayData.length);
179
+ break;
180
+ }
181
+ break;
182
+ }
183
+ if (ret > 0) {
184
+ await this.doOnDirty();
185
+ }
186
+ return ret;
187
+ });
188
+ }
189
+ async has(predicate) {
190
+ return this.runProtected(async () => {
191
+ await this.checkLoaded();
192
+ switch (this.collectionConfig.memStorageStrategy) {
193
+ case EBMemStorageStrategy.MAP:
194
+ return this.mapData.values().find(predicate) !== undefined;
195
+ default:
196
+ case EBMemStorageStrategy.ARRAY:
197
+ return this.arrayData.find(predicate) !== undefined;
198
+ }
199
+ });
200
+ }
201
+ async getID(v) {
202
+ let getter;
203
+ if (this.collectionConfig.getID) {
204
+ const found = this.database.functionRegistry?.fetch(this.collectionConfig.getID);
205
+ if (!found) {
206
+ throw new Error(`getID function "${this.collectionConfig.getID}" is not registered`);
207
+ }
208
+ getter = found;
209
+ }
210
+ else {
211
+ getter = DEFAULT_GET_ID;
212
+ }
213
+ let id = await getter(v);
214
+ if (!id) {
215
+ switch (this.collectionConfig.autoIDStrategy) {
216
+ case EBAutoIDStrategy.NO_AUTO_ID:
217
+ throw new Error("cannot omit auto-ids and than trying to add a value without an id");
218
+ default:
219
+ case EBAutoIDStrategy.AUTO_ID_UUID:
220
+ id = uuidv7();
221
+ let setter;
222
+ if (this.collectionConfig.setID) {
223
+ const found = this.database.functionRegistry?.fetch(this.collectionConfig.setID);
224
+ if (!found) {
225
+ throw new Error(`setID function "${this.collectionConfig.setID}" is not registered`);
226
+ }
227
+ setter = found;
228
+ }
229
+ else {
230
+ setter = DEFAULT_SET_ID;
231
+ }
232
+ await setter(v, id);
233
+ break;
234
+ }
235
+ }
236
+ return id;
237
+ }
238
+ async add(...vs) {
239
+ return this.runProtected(async () => {
240
+ await this.checkLoaded();
241
+ switch (this.collectionConfig.memStorageStrategy) {
242
+ case EBMemStorageStrategy.MAP:
243
+ let ret = 0;
244
+ for (const v of vs) {
245
+ const id = await this.getID(v);
246
+ if (this.mapData.has(id)) {
247
+ switch (this.collectionConfig.duplicateIDStrategy) {
248
+ case EBDuplicateIDStrategy.ERROR:
249
+ throw new Error(`duplicate id ${id}`);
250
+ case EBDuplicateIDStrategy.IGNORE:
251
+ // ignore the new value
252
+ break;
253
+ default:
254
+ case EBDuplicateIDStrategy.OVERWRITE:
255
+ // replace the new value
256
+ ret++;
257
+ this.mapData.set(id, v);
258
+ break;
259
+ }
260
+ }
261
+ else {
262
+ ret++;
263
+ this.mapData.set(id, v);
264
+ }
265
+ }
266
+ if (ret > 0) {
267
+ await this.doOnDirty();
268
+ }
269
+ return ret;
270
+ default:
271
+ case EBMemStorageStrategy.ARRAY:
272
+ switch (this.collectionConfig.duplicateIDStrategy) {
273
+ case EBDuplicateIDStrategy.ERROR:
274
+ const haveIDs = new Set();
275
+ for (const v of this.arrayData) {
276
+ haveIDs.add(await this.getID(v));
277
+ }
278
+ for (const v of vs) {
279
+ const id = await this.getID(v);
280
+ if (haveIDs.has(id)) {
281
+ throw new Error(`duplicate id ${id}`);
282
+ }
283
+ haveIDs.add(id);
284
+ this.arrayData.push(v);
285
+ }
286
+ break;
287
+ case EBDuplicateIDStrategy.IGNORE:
288
+ const seenIDs = new Set();
289
+ for (const v of this.arrayData) {
290
+ seenIDs.add(await this.getID(v));
291
+ }
292
+ for (const v of vs) {
293
+ const id = await this.getID(v);
294
+ if (!seenIDs.has(id)) {
295
+ seenIDs.add(id);
296
+ this.arrayData.push(v);
297
+ }
298
+ }
299
+ break;
300
+ default:
301
+ case EBDuplicateIDStrategy.OVERWRITE:
302
+ const indexMap = new Map();
303
+ for (let i = 0; i < this.arrayData.length; i++) {
304
+ indexMap.set(await this.getID(this.arrayData[i]), i);
305
+ }
306
+ for (const v of vs) {
307
+ const id = await this.getID(v);
308
+ const existingIndex = indexMap.get(id);
309
+ if (existingIndex !== undefined) {
310
+ this.arrayData[existingIndex] = v;
311
+ }
312
+ else {
313
+ // store new index in indexCache in the case this id appears again
314
+ indexMap.set(id, this.arrayData.length);
315
+ this.arrayData.push(v);
316
+ }
317
+ }
318
+ break;
319
+ }
320
+ if (vs.length > 0) {
321
+ await this.doOnDirty();
322
+ }
323
+ return vs.length;
324
+ }
325
+ });
326
+ }
327
+ async update(predicate, updater) {
328
+ return this.runProtected(async () => {
329
+ await this.checkLoaded();
330
+ let ret = 0;
331
+ switch (this.collectionConfig.memStorageStrategy) {
332
+ case EBMemStorageStrategy.MAP:
333
+ for (const [key, value] of this.mapData) {
334
+ if (predicate(value)) {
335
+ const replacement = await updater(value);
336
+ if (replacement !== undefined) {
337
+ ret++;
338
+ this.mapData.set(key, replacement);
339
+ }
340
+ else {
341
+ throw new Error("updater gave undefined");
342
+ }
343
+ }
344
+ }
345
+ break;
346
+ default:
347
+ case EBMemStorageStrategy.ARRAY:
348
+ for (let i = 0; i < this.arrayData.length; i++) {
349
+ if (predicate(this.arrayData[i])) {
350
+ const replacement = await updater(this.arrayData[i]);
351
+ if (replacement !== undefined) {
352
+ ret++;
353
+ this.arrayData[i] = replacement;
354
+ }
355
+ else {
356
+ throw new Error("updater gave undefined");
357
+ }
358
+ }
359
+ }
360
+ break;
361
+ }
362
+ if (ret > 0) {
363
+ await this.doOnDirty();
364
+ }
365
+ return ret;
366
+ });
367
+ }
368
+ async doOnDirty() {
369
+ this.dirty = true;
370
+ if (this.collectionConfig.autoFlushStrategy == EBAutoFlushStrategy.ALWAYS_AUTO_FLUSH) {
371
+ await this.flush();
372
+ }
373
+ }
374
+ async flush() {
375
+ return this.runProtected(async () => {
376
+ if (this.loaded) {
377
+ switch (this.collectionConfig.memStorageStrategy) {
378
+ case EBMemStorageStrategy.MAP:
379
+ await this.database.io.writeMapData(this.collectionID, this.mapData);
380
+ break;
381
+ default:
382
+ case EBMemStorageStrategy.ARRAY:
383
+ await this.database.io.writeArrayData(this.collectionID, this.arrayData);
384
+ break;
385
+ }
386
+ this.dirty = false;
387
+ }
388
+ });
389
+ }
390
+ async reload() {
391
+ return this.runProtected(async () => {
392
+ switch (this.collectionConfig.memStorageStrategy) {
393
+ case EBMemStorageStrategy.MAP:
394
+ this.mapData = await this.database.io.loadMapData(this.collectionID);
395
+ break;
396
+ default:
397
+ case EBMemStorageStrategy.ARRAY:
398
+ this.arrayData = await this.database.io.loadArrayData(this.collectionID);
399
+ break;
400
+ }
401
+ this.loaded = true;
402
+ this.dirty = false;
403
+ });
404
+ }
405
+ async unload() {
406
+ return this.runProtected(async () => {
407
+ if (this.dirty) {
408
+ switch (this.collectionConfig.dirtyUnloadStrategy) {
409
+ case EBDirtyUnloadStrategy.FLUSH:
410
+ await this.flush();
411
+ break;
412
+ case EBDirtyUnloadStrategy.ERROR:
413
+ throw new Error("cannot unload unwritten collection");
414
+ default:
415
+ case EBDirtyUnloadStrategy.IGNORE:
416
+ // do nothing
417
+ break;
418
+ }
419
+ }
420
+ switch (this.collectionConfig.memStorageStrategy) {
421
+ case EBMemStorageStrategy.MAP:
422
+ this.mapData = new Map();
423
+ break;
424
+ default:
425
+ case EBMemStorageStrategy.ARRAY:
426
+ this.arrayData = [];
427
+ break;
428
+ }
429
+ this.loaded = false;
430
+ this.dirty = false;
431
+ });
432
+ }
433
+ }
434
+ //# sourceMappingURL=basics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basics.js","sourceRoot":"","sources":["../src/main/basics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { IBDatabase, IBDatabaseConfig, IBFunctionRegistry } from "./base.js";
2
+ import { BCollection, BDatabase } from "./basics.js";
3
+ export declare class IODatabase {
4
+ readonly basePath: string;
5
+ private readonly nameIDMap;
6
+ private databaseConfig;
7
+ constructor(basePath: string, databaseConfig: IBDatabaseConfig, nameIDMap?: Map<string, string>);
8
+ private loadCollectionMeta;
9
+ static createOrLoad(basePath: string, functionRegistry?: IBFunctionRegistry): Promise<BDatabase>;
10
+ flush(): Promise<void>;
11
+ createCollection<T = any>(collection: BCollection<T>): Promise<BCollection<T>>;
12
+ deleteCollection(collectionName: string): Promise<void>;
13
+ private loadData;
14
+ loadArrayData<T>(collectionID: string): Promise<T[]>;
15
+ loadMapData<T>(collectionID: string): Promise<Map<string, T>>;
16
+ private writeData;
17
+ writeArrayData<T = any>(collectionID: string, arrayData: T[]): Promise<void>;
18
+ writeMapData<T = any>(collectionID: string, mapData: Map<string, T>): Promise<void>;
19
+ }
20
+ /**
21
+ * Opens the database at `basePath`, creating it if it doesn't exist yet.
22
+ * `functionRegistry` resolves any {@link IBCollectionConfig.getID}/`setID` keys used by its collections.
23
+ */
24
+ export declare function getDatabase(basePath: string, functionRegistry?: IBFunctionRegistry): Promise<IBDatabase>;
package/dist/fileio.js ADDED
@@ -0,0 +1,125 @@
1
+ import { BCollection, BDatabase, DEFAULT_DATABASE_CONFIG, } from "./basics.js";
2
+ import { uuidv7 } from "uuidv7";
3
+ import { access, constants, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ const DB_META_FILE_NAME = "dbmeta.json";
6
+ const DB_COLLECTION_FOLDER_SUFFIX = "_data";
7
+ const DB_COLLECTION_META_FILE_SUFFIX = ".json";
8
+ const DB_COLLECTION_DATA_FILE = "data.json";
9
+ const RESTRICTED_FILE_MODE = 0o600;
10
+ const RESTRICTED_DIR_MODE = 0o700;
11
+ async function atomicWriteFile(targetPath, data) {
12
+ const tempPath = `${targetPath}.${uuidv7()}.tmp`;
13
+ await writeFile(tempPath, data, { encoding: "utf-8", mode: RESTRICTED_FILE_MODE });
14
+ await rename(tempPath, targetPath);
15
+ }
16
+ export class IODatabase {
17
+ basePath;
18
+ nameIDMap;
19
+ databaseConfig;
20
+ constructor(basePath, databaseConfig, nameIDMap) {
21
+ this.basePath = basePath;
22
+ this.databaseConfig = databaseConfig;
23
+ this.nameIDMap = nameIDMap ?? new Map();
24
+ }
25
+ async loadCollectionMeta(id, database) {
26
+ const meta = JSON.parse(await readFile(join(this.basePath, id + DB_COLLECTION_META_FILE_SUFFIX), { encoding: "utf-8" }));
27
+ return new BCollection(database, id, meta.collectionName, meta.collectionConfig);
28
+ }
29
+ static async createOrLoad(basePath, functionRegistry) {
30
+ const metaPath = join(basePath, DB_META_FILE_NAME);
31
+ let data;
32
+ try {
33
+ await access(metaPath, constants.F_OK);
34
+ data = await readFile(metaPath, { encoding: "utf-8" });
35
+ }
36
+ catch (err) {
37
+ if (err.code === 'ENOENT') {
38
+ const iodb = new IODatabase(basePath, DEFAULT_DATABASE_CONFIG);
39
+ return new BDatabase(iodb, DEFAULT_DATABASE_CONFIG, functionRegistry);
40
+ }
41
+ throw err;
42
+ }
43
+ const meta = JSON.parse(data);
44
+ const nameIDMap = new Map(Object.entries(meta.nameIDMap));
45
+ const iodb = new IODatabase(basePath, meta.config, nameIDMap);
46
+ const database = new BDatabase(iodb, meta.config, functionRegistry);
47
+ const collections = await Promise.all(nameIDMap.values()
48
+ .map(id => iodb.loadCollectionMeta(id, database))
49
+ .toArray());
50
+ collections.forEach(c => database.addCollection(c));
51
+ return database;
52
+ }
53
+ async flush() {
54
+ const meta = {
55
+ config: this.databaseConfig,
56
+ nameIDMap: Object.fromEntries(this.nameIDMap),
57
+ };
58
+ const data = JSON.stringify(meta);
59
+ await atomicWriteFile(join(this.basePath, DB_META_FILE_NAME), data);
60
+ }
61
+ async createCollection(collection) {
62
+ const id = collection.collectionID;
63
+ const collectionPath = join(this.basePath, id + DB_COLLECTION_FOLDER_SUFFIX);
64
+ await mkdir(collectionPath, { recursive: true, mode: RESTRICTED_DIR_MODE });
65
+ const meta = {
66
+ collectionConfig: collection.collectionConfig,
67
+ collectionName: collection.collectionName,
68
+ collectionID: id,
69
+ path: collectionPath,
70
+ };
71
+ const data = JSON.stringify(meta);
72
+ await atomicWriteFile(join(this.basePath, id + DB_COLLECTION_META_FILE_SUFFIX), data);
73
+ this.nameIDMap.set(collection.collectionName, id);
74
+ await this.flush();
75
+ return collection;
76
+ }
77
+ async deleteCollection(collectionName) {
78
+ const id = this.nameIDMap.get(collectionName);
79
+ if (!id) {
80
+ throw new Error(`no such database ${collectionName}`);
81
+ }
82
+ const collectionPath = join(this.basePath, id + DB_COLLECTION_FOLDER_SUFFIX);
83
+ await rm(collectionPath, { recursive: true, force: true });
84
+ const metaPath = join(this.basePath, id + DB_COLLECTION_META_FILE_SUFFIX);
85
+ await rm(metaPath, { force: true });
86
+ this.nameIDMap.delete(collectionName);
87
+ }
88
+ async loadData(collectionID) {
89
+ try {
90
+ const data = await readFile(join(this.basePath, collectionID + DB_COLLECTION_FOLDER_SUFFIX, DB_COLLECTION_DATA_FILE), { encoding: "utf-8" });
91
+ return JSON.parse(data);
92
+ }
93
+ catch (err) {
94
+ if (err.code === 'ENOENT') {
95
+ return null;
96
+ }
97
+ throw err;
98
+ }
99
+ }
100
+ async loadArrayData(collectionID) {
101
+ const data = await this.loadData(collectionID);
102
+ return data || [];
103
+ }
104
+ async loadMapData(collectionID) {
105
+ const data = await this.loadData(collectionID);
106
+ return data ? new Map(Object.entries(data)) : new Map();
107
+ }
108
+ async writeData(collectionID, data) {
109
+ return atomicWriteFile(join(this.basePath, collectionID + DB_COLLECTION_FOLDER_SUFFIX, DB_COLLECTION_DATA_FILE), JSON.stringify(data));
110
+ }
111
+ async writeArrayData(collectionID, arrayData) {
112
+ return this.writeData(collectionID, arrayData);
113
+ }
114
+ async writeMapData(collectionID, mapData) {
115
+ return this.writeData(collectionID, Object.fromEntries(mapData));
116
+ }
117
+ }
118
+ /**
119
+ * Opens the database at `basePath`, creating it if it doesn't exist yet.
120
+ * `functionRegistry` resolves any {@link IBCollectionConfig.getID}/`setID` keys used by its collections.
121
+ */
122
+ export async function getDatabase(basePath, functionRegistry) {
123
+ return IODatabase.createOrLoad(basePath, functionRegistry);
124
+ }
125
+ //# sourceMappingURL=fileio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileio.js","sourceRoot":"","sources":["../src/main/fileio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function canonicalName(name?: string): string;
package/dist/utils.js ADDED
@@ -0,0 +1,7 @@
1
+ export function canonicalName(name) {
2
+ if (!name) {
3
+ name = "";
4
+ }
5
+ return name.trim().toLowerCase();
6
+ }
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/main/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAa;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,IAAI,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrC,CAAC"}