@alwatr/nitrobase-engine 7.5.0 → 7.5.4

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [7.5.4](https://github.com/Alwatr/nitrobase/compare/v7.5.3...v7.5.4) (2025-01-12)
7
+
8
+ ### Bug Fixes
9
+
10
+ * **nitrobase:** optional data in newStoreFile_ and throw Error when data not exist for document type ([6d2a173](https://github.com/Alwatr/nitrobase/commit/6d2a173ca4414d6928ef1b703dd0836648eb0787)) by @alimd
11
+ * **nitrobase:** remove initialData parameter from newCollection method ([56cacf0](https://github.com/Alwatr/nitrobase/commit/56cacf0e65e8be2d68f4621eaf4e6d847bf39293)) by @alimd
12
+ * **nitrobase:** required initial data for newDocument ([61f1788](https://github.com/Alwatr/nitrobase/commit/61f178850594ccfc0c1a4ab9429cc2e0438eb11c)) by @alimd
13
+
14
+ ### Code Refactoring
15
+
16
+ * **nitrobase:** bind storeChanged_ method directly instead of using bind in multiple locations ([dba1da6](https://github.com/Alwatr/nitrobase/commit/dba1da6bf095e6984af98d8e6c65c64fcc3fb5af)) by @alimd
17
+
18
+ ### Dependencies update
19
+
20
+ * **deps-dev:** bump the dependencies group across 1 directory with 11 updates ([fdd30a6](https://github.com/Alwatr/nitrobase/commit/fdd30a6639ae7ead4e8dbfaca0295cb2bf0e6649)) by @dependabot[bot]
21
+
6
22
  ## [7.5.0](https://github.com/Alwatr/nitrobase/compare/v7.4.1...v7.5.0) (2024-11-09)
7
23
 
8
24
  ### Code Refactoring
@@ -1,5 +1,5 @@
1
1
  import { CollectionReference, DocumentReference } from '@alwatr/nitrobase-reference';
2
- import { type StoreFileStat, type CollectionContext, type DocumentContext, type StoreFileId, type CollectionItem } from '@alwatr/nitrobase-types';
2
+ import { type StoreFileStat, type StoreFileId, type CollectionItem } from '@alwatr/nitrobase-types';
3
3
  /**
4
4
  * AlwatrNitrobase configuration.
5
5
  */
@@ -79,7 +79,7 @@ export declare class AlwatrNitrobase {
79
79
  * If a document with the same ID already exists, an error is thrown.
80
80
  *
81
81
  * @param stat nitrobase file stat
82
- * @param initialData initial data for the document
82
+ * @param data initial data for the document
83
83
  * @template TDoc document data type
84
84
  * @example
85
85
  * ```typescript
@@ -96,14 +96,12 @@ export declare class AlwatrNitrobase {
96
96
  * );
97
97
  * ```
98
98
  */
99
- newDocument<T extends JsonObject = JsonObject>(stat: Omit<StoreFileStat, 'type'>, initialData?: DocumentContext<T>['data'] | null): void;
99
+ newDocument<TDoc extends JsonObject = JsonObject>(stat: Omit<StoreFileStat, 'type'>, data: TDoc): void;
100
100
  /**
101
101
  * Defines a new collection with the given configuration and initial data.
102
102
  * If a collection with the same ID already exists, an error is thrown.
103
103
  *
104
104
  * @param stat nitrobase file stat
105
- * @param initialData initial data for the collection
106
- * @template TItem collection item data type
107
105
  * @example
108
106
  * ```typescript
109
107
  * await alwatrStore.newCollection<Order>(
@@ -115,15 +113,14 @@ export declare class AlwatrNitrobase {
115
113
  * );
116
114
  * ```
117
115
  */
118
- newCollection<TItem extends JsonObject = JsonObject>(stat: Omit<StoreFileStat, 'type'>, initialData?: CollectionContext<TItem>['data'] | null): void;
116
+ newCollection(stat: Omit<StoreFileStat, 'type'>): void;
119
117
  /**
120
118
  * Defines a AlwatrNitrobaseFile with the given configuration and initial data.
121
119
  *
122
120
  * @param stat nitrobase file stat
123
- * @param initialData initial data for the document
124
- * @template TDoc document data type
121
+ * @param data initial data for the document
125
122
  */
126
- newStoreFile_<T extends JsonObject = JsonObject>(stat: StoreFileStat, initialData?: DocumentContext<T>['data'] | CollectionContext<T>['data'] | null): void;
123
+ newStoreFile_(stat: StoreFileStat, data?: DictionaryOpt): void;
127
124
  /**
128
125
  * Open a document with the given id and create and return a DocumentReference.
129
126
  * If the document not exists or its not a document, an error is thrown.
@@ -1 +1 @@
1
- {"version":3,"file":"alwatr-nitrobase.d.ts","sourceRoot":"","sources":["../src/alwatr-nitrobase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAIL,KAAK,aAAa,EAElB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IA0Cd,QAAQ,CAAC,MAAM,EAAE,qBAAqB;IAzClD;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,SAAuB;IAE9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAMlC;IAEF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAA8D;IAEvF;;;;;;;;;;;OAWG;gBACkB,MAAM,EAAE,qBAAqB;IAOlD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;IAOvC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,EAC3C,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAW,GACpD,IAAI;IAWP;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAa,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EACjD,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EACjC,WAAW,GAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,IAAW,GAC1D,IAAI;IAWP;;;;;;OAMG;IACH,aAAa,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,EAC7C,IAAI,EAAE,aAAa,EACnB,WAAW,GAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAW,GACnF,IAAI;IA6BP;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,IAAI,SAAS,UAAU,EAAE,UAAU,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IA+BtG;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,KAAK,SAAS,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAiC9G;;;;;;;;;OASG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAYvC;;;;;;;;;;;;;OAaG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtD;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;OAKG;YACW,aAAa;IAS3B;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAMtB;;;;;OAKG;cACa,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAevH;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;;;;;;OAUG;IACH,YAAY,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE;CAInE"}
1
+ {"version":3,"file":"alwatr-nitrobase.d.ts","sourceRoot":"","sources":["../src/alwatr-nitrobase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAIL,KAAK,aAAa,EAIlB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IA0Cd,QAAQ,CAAC,MAAM,EAAE,qBAAqB;IAzClD;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,SAAuB;IAE9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAMlC;IAEF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAA8D;IAEvF;;;;;;;;;;;OAWG;gBACkB,MAAM,EAAE,qBAAqB;IAQlD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO;IAOvC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,WAAW,CAAC,IAAI,SAAS,UAAU,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAWtG;;;;;;;;;;;;;;;OAeG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,IAAI;IAUtD;;;;;OAKG;IACH,aAAa,CACX,IAAI,EAAE,aAAa,EACnB,IAAI,CAAC,EAAE,aAAa,GACnB,IAAI;IAiCP;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,IAAI,SAAS,UAAU,EAAE,UAAU,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IA+BtG;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,KAAK,SAAS,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAiC9G;;;;;;;;;OASG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAYvC;;;;;;;;;;;;;OAaG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BtD;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;;;;OAKG;YACW,aAAa;IAS3B;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAMtB;;;;;OAKG;cACa,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAevH;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;;;;;;;;;OAUG;IACH,YAAY,IAAI,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE;CAInE"}
package/dist/main.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /* @alwatr/nitrobase-engine v7.5.0 */
1
+ /* @alwatr/nitrobase-engine v7.5.4 */
2
2
  "use strict";
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -35,7 +35,7 @@ var import_nitrobase_types = require("@alwatr/nitrobase-types");
35
35
 
36
36
  // src/logger.ts
37
37
  var import_nanolib = require("@alwatr/nanolib");
38
- __dev_mode__: import_nanolib.packageTracer.add("@alwatr/nitrobase-engine", "7.5.0");
38
+ __dev_mode__: import_nanolib.packageTracer.add("@alwatr/nitrobase-engine", "7.5.4");
39
39
  var logger = /* @__PURE__ */ (0, import_nanolib.createLogger)("@alwatr/nitrobase-engine");
40
40
 
41
41
  // src/alwatr-nitrobase.ts
@@ -63,6 +63,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
63
63
  logger.logMethodArgs?.("new", config);
64
64
  (_a = this.config).defaultChangeDebounce ?? (_a.defaultChangeDebounce = 40);
65
65
  this.rootDb__ = this.loadRootDb__();
66
+ this.storeChanged_ = this.storeChanged_.bind(this);
66
67
  (0, import_exit_hook.exitHook)(this.exitHook__.bind(this));
67
68
  }
68
69
  /**
@@ -88,7 +89,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
88
89
  * If a document with the same ID already exists, an error is thrown.
89
90
  *
90
91
  * @param stat nitrobase file stat
91
- * @param initialData initial data for the document
92
+ * @param data initial data for the document
92
93
  * @template TDoc document data type
93
94
  * @example
94
95
  * ```typescript
@@ -105,14 +106,14 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
105
106
  * );
106
107
  * ```
107
108
  */
108
- newDocument(stat, initialData = null) {
109
+ newDocument(stat, data) {
109
110
  logger.logMethodArgs?.("newDocument", stat);
110
111
  return this.newStoreFile_(
111
112
  {
112
113
  ...stat,
113
114
  type: import_nitrobase_types.StoreFileType.Document
114
115
  },
115
- initialData
116
+ data
116
117
  );
117
118
  }
118
119
  /**
@@ -120,8 +121,6 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
120
121
  * If a collection with the same ID already exists, an error is thrown.
121
122
  *
122
123
  * @param stat nitrobase file stat
123
- * @param initialData initial data for the collection
124
- * @template TItem collection item data type
125
124
  * @example
126
125
  * ```typescript
127
126
  * await alwatrStore.newCollection<Order>(
@@ -133,31 +132,33 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
133
132
  * );
134
133
  * ```
135
134
  */
136
- newCollection(stat, initialData = null) {
135
+ newCollection(stat) {
137
136
  logger.logMethodArgs?.("newCollection", stat);
138
137
  return this.newStoreFile_(
139
138
  {
140
139
  ...stat,
141
140
  type: import_nitrobase_types.StoreFileType.Collection
142
- },
143
- initialData
141
+ }
144
142
  );
145
143
  }
146
144
  /**
147
145
  * Defines a AlwatrNitrobaseFile with the given configuration and initial data.
148
146
  *
149
147
  * @param stat nitrobase file stat
150
- * @param initialData initial data for the document
151
- * @template TDoc document data type
148
+ * @param data initial data for the document
152
149
  */
153
- newStoreFile_(stat, initialData = null) {
150
+ newStoreFile_(stat, data) {
154
151
  logger.logMethodArgs?.("newStoreFile_", stat);
155
152
  stat.changeDebounce ?? (stat.changeDebounce = this.config.defaultChangeDebounce);
156
153
  let fileStoreRef;
157
154
  if (stat.type === import_nitrobase_types.StoreFileType.Document) {
158
- fileStoreRef = import_nitrobase_reference.DocumentReference.newRefFromData(stat, initialData, this.storeChanged_.bind(this));
155
+ if (data === void 0) {
156
+ logger.accident("newStoreFile_", "document_data_required", stat);
157
+ throw new Error("document_data_required", { cause: stat });
158
+ }
159
+ fileStoreRef = import_nitrobase_reference.DocumentReference.newRefFromData(stat, data, this.storeChanged_);
159
160
  } else if (stat.type === import_nitrobase_types.StoreFileType.Collection) {
160
- fileStoreRef = import_nitrobase_reference.CollectionReference.newRefFromData(stat, initialData, this.storeChanged_.bind(this));
161
+ fileStoreRef = import_nitrobase_reference.CollectionReference.newRefFromData(stat, this.storeChanged_);
161
162
  } else {
162
163
  logger.accident("newStoreFile_", "store_file_type_not_supported", stat);
163
164
  throw new Error("store_file_type_not_supported", { cause: stat });
@@ -208,7 +209,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
208
209
  throw new Error("document_wrong_type", { cause: id });
209
210
  }
210
211
  const context = await this.readContext__(storeStat);
211
- const docRef = import_nitrobase_reference.DocumentReference.newRefFromContext(context, this.storeChanged_.bind(this));
212
+ const docRef = import_nitrobase_reference.DocumentReference.newRefFromContext(context, this.storeChanged_);
212
213
  this.cacheReferences__[id] = docRef;
213
214
  return docRef;
214
215
  }
@@ -250,7 +251,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
250
251
  throw new Error("collection_not_found", { cause: id });
251
252
  }
252
253
  const context = await this.readContext__(storeStat);
253
- const colRef = import_nitrobase_reference.CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this));
254
+ const colRef = import_nitrobase_reference.CollectionReference.newRefFromContext(context, this.storeChanged_);
254
255
  this.cacheReferences__[id] = colRef;
255
256
  return colRef;
256
257
  }
@@ -387,10 +388,10 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
387
388
  throw new Error("store_not_found", { cause: "Nitrobase not initialized" });
388
389
  }
389
390
  logger.banner("Initialize new alwatr-nitrobase");
390
- return import_nitrobase_reference.CollectionReference.newRefFromData(_AlwatrNitrobase.rootDbStat__, null, this.storeChanged_.bind(this));
391
+ return import_nitrobase_reference.CollectionReference.newRefFromData(_AlwatrNitrobase.rootDbStat__, this.storeChanged_);
391
392
  }
392
393
  const context = (0, import_node_fs.readJson)(fullPath, true);
393
- return import_nitrobase_reference.CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this), "root-db");
394
+ return import_nitrobase_reference.CollectionReference.newRefFromContext(context, this.storeChanged_, "root-db");
394
395
  }
395
396
  /**
396
397
  * Save all nitrobase files.
@@ -427,7 +428,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
427
428
  *
428
429
  * Use for nitrobase file format version for check compatibility.
429
430
  */
430
- _AlwatrNitrobase.version = "7.5.0";
431
+ _AlwatrNitrobase.version = "7.5.4";
431
432
  /**
432
433
  * The root nitrobase file stat.
433
434
  */
package/dist/main.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts", "../src/alwatr-nitrobase.ts", "../src/logger.ts"],
4
- "sourcesContent": ["export * from './alwatr-nitrobase.js';\n", "import {delay} from '@alwatr/nanolib';\nimport {exitHook} from '@alwatr/nanolib/exit-hook';\nimport {existsSync, readJson, resolve, unlink, writeJson} from '@alwatr/nanolib/node-fs';\nimport {getStoreId, getStorePath} from '@alwatr/nitrobase-helper';\nimport {CollectionReference, DocumentReference} from '@alwatr/nitrobase-reference';\nimport {\n StoreFileType,\n StoreFileExtension,\n Region,\n type StoreFileStat,\n type StoreFileContext,\n type CollectionContext,\n type DocumentContext,\n type StoreFileId,\n type CollectionItem,\n} from '@alwatr/nitrobase-types';\n\nimport {logger} from './logger.js';\n\n__dev_mode__: logger.logFileModule?.('alwatr-nitrobase');\n\n/**\n * AlwatrNitrobase configuration.\n */\nexport interface AlwatrNitrobaseConfig {\n /**\n * The root path of the storage.\n * This is where the AlwatrNitrobase will nitrobase its data.\n */\n rootPath: string;\n\n /**\n * The save debounce timeout in milliseconds for minimal disk I/O usage.\n * This is used to limit the frequency of disk writes for performance reasons.\n * The recommended value is `40`.\n */\n defaultChangeDebounce?: number;\n\n /**\n * If true, an error will be thrown when trying to read or write to a nitrobase file that is not initialized (new storage).\n * The default value is `false` but highly recommended to set it to `true` in production to prevent data loss.\n */\n errorWhenNotInitialized?: boolean;\n}\n\n/**\n * AlwatrNitrobase engine.\n *\n * It provides methods to read, write, validate, and manage nitrobase files.\n * It also provides methods to interact with `documents` and `collections` in the nitrobase.\n */\nexport class AlwatrNitrobase {\n /**\n * The Alwatr Nitrobase version string.\n *\n * Use for nitrobase file format version for check compatibility.\n */\n static readonly version = __package_version__;\n\n /**\n * The root nitrobase file stat.\n */\n private static readonly rootDbStat__: StoreFileStat = {\n name: '.nitrobase',\n region: Region.Secret,\n type: StoreFileType.Collection,\n extension: StoreFileExtension.Json,\n changeDebounce: 40,\n };\n\n /**\n * `collectionReference` of all `storeFileStat`s.\n * This is the root nitrobase collection.\n */\n private rootDb__;\n\n /**\n * Keep all loaded nitrobase file context loaded in memory.\n */\n private cacheReferences__: DictionaryReq<DocumentReference | CollectionReference> = {};\n\n /**\n * Constructs an AlwatrNitrobase instance with the provided configuration.\n *\n * @param config The configuration of the AlwatrNitrobase engine.\n * @example\n * ```typescript\n * const alwatrStore = new AlwatrNitrobase({\n * rootPath: './db',\n * saveDebounce: 40,\n * });\n * ```\n */\n constructor(readonly config: AlwatrNitrobaseConfig) {\n logger.logMethodArgs?.('new', config);\n this.config.defaultChangeDebounce ??= 40;\n this.rootDb__ = this.loadRootDb__();\n exitHook(this.exitHook__.bind(this));\n }\n\n /**\n * Checks if a nitrobase file with the given ID exists.\n *\n * @param storeId - The ID of the nitrobase file to check.\n * @returns `true` if the nitrobase file exists, `false` otherwise.\n * @example\n * ```typescript\n * if (!alwatrStore.hasStore('user1/profile')) {\n * alwatrStore.defineDocument(...)\n * }\n * ```\n */\n hasStore(storeId: StoreFileId): boolean {\n const id_ = getStoreId(storeId);\n const exists = this.rootDb__.hasItem(id_);\n logger.logMethodFull?.('hasStore', id_, exists);\n return exists;\n }\n\n /**\n * Defines a new document with the given configuration and initial data.\n * If a document with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the document\n * @template TDoc document data type\n * @example\n * ```typescript\n * await alwatrStore.newDocument<Order>(\n * {\n * name: 'profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * },\n * {\n * name: 'Ali',\n * email: 'ali@alwatr.io',\n * }\n * );\n * ```\n */\n newDocument<T extends JsonObject = JsonObject>(\n stat: Omit<StoreFileStat, 'type'>,\n initialData: DocumentContext<T>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newDocument', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Document,\n },\n initialData,\n );\n }\n\n /**\n * Defines a new collection with the given configuration and initial data.\n * If a collection with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the collection\n * @template TItem collection item data type\n * @example\n * ```typescript\n * await alwatrStore.newCollection<Order>(\n * {\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * }\n * );\n * ```\n */\n newCollection<TItem extends JsonObject = JsonObject>(\n stat: Omit<StoreFileStat, 'type'>,\n initialData: CollectionContext<TItem>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newCollection', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Collection,\n },\n initialData,\n );\n }\n\n /**\n * Defines a AlwatrNitrobaseFile with the given configuration and initial data.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the document\n * @template TDoc document data type\n */\n newStoreFile_<T extends JsonObject = JsonObject>(\n stat: StoreFileStat,\n initialData: DocumentContext<T>['data'] | CollectionContext<T>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newStoreFile_', stat);\n\n (stat.changeDebounce as number | undefined) ??= this.config.defaultChangeDebounce;\n\n let fileStoreRef: DocumentReference | CollectionReference;\n if (stat.type === StoreFileType.Document) {\n fileStoreRef = DocumentReference.newRefFromData(stat, initialData as DocumentContext['data'], this.storeChanged_.bind(this));\n }\n else if (stat.type === StoreFileType.Collection) {\n fileStoreRef = CollectionReference.newRefFromData(stat, initialData as CollectionContext['data'], this.storeChanged_.bind(this));\n }\n else {\n logger.accident('newStoreFile_', 'store_file_type_not_supported', stat);\n throw new Error('store_file_type_not_supported', {cause: stat});\n }\n\n if (this.rootDb__.hasItem(fileStoreRef.id)) {\n logger.accident('newStoreFile_', 'store_file_already_defined', stat);\n throw new Error('store_file_already_defined', {cause: stat});\n }\n\n this.rootDb__.addItem(fileStoreRef.id, stat);\n this.cacheReferences__[fileStoreRef.id] = fileStoreRef;\n\n // fileStoreRef.save();\n this.storeChanged_(fileStoreRef);\n }\n\n /**\n * Open a document with the given id and create and return a DocumentReference.\n * If the document not exists or its not a document, an error is thrown.\n *\n * @template TDoc document data type\n * @param documentId document id {@link StoreFileId}\n * @returns document reference {@link DocumentReference}\n * @example\n * ```typescript\n * const userProfile = await alwatrStore.openDocument<User>({\n * name: 'user1/profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * userProfile.update({name: 'ali'});\n * ```\n */\n async openDocument<TDoc extends JsonObject>(documentId: StoreFileId): Promise<DocumentReference<TDoc>> {\n const id = getStoreId(documentId);\n logger.logMethodArgs?.('openDocument', id);\n\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof DocumentReference)) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as DocumentReference<TDoc>;\n }\n\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openDocument', 'document_not_found', id);\n throw new Error('document_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Document) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n\n const context = await this.readContext__<DocumentContext<TDoc>>(storeStat);\n const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_.bind(this));\n this.cacheReferences__[id] = docRef as unknown as DocumentReference;\n return docRef;\n }\n\n /**\n * Open a collection with the given id and create and return a CollectionReference.\n * If the collection not exists or its not a collection, an error is thrown.\n *\n * @template TItem collection item data type\n * @param collectionId collection id {@link StoreFileId}\n * @returns collection reference {@link CollectionReference}\n * @example\n * ```typescript\n * const orders = await alwatrStore.openCollection<Order>({\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * orders.append({name: 'order 1'});\n * ```\n */\n async openCollection<TItem extends JsonObject>(collectionId: StoreFileId): Promise<CollectionReference<TItem>> {\n const id = getStoreId(collectionId);\n logger.logMethodArgs?.('openCollection', id);\n\n // try to get from cache\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof CollectionReference)) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as CollectionReference<TItem>;\n }\n\n // load and create new collection reference\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openCollection', 'collection_not_found', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Collection) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const context = await this.readContext__<CollectionContext<TItem>>(storeStat);\n const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this));\n this.cacheReferences__[id] = colRef as unknown as CollectionReference;\n return colRef;\n }\n\n /**\n * Unloads the nitrobase file with the given id from memory.\n *\n * @param storeId The unique identifier of the nitrobase file. {@link StoreFileId}\n * @example\n * ```typescript\n * alwatrStore.unloadStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // true\n * ```\n */\n unloadStore(storeId: StoreFileId): void {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('unloadStore', id_);\n const ref = this.cacheReferences__[id_];\n if (ref === undefined) return;\n if (ref.hasUnprocessedChanges_ === true) {\n ref.updateDelayed_ = false;\n this.storeChanged_(ref);\n }\n delete this.cacheReferences__[id_];\n }\n\n /**\n * Remove document or collection from nitrobase and delete the file from disk.\n * If the file is not found, an error is thrown.\n * If the file is not unloaded, it will be unloaded first.\n * You don't need to await this method to complete unless you want to make sure the file is deleted on disk.\n *\n * @param storeId The ID of the file to delete. {@link StoreFileId}\n * @returns A Promise that resolves when the file is deleted.\n * @example\n * ```typescript\n * alwatrStore.removeStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // false\n * ```\n */\n async removeStore(storeId: StoreFileId): Promise<void> {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('removeStore', id_);\n if (!this.rootDb__.hasItem(id_)) {\n logger.accident('removeStore', 'document_not_found', id_);\n throw new Error('document_not_found', {cause: id_});\n }\n const ref = this.cacheReferences__[id_];\n if (ref !== undefined) {\n // direct unload to prevent save\n ref.freeze = true;\n ref.updateDelayed_ = false;\n ref.hasUnprocessedChanges_ = false;\n delete this.cacheReferences__[id_]; // unload\n }\n const path = getStorePath(this.rootDb__.getItemData(id_));\n this.rootDb__.removeItem(id_);\n await delay.by(0);\n try {\n await unlink(resolve(this.config.rootPath, path));\n }\n catch (error) {\n logger.error('removeStore', 'remove_file_failed', error, {id: storeId, path});\n }\n }\n\n /**\n * Saves all changes in the nitrobase.\n *\n * @returns A Promise that resolves when all changes are saved.\n * @example\n * ```typescript\n * await alwatrStore.saveAll();\n * ```\n */\n async saveAll(): Promise<void> {\n logger.logMethod?.('saveAll');\n for (const ref of Object.values(this.cacheReferences__)) {\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n ref.updateDelayed_ = false;\n await this.storeChanged_(ref);\n }\n }\n }\n\n /**\n * Reads the context from a given path or StoreFileStat object.\n *\n * @param path The path or StoreFileStat object from which to read the context.\n * @returns A promise that resolves to the context object.\n */\n private async readContext__<T extends StoreFileContext>(path: string | StoreFileStat): Promise<T> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('readContext__', path);\n logger.time?.(`readContext__time(${path})`);\n const context = (await readJson(resolve(this.config.rootPath, path))) as T;\n logger.timeEnd?.(`readContext__time(${path})`);\n return context;\n }\n\n /**\n * Writes the context to the specified path.\n *\n * @template T The type of the context.\n * @param path The path where the context will be written.\n * @param context The context to be written.\n * @param sync Indicates whether the write operation should be synchronous.\n * @returns A promise that resolves when the write operation is complete.\n */\n private writeContext__<T extends StoreFileContext>(path: string | StoreFileStat, context: T): Promise<void> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('writeContext__', path);\n return writeJson(resolve(this.config.rootPath, path), context);\n }\n\n /**\n * Write nitrobase file context.\n *\n * @param from nitrobase file reference\n * @returns A promise that resolves when the write operation is complete.\n */\n protected async storeChanged_<T extends JsonObject>(from: DocumentReference<T> | CollectionReference<T>): Promise<void> {\n logger.logMethodArgs?.('storeChanged__', from.id);\n const rev = from.getStoreMeta().rev;\n try {\n await this.writeContext__(from.path, from.getFullContext_());\n if (rev === from.getStoreMeta().rev) {\n // Context not changed during saving\n from.hasUnprocessedChanges_ = false;\n }\n }\n catch (error) {\n logger.error('storeChanged__', 'write_context_failed', {id: from.id, error});\n }\n }\n\n /**\n * Load storeFilesCollection or create new one.\n */\n private loadRootDb__(): CollectionReference<StoreFileStat> {\n logger.logMethod?.('loadRootDb__');\n const fullPath = resolve(this.config.rootPath, getStorePath(AlwatrNitrobase.rootDbStat__));\n if (!existsSync(fullPath)) {\n if (this.config.errorWhenNotInitialized === true) {\n throw new Error('store_not_found', {cause: 'Nitrobase not initialized'});\n }\n\n logger.banner('Initialize new alwatr-nitrobase');\n return CollectionReference.newRefFromData(AlwatrNitrobase.rootDbStat__, null, this.storeChanged_.bind(this));\n }\n // else\n const context = readJson<CollectionContext<StoreFileStat>>(fullPath, true);\n return CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this), 'root-db');\n }\n\n /**\n * Save all nitrobase files.\n */\n private exitHook__(): void {\n logger.logMethod?.('exitHook__');\n for (const ref of Object.values(this.cacheReferences__)) {\n logger.logProperty?.(`StoreFile.${ref.id}.hasUnprocessedChanges`, ref.hasUnprocessedChanges_);\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n logger.incident?.('exitHook__', 'rescue_unsaved_context', {id: ref.id});\n writeJson(resolve(this.config.rootPath, ref.path), ref.getFullContext_(), true);\n ref.hasUnprocessedChanges_ = false;\n }\n }\n }\n\n /**\n * Get all nitrobase files.\n *\n * @returns all nitrobase files.\n * @example\n * ```typescript\n * const storeList = alwatrStore.getStoreList();\n * for (const nitrobase of storeList) {\n * console.log(nitrobase.meta.id, nitrobase.data);\n * }\n */\n getStoreList(): CollectionItem<Omit<StoreFileStat, 'schemaVer'>>[] {\n logger.logMethod?.('getStoreList');\n return this.rootDb__.values();\n }\n}\n", "import {createLogger, packageTracer} from '@alwatr/nanolib';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport const logger = /* #__PURE__ */ createLogger(__package_name__);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from './alwatr-nitrobase.js';\n", "import {delay} from '@alwatr/nanolib';\nimport {exitHook} from '@alwatr/nanolib/exit-hook';\nimport {existsSync, readJson, resolve, unlink, writeJson} from '@alwatr/nanolib/node-fs';\nimport {getStoreId, getStorePath} from '@alwatr/nitrobase-helper';\nimport {CollectionReference, DocumentReference} from '@alwatr/nitrobase-reference';\nimport {\n StoreFileType,\n StoreFileExtension,\n Region,\n type StoreFileStat,\n type StoreFileContext,\n type CollectionContext,\n type DocumentContext,\n type StoreFileId,\n type CollectionItem,\n} from '@alwatr/nitrobase-types';\n\nimport {logger} from './logger.js';\n\n__dev_mode__: logger.logFileModule?.('alwatr-nitrobase');\n\n/**\n * AlwatrNitrobase configuration.\n */\nexport interface AlwatrNitrobaseConfig {\n /**\n * The root path of the storage.\n * This is where the AlwatrNitrobase will nitrobase its data.\n */\n rootPath: string;\n\n /**\n * The save debounce timeout in milliseconds for minimal disk I/O usage.\n * This is used to limit the frequency of disk writes for performance reasons.\n * The recommended value is `40`.\n */\n defaultChangeDebounce?: number;\n\n /**\n * If true, an error will be thrown when trying to read or write to a nitrobase file that is not initialized (new storage).\n * The default value is `false` but highly recommended to set it to `true` in production to prevent data loss.\n */\n errorWhenNotInitialized?: boolean;\n}\n\n/**\n * AlwatrNitrobase engine.\n *\n * It provides methods to read, write, validate, and manage nitrobase files.\n * It also provides methods to interact with `documents` and `collections` in the nitrobase.\n */\nexport class AlwatrNitrobase {\n /**\n * The Alwatr Nitrobase version string.\n *\n * Use for nitrobase file format version for check compatibility.\n */\n static readonly version = __package_version__;\n\n /**\n * The root nitrobase file stat.\n */\n private static readonly rootDbStat__: StoreFileStat = {\n name: '.nitrobase',\n region: Region.Secret,\n type: StoreFileType.Collection,\n extension: StoreFileExtension.Json,\n changeDebounce: 40,\n };\n\n /**\n * `collectionReference` of all `storeFileStat`s.\n * This is the root nitrobase collection.\n */\n private rootDb__;\n\n /**\n * Keep all loaded nitrobase file context loaded in memory.\n */\n private cacheReferences__: DictionaryReq<DocumentReference | CollectionReference> = {};\n\n /**\n * Constructs an AlwatrNitrobase instance with the provided configuration.\n *\n * @param config The configuration of the AlwatrNitrobase engine.\n * @example\n * ```typescript\n * const alwatrStore = new AlwatrNitrobase({\n * rootPath: './db',\n * saveDebounce: 40,\n * });\n * ```\n */\n constructor(readonly config: AlwatrNitrobaseConfig) {\n logger.logMethodArgs?.('new', config);\n this.config.defaultChangeDebounce ??= 40;\n this.rootDb__ = this.loadRootDb__();\n this.storeChanged_ = this.storeChanged_.bind(this);\n exitHook(this.exitHook__.bind(this));\n }\n\n /**\n * Checks if a nitrobase file with the given ID exists.\n *\n * @param storeId - The ID of the nitrobase file to check.\n * @returns `true` if the nitrobase file exists, `false` otherwise.\n * @example\n * ```typescript\n * if (!alwatrStore.hasStore('user1/profile')) {\n * alwatrStore.defineDocument(...)\n * }\n * ```\n */\n hasStore(storeId: StoreFileId): boolean {\n const id_ = getStoreId(storeId);\n const exists = this.rootDb__.hasItem(id_);\n logger.logMethodFull?.('hasStore', id_, exists);\n return exists;\n }\n\n /**\n * Defines a new document with the given configuration and initial data.\n * If a document with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param data initial data for the document\n * @template TDoc document data type\n * @example\n * ```typescript\n * await alwatrStore.newDocument<Order>(\n * {\n * name: 'profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * },\n * {\n * name: 'Ali',\n * email: 'ali@alwatr.io',\n * }\n * );\n * ```\n */\n newDocument<TDoc extends JsonObject = JsonObject>(stat: Omit<StoreFileStat, 'type'>, data: TDoc): void {\n logger.logMethodArgs?.('newDocument', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Document,\n },\n data,\n );\n }\n\n /**\n * Defines a new collection with the given configuration and initial data.\n * If a collection with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @example\n * ```typescript\n * await alwatrStore.newCollection<Order>(\n * {\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * }\n * );\n * ```\n */\n newCollection(stat: Omit<StoreFileStat, 'type'>): void {\n logger.logMethodArgs?.('newCollection', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Collection,\n }\n );\n }\n\n /**\n * Defines a AlwatrNitrobaseFile with the given configuration and initial data.\n *\n * @param stat nitrobase file stat\n * @param data initial data for the document\n */\n newStoreFile_(\n stat: StoreFileStat,\n data?: DictionaryOpt,\n ): void {\n logger.logMethodArgs?.('newStoreFile_', stat);\n\n (stat.changeDebounce as number | undefined) ??= this.config.defaultChangeDebounce;\n\n let fileStoreRef: DocumentReference | CollectionReference;\n if (stat.type === StoreFileType.Document) {\n if (data === undefined) {\n logger.accident('newStoreFile_', 'document_data_required', stat);\n throw new Error('document_data_required', {cause: stat});\n }\n fileStoreRef = DocumentReference.newRefFromData(stat, data, this.storeChanged_);\n }\n else if (stat.type === StoreFileType.Collection) {\n fileStoreRef = CollectionReference.newRefFromData(stat, this.storeChanged_);\n }\n else {\n logger.accident('newStoreFile_', 'store_file_type_not_supported', stat);\n throw new Error('store_file_type_not_supported', {cause: stat});\n }\n\n if (this.rootDb__.hasItem(fileStoreRef.id)) {\n logger.accident('newStoreFile_', 'store_file_already_defined', stat);\n throw new Error('store_file_already_defined', {cause: stat});\n }\n\n this.rootDb__.addItem(fileStoreRef.id, stat);\n this.cacheReferences__[fileStoreRef.id] = fileStoreRef;\n\n // fileStoreRef.save();\n this.storeChanged_(fileStoreRef);\n }\n\n /**\n * Open a document with the given id and create and return a DocumentReference.\n * If the document not exists or its not a document, an error is thrown.\n *\n * @template TDoc document data type\n * @param documentId document id {@link StoreFileId}\n * @returns document reference {@link DocumentReference}\n * @example\n * ```typescript\n * const userProfile = await alwatrStore.openDocument<User>({\n * name: 'user1/profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * userProfile.update({name: 'ali'});\n * ```\n */\n async openDocument<TDoc extends JsonObject>(documentId: StoreFileId): Promise<DocumentReference<TDoc>> {\n const id = getStoreId(documentId);\n logger.logMethodArgs?.('openDocument', id);\n\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof DocumentReference)) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as DocumentReference<TDoc>;\n }\n\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openDocument', 'document_not_found', id);\n throw new Error('document_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Document) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n\n const context = await this.readContext__<DocumentContext<TDoc>>(storeStat);\n const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_);\n this.cacheReferences__[id] = docRef as unknown as DocumentReference;\n return docRef;\n }\n\n /**\n * Open a collection with the given id and create and return a CollectionReference.\n * If the collection not exists or its not a collection, an error is thrown.\n *\n * @template TItem collection item data type\n * @param collectionId collection id {@link StoreFileId}\n * @returns collection reference {@link CollectionReference}\n * @example\n * ```typescript\n * const orders = await alwatrStore.openCollection<Order>({\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * orders.append({name: 'order 1'});\n * ```\n */\n async openCollection<TItem extends JsonObject>(collectionId: StoreFileId): Promise<CollectionReference<TItem>> {\n const id = getStoreId(collectionId);\n logger.logMethodArgs?.('openCollection', id);\n\n // try to get from cache\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof CollectionReference)) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as CollectionReference<TItem>;\n }\n\n // load and create new collection reference\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openCollection', 'collection_not_found', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Collection) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const context = await this.readContext__<CollectionContext<TItem>>(storeStat);\n const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_);\n this.cacheReferences__[id] = colRef as unknown as CollectionReference;\n return colRef;\n }\n\n /**\n * Unloads the nitrobase file with the given id from memory.\n *\n * @param storeId The unique identifier of the nitrobase file. {@link StoreFileId}\n * @example\n * ```typescript\n * alwatrStore.unloadStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // true\n * ```\n */\n unloadStore(storeId: StoreFileId): void {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('unloadStore', id_);\n const ref = this.cacheReferences__[id_];\n if (ref === undefined) return;\n if (ref.hasUnprocessedChanges_ === true) {\n ref.updateDelayed_ = false;\n this.storeChanged_(ref);\n }\n delete this.cacheReferences__[id_];\n }\n\n /**\n * Remove document or collection from nitrobase and delete the file from disk.\n * If the file is not found, an error is thrown.\n * If the file is not unloaded, it will be unloaded first.\n * You don't need to await this method to complete unless you want to make sure the file is deleted on disk.\n *\n * @param storeId The ID of the file to delete. {@link StoreFileId}\n * @returns A Promise that resolves when the file is deleted.\n * @example\n * ```typescript\n * alwatrStore.removeStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // false\n * ```\n */\n async removeStore(storeId: StoreFileId): Promise<void> {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('removeStore', id_);\n if (!this.rootDb__.hasItem(id_)) {\n logger.accident('removeStore', 'document_not_found', id_);\n throw new Error('document_not_found', {cause: id_});\n }\n const ref = this.cacheReferences__[id_];\n if (ref !== undefined) {\n // direct unload to prevent save\n ref.freeze = true;\n ref.updateDelayed_ = false;\n ref.hasUnprocessedChanges_ = false;\n delete this.cacheReferences__[id_]; // unload\n }\n const path = getStorePath(this.rootDb__.getItemData(id_));\n this.rootDb__.removeItem(id_);\n await delay.by(0);\n try {\n await unlink(resolve(this.config.rootPath, path));\n }\n catch (error) {\n logger.error('removeStore', 'remove_file_failed', error, {id: storeId, path});\n }\n }\n\n /**\n * Saves all changes in the nitrobase.\n *\n * @returns A Promise that resolves when all changes are saved.\n * @example\n * ```typescript\n * await alwatrStore.saveAll();\n * ```\n */\n async saveAll(): Promise<void> {\n logger.logMethod?.('saveAll');\n for (const ref of Object.values(this.cacheReferences__)) {\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n ref.updateDelayed_ = false;\n await this.storeChanged_(ref);\n }\n }\n }\n\n /**\n * Reads the context from a given path or StoreFileStat object.\n *\n * @param path The path or StoreFileStat object from which to read the context.\n * @returns A promise that resolves to the context object.\n */\n private async readContext__<T extends StoreFileContext>(path: string | StoreFileStat): Promise<T> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('readContext__', path);\n logger.time?.(`readContext__time(${path})`);\n const context = (await readJson(resolve(this.config.rootPath, path))) as T;\n logger.timeEnd?.(`readContext__time(${path})`);\n return context;\n }\n\n /**\n * Writes the context to the specified path.\n *\n * @template T The type of the context.\n * @param path The path where the context will be written.\n * @param context The context to be written.\n * @param sync Indicates whether the write operation should be synchronous.\n * @returns A promise that resolves when the write operation is complete.\n */\n private writeContext__<T extends StoreFileContext>(path: string | StoreFileStat, context: T): Promise<void> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('writeContext__', path);\n return writeJson(resolve(this.config.rootPath, path), context);\n }\n\n /**\n * Write nitrobase file context.\n *\n * @param from nitrobase file reference\n * @returns A promise that resolves when the write operation is complete.\n */\n protected async storeChanged_<T extends JsonObject>(from: DocumentReference<T> | CollectionReference<T>): Promise<void> {\n logger.logMethodArgs?.('storeChanged__', from.id);\n const rev = from.getStoreMeta().rev;\n try {\n await this.writeContext__(from.path, from.getFullContext_());\n if (rev === from.getStoreMeta().rev) {\n // Context not changed during saving\n from.hasUnprocessedChanges_ = false;\n }\n }\n catch (error) {\n logger.error('storeChanged__', 'write_context_failed', {id: from.id, error});\n }\n }\n\n /**\n * Load storeFilesCollection or create new one.\n */\n private loadRootDb__(): CollectionReference<StoreFileStat> {\n logger.logMethod?.('loadRootDb__');\n const fullPath = resolve(this.config.rootPath, getStorePath(AlwatrNitrobase.rootDbStat__));\n if (!existsSync(fullPath)) {\n if (this.config.errorWhenNotInitialized === true) {\n throw new Error('store_not_found', {cause: 'Nitrobase not initialized'});\n }\n\n logger.banner('Initialize new alwatr-nitrobase');\n return CollectionReference.newRefFromData(AlwatrNitrobase.rootDbStat__, this.storeChanged_);\n }\n // else\n const context = readJson<CollectionContext<StoreFileStat>>(fullPath, true);\n return CollectionReference.newRefFromContext(context, this.storeChanged_, 'root-db');\n }\n\n /**\n * Save all nitrobase files.\n */\n private exitHook__(): void {\n logger.logMethod?.('exitHook__');\n for (const ref of Object.values(this.cacheReferences__)) {\n logger.logProperty?.(`StoreFile.${ref.id}.hasUnprocessedChanges`, ref.hasUnprocessedChanges_);\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n logger.incident?.('exitHook__', 'rescue_unsaved_context', {id: ref.id});\n writeJson(resolve(this.config.rootPath, ref.path), ref.getFullContext_(), true);\n ref.hasUnprocessedChanges_ = false;\n }\n }\n }\n\n /**\n * Get all nitrobase files.\n *\n * @returns all nitrobase files.\n * @example\n * ```typescript\n * const storeList = alwatrStore.getStoreList();\n * for (const nitrobase of storeList) {\n * console.log(nitrobase.meta.id, nitrobase.data);\n * }\n */\n getStoreList(): CollectionItem<Omit<StoreFileStat, 'schemaVer'>>[] {\n logger.logMethod?.('getStoreList');\n return this.rootDb__.values();\n }\n}\n", "import {createLogger, packageTracer} from '@alwatr/nanolib';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport const logger = /* #__PURE__ */ createLogger(__package_name__);\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_nanolib"]
7
7
  }
package/dist/main.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /* @alwatr/nitrobase-engine v7.5.0 */
1
+ /* @alwatr/nitrobase-engine v7.5.4 */
2
2
 
3
3
  // src/alwatr-nitrobase.ts
4
4
  import { delay } from "@alwatr/nanolib";
@@ -14,7 +14,7 @@ import {
14
14
 
15
15
  // src/logger.ts
16
16
  import { createLogger, packageTracer } from "@alwatr/nanolib";
17
- __dev_mode__: packageTracer.add("@alwatr/nitrobase-engine", "7.5.0");
17
+ __dev_mode__: packageTracer.add("@alwatr/nitrobase-engine", "7.5.4");
18
18
  var logger = /* @__PURE__ */ createLogger("@alwatr/nitrobase-engine");
19
19
 
20
20
  // src/alwatr-nitrobase.ts
@@ -42,6 +42,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
42
42
  logger.logMethodArgs?.("new", config);
43
43
  (_a = this.config).defaultChangeDebounce ?? (_a.defaultChangeDebounce = 40);
44
44
  this.rootDb__ = this.loadRootDb__();
45
+ this.storeChanged_ = this.storeChanged_.bind(this);
45
46
  exitHook(this.exitHook__.bind(this));
46
47
  }
47
48
  /**
@@ -67,7 +68,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
67
68
  * If a document with the same ID already exists, an error is thrown.
68
69
  *
69
70
  * @param stat nitrobase file stat
70
- * @param initialData initial data for the document
71
+ * @param data initial data for the document
71
72
  * @template TDoc document data type
72
73
  * @example
73
74
  * ```typescript
@@ -84,14 +85,14 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
84
85
  * );
85
86
  * ```
86
87
  */
87
- newDocument(stat, initialData = null) {
88
+ newDocument(stat, data) {
88
89
  logger.logMethodArgs?.("newDocument", stat);
89
90
  return this.newStoreFile_(
90
91
  {
91
92
  ...stat,
92
93
  type: StoreFileType.Document
93
94
  },
94
- initialData
95
+ data
95
96
  );
96
97
  }
97
98
  /**
@@ -99,8 +100,6 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
99
100
  * If a collection with the same ID already exists, an error is thrown.
100
101
  *
101
102
  * @param stat nitrobase file stat
102
- * @param initialData initial data for the collection
103
- * @template TItem collection item data type
104
103
  * @example
105
104
  * ```typescript
106
105
  * await alwatrStore.newCollection<Order>(
@@ -112,31 +111,33 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
112
111
  * );
113
112
  * ```
114
113
  */
115
- newCollection(stat, initialData = null) {
114
+ newCollection(stat) {
116
115
  logger.logMethodArgs?.("newCollection", stat);
117
116
  return this.newStoreFile_(
118
117
  {
119
118
  ...stat,
120
119
  type: StoreFileType.Collection
121
- },
122
- initialData
120
+ }
123
121
  );
124
122
  }
125
123
  /**
126
124
  * Defines a AlwatrNitrobaseFile with the given configuration and initial data.
127
125
  *
128
126
  * @param stat nitrobase file stat
129
- * @param initialData initial data for the document
130
- * @template TDoc document data type
127
+ * @param data initial data for the document
131
128
  */
132
- newStoreFile_(stat, initialData = null) {
129
+ newStoreFile_(stat, data) {
133
130
  logger.logMethodArgs?.("newStoreFile_", stat);
134
131
  stat.changeDebounce ?? (stat.changeDebounce = this.config.defaultChangeDebounce);
135
132
  let fileStoreRef;
136
133
  if (stat.type === StoreFileType.Document) {
137
- fileStoreRef = DocumentReference.newRefFromData(stat, initialData, this.storeChanged_.bind(this));
134
+ if (data === void 0) {
135
+ logger.accident("newStoreFile_", "document_data_required", stat);
136
+ throw new Error("document_data_required", { cause: stat });
137
+ }
138
+ fileStoreRef = DocumentReference.newRefFromData(stat, data, this.storeChanged_);
138
139
  } else if (stat.type === StoreFileType.Collection) {
139
- fileStoreRef = CollectionReference.newRefFromData(stat, initialData, this.storeChanged_.bind(this));
140
+ fileStoreRef = CollectionReference.newRefFromData(stat, this.storeChanged_);
140
141
  } else {
141
142
  logger.accident("newStoreFile_", "store_file_type_not_supported", stat);
142
143
  throw new Error("store_file_type_not_supported", { cause: stat });
@@ -187,7 +188,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
187
188
  throw new Error("document_wrong_type", { cause: id });
188
189
  }
189
190
  const context = await this.readContext__(storeStat);
190
- const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_.bind(this));
191
+ const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_);
191
192
  this.cacheReferences__[id] = docRef;
192
193
  return docRef;
193
194
  }
@@ -229,7 +230,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
229
230
  throw new Error("collection_not_found", { cause: id });
230
231
  }
231
232
  const context = await this.readContext__(storeStat);
232
- const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this));
233
+ const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_);
233
234
  this.cacheReferences__[id] = colRef;
234
235
  return colRef;
235
236
  }
@@ -366,10 +367,10 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
366
367
  throw new Error("store_not_found", { cause: "Nitrobase not initialized" });
367
368
  }
368
369
  logger.banner("Initialize new alwatr-nitrobase");
369
- return CollectionReference.newRefFromData(_AlwatrNitrobase.rootDbStat__, null, this.storeChanged_.bind(this));
370
+ return CollectionReference.newRefFromData(_AlwatrNitrobase.rootDbStat__, this.storeChanged_);
370
371
  }
371
372
  const context = readJson(fullPath, true);
372
- return CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this), "root-db");
373
+ return CollectionReference.newRefFromContext(context, this.storeChanged_, "root-db");
373
374
  }
374
375
  /**
375
376
  * Save all nitrobase files.
@@ -406,7 +407,7 @@ var _AlwatrNitrobase = class _AlwatrNitrobase {
406
407
  *
407
408
  * Use for nitrobase file format version for check compatibility.
408
409
  */
409
- _AlwatrNitrobase.version = "7.5.0";
410
+ _AlwatrNitrobase.version = "7.5.4";
410
411
  /**
411
412
  * The root nitrobase file stat.
412
413
  */
package/dist/main.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/alwatr-nitrobase.ts", "../src/logger.ts"],
4
- "sourcesContent": ["import {delay} from '@alwatr/nanolib';\nimport {exitHook} from '@alwatr/nanolib/exit-hook';\nimport {existsSync, readJson, resolve, unlink, writeJson} from '@alwatr/nanolib/node-fs';\nimport {getStoreId, getStorePath} from '@alwatr/nitrobase-helper';\nimport {CollectionReference, DocumentReference} from '@alwatr/nitrobase-reference';\nimport {\n StoreFileType,\n StoreFileExtension,\n Region,\n type StoreFileStat,\n type StoreFileContext,\n type CollectionContext,\n type DocumentContext,\n type StoreFileId,\n type CollectionItem,\n} from '@alwatr/nitrobase-types';\n\nimport {logger} from './logger.js';\n\n__dev_mode__: logger.logFileModule?.('alwatr-nitrobase');\n\n/**\n * AlwatrNitrobase configuration.\n */\nexport interface AlwatrNitrobaseConfig {\n /**\n * The root path of the storage.\n * This is where the AlwatrNitrobase will nitrobase its data.\n */\n rootPath: string;\n\n /**\n * The save debounce timeout in milliseconds for minimal disk I/O usage.\n * This is used to limit the frequency of disk writes for performance reasons.\n * The recommended value is `40`.\n */\n defaultChangeDebounce?: number;\n\n /**\n * If true, an error will be thrown when trying to read or write to a nitrobase file that is not initialized (new storage).\n * The default value is `false` but highly recommended to set it to `true` in production to prevent data loss.\n */\n errorWhenNotInitialized?: boolean;\n}\n\n/**\n * AlwatrNitrobase engine.\n *\n * It provides methods to read, write, validate, and manage nitrobase files.\n * It also provides methods to interact with `documents` and `collections` in the nitrobase.\n */\nexport class AlwatrNitrobase {\n /**\n * The Alwatr Nitrobase version string.\n *\n * Use for nitrobase file format version for check compatibility.\n */\n static readonly version = __package_version__;\n\n /**\n * The root nitrobase file stat.\n */\n private static readonly rootDbStat__: StoreFileStat = {\n name: '.nitrobase',\n region: Region.Secret,\n type: StoreFileType.Collection,\n extension: StoreFileExtension.Json,\n changeDebounce: 40,\n };\n\n /**\n * `collectionReference` of all `storeFileStat`s.\n * This is the root nitrobase collection.\n */\n private rootDb__;\n\n /**\n * Keep all loaded nitrobase file context loaded in memory.\n */\n private cacheReferences__: DictionaryReq<DocumentReference | CollectionReference> = {};\n\n /**\n * Constructs an AlwatrNitrobase instance with the provided configuration.\n *\n * @param config The configuration of the AlwatrNitrobase engine.\n * @example\n * ```typescript\n * const alwatrStore = new AlwatrNitrobase({\n * rootPath: './db',\n * saveDebounce: 40,\n * });\n * ```\n */\n constructor(readonly config: AlwatrNitrobaseConfig) {\n logger.logMethodArgs?.('new', config);\n this.config.defaultChangeDebounce ??= 40;\n this.rootDb__ = this.loadRootDb__();\n exitHook(this.exitHook__.bind(this));\n }\n\n /**\n * Checks if a nitrobase file with the given ID exists.\n *\n * @param storeId - The ID of the nitrobase file to check.\n * @returns `true` if the nitrobase file exists, `false` otherwise.\n * @example\n * ```typescript\n * if (!alwatrStore.hasStore('user1/profile')) {\n * alwatrStore.defineDocument(...)\n * }\n * ```\n */\n hasStore(storeId: StoreFileId): boolean {\n const id_ = getStoreId(storeId);\n const exists = this.rootDb__.hasItem(id_);\n logger.logMethodFull?.('hasStore', id_, exists);\n return exists;\n }\n\n /**\n * Defines a new document with the given configuration and initial data.\n * If a document with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the document\n * @template TDoc document data type\n * @example\n * ```typescript\n * await alwatrStore.newDocument<Order>(\n * {\n * name: 'profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * },\n * {\n * name: 'Ali',\n * email: 'ali@alwatr.io',\n * }\n * );\n * ```\n */\n newDocument<T extends JsonObject = JsonObject>(\n stat: Omit<StoreFileStat, 'type'>,\n initialData: DocumentContext<T>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newDocument', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Document,\n },\n initialData,\n );\n }\n\n /**\n * Defines a new collection with the given configuration and initial data.\n * If a collection with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the collection\n * @template TItem collection item data type\n * @example\n * ```typescript\n * await alwatrStore.newCollection<Order>(\n * {\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * }\n * );\n * ```\n */\n newCollection<TItem extends JsonObject = JsonObject>(\n stat: Omit<StoreFileStat, 'type'>,\n initialData: CollectionContext<TItem>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newCollection', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Collection,\n },\n initialData,\n );\n }\n\n /**\n * Defines a AlwatrNitrobaseFile with the given configuration and initial data.\n *\n * @param stat nitrobase file stat\n * @param initialData initial data for the document\n * @template TDoc document data type\n */\n newStoreFile_<T extends JsonObject = JsonObject>(\n stat: StoreFileStat,\n initialData: DocumentContext<T>['data'] | CollectionContext<T>['data'] | null = null,\n ): void {\n logger.logMethodArgs?.('newStoreFile_', stat);\n\n (stat.changeDebounce as number | undefined) ??= this.config.defaultChangeDebounce;\n\n let fileStoreRef: DocumentReference | CollectionReference;\n if (stat.type === StoreFileType.Document) {\n fileStoreRef = DocumentReference.newRefFromData(stat, initialData as DocumentContext['data'], this.storeChanged_.bind(this));\n }\n else if (stat.type === StoreFileType.Collection) {\n fileStoreRef = CollectionReference.newRefFromData(stat, initialData as CollectionContext['data'], this.storeChanged_.bind(this));\n }\n else {\n logger.accident('newStoreFile_', 'store_file_type_not_supported', stat);\n throw new Error('store_file_type_not_supported', {cause: stat});\n }\n\n if (this.rootDb__.hasItem(fileStoreRef.id)) {\n logger.accident('newStoreFile_', 'store_file_already_defined', stat);\n throw new Error('store_file_already_defined', {cause: stat});\n }\n\n this.rootDb__.addItem(fileStoreRef.id, stat);\n this.cacheReferences__[fileStoreRef.id] = fileStoreRef;\n\n // fileStoreRef.save();\n this.storeChanged_(fileStoreRef);\n }\n\n /**\n * Open a document with the given id and create and return a DocumentReference.\n * If the document not exists or its not a document, an error is thrown.\n *\n * @template TDoc document data type\n * @param documentId document id {@link StoreFileId}\n * @returns document reference {@link DocumentReference}\n * @example\n * ```typescript\n * const userProfile = await alwatrStore.openDocument<User>({\n * name: 'user1/profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * userProfile.update({name: 'ali'});\n * ```\n */\n async openDocument<TDoc extends JsonObject>(documentId: StoreFileId): Promise<DocumentReference<TDoc>> {\n const id = getStoreId(documentId);\n logger.logMethodArgs?.('openDocument', id);\n\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof DocumentReference)) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as DocumentReference<TDoc>;\n }\n\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openDocument', 'document_not_found', id);\n throw new Error('document_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Document) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n\n const context = await this.readContext__<DocumentContext<TDoc>>(storeStat);\n const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_.bind(this));\n this.cacheReferences__[id] = docRef as unknown as DocumentReference;\n return docRef;\n }\n\n /**\n * Open a collection with the given id and create and return a CollectionReference.\n * If the collection not exists or its not a collection, an error is thrown.\n *\n * @template TItem collection item data type\n * @param collectionId collection id {@link StoreFileId}\n * @returns collection reference {@link CollectionReference}\n * @example\n * ```typescript\n * const orders = await alwatrStore.openCollection<Order>({\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * orders.append({name: 'order 1'});\n * ```\n */\n async openCollection<TItem extends JsonObject>(collectionId: StoreFileId): Promise<CollectionReference<TItem>> {\n const id = getStoreId(collectionId);\n logger.logMethodArgs?.('openCollection', id);\n\n // try to get from cache\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof CollectionReference)) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as CollectionReference<TItem>;\n }\n\n // load and create new collection reference\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openCollection', 'collection_not_found', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Collection) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const context = await this.readContext__<CollectionContext<TItem>>(storeStat);\n const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this));\n this.cacheReferences__[id] = colRef as unknown as CollectionReference;\n return colRef;\n }\n\n /**\n * Unloads the nitrobase file with the given id from memory.\n *\n * @param storeId The unique identifier of the nitrobase file. {@link StoreFileId}\n * @example\n * ```typescript\n * alwatrStore.unloadStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // true\n * ```\n */\n unloadStore(storeId: StoreFileId): void {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('unloadStore', id_);\n const ref = this.cacheReferences__[id_];\n if (ref === undefined) return;\n if (ref.hasUnprocessedChanges_ === true) {\n ref.updateDelayed_ = false;\n this.storeChanged_(ref);\n }\n delete this.cacheReferences__[id_];\n }\n\n /**\n * Remove document or collection from nitrobase and delete the file from disk.\n * If the file is not found, an error is thrown.\n * If the file is not unloaded, it will be unloaded first.\n * You don't need to await this method to complete unless you want to make sure the file is deleted on disk.\n *\n * @param storeId The ID of the file to delete. {@link StoreFileId}\n * @returns A Promise that resolves when the file is deleted.\n * @example\n * ```typescript\n * alwatrStore.removeStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // false\n * ```\n */\n async removeStore(storeId: StoreFileId): Promise<void> {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('removeStore', id_);\n if (!this.rootDb__.hasItem(id_)) {\n logger.accident('removeStore', 'document_not_found', id_);\n throw new Error('document_not_found', {cause: id_});\n }\n const ref = this.cacheReferences__[id_];\n if (ref !== undefined) {\n // direct unload to prevent save\n ref.freeze = true;\n ref.updateDelayed_ = false;\n ref.hasUnprocessedChanges_ = false;\n delete this.cacheReferences__[id_]; // unload\n }\n const path = getStorePath(this.rootDb__.getItemData(id_));\n this.rootDb__.removeItem(id_);\n await delay.by(0);\n try {\n await unlink(resolve(this.config.rootPath, path));\n }\n catch (error) {\n logger.error('removeStore', 'remove_file_failed', error, {id: storeId, path});\n }\n }\n\n /**\n * Saves all changes in the nitrobase.\n *\n * @returns A Promise that resolves when all changes are saved.\n * @example\n * ```typescript\n * await alwatrStore.saveAll();\n * ```\n */\n async saveAll(): Promise<void> {\n logger.logMethod?.('saveAll');\n for (const ref of Object.values(this.cacheReferences__)) {\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n ref.updateDelayed_ = false;\n await this.storeChanged_(ref);\n }\n }\n }\n\n /**\n * Reads the context from a given path or StoreFileStat object.\n *\n * @param path The path or StoreFileStat object from which to read the context.\n * @returns A promise that resolves to the context object.\n */\n private async readContext__<T extends StoreFileContext>(path: string | StoreFileStat): Promise<T> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('readContext__', path);\n logger.time?.(`readContext__time(${path})`);\n const context = (await readJson(resolve(this.config.rootPath, path))) as T;\n logger.timeEnd?.(`readContext__time(${path})`);\n return context;\n }\n\n /**\n * Writes the context to the specified path.\n *\n * @template T The type of the context.\n * @param path The path where the context will be written.\n * @param context The context to be written.\n * @param sync Indicates whether the write operation should be synchronous.\n * @returns A promise that resolves when the write operation is complete.\n */\n private writeContext__<T extends StoreFileContext>(path: string | StoreFileStat, context: T): Promise<void> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('writeContext__', path);\n return writeJson(resolve(this.config.rootPath, path), context);\n }\n\n /**\n * Write nitrobase file context.\n *\n * @param from nitrobase file reference\n * @returns A promise that resolves when the write operation is complete.\n */\n protected async storeChanged_<T extends JsonObject>(from: DocumentReference<T> | CollectionReference<T>): Promise<void> {\n logger.logMethodArgs?.('storeChanged__', from.id);\n const rev = from.getStoreMeta().rev;\n try {\n await this.writeContext__(from.path, from.getFullContext_());\n if (rev === from.getStoreMeta().rev) {\n // Context not changed during saving\n from.hasUnprocessedChanges_ = false;\n }\n }\n catch (error) {\n logger.error('storeChanged__', 'write_context_failed', {id: from.id, error});\n }\n }\n\n /**\n * Load storeFilesCollection or create new one.\n */\n private loadRootDb__(): CollectionReference<StoreFileStat> {\n logger.logMethod?.('loadRootDb__');\n const fullPath = resolve(this.config.rootPath, getStorePath(AlwatrNitrobase.rootDbStat__));\n if (!existsSync(fullPath)) {\n if (this.config.errorWhenNotInitialized === true) {\n throw new Error('store_not_found', {cause: 'Nitrobase not initialized'});\n }\n\n logger.banner('Initialize new alwatr-nitrobase');\n return CollectionReference.newRefFromData(AlwatrNitrobase.rootDbStat__, null, this.storeChanged_.bind(this));\n }\n // else\n const context = readJson<CollectionContext<StoreFileStat>>(fullPath, true);\n return CollectionReference.newRefFromContext(context, this.storeChanged_.bind(this), 'root-db');\n }\n\n /**\n * Save all nitrobase files.\n */\n private exitHook__(): void {\n logger.logMethod?.('exitHook__');\n for (const ref of Object.values(this.cacheReferences__)) {\n logger.logProperty?.(`StoreFile.${ref.id}.hasUnprocessedChanges`, ref.hasUnprocessedChanges_);\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n logger.incident?.('exitHook__', 'rescue_unsaved_context', {id: ref.id});\n writeJson(resolve(this.config.rootPath, ref.path), ref.getFullContext_(), true);\n ref.hasUnprocessedChanges_ = false;\n }\n }\n }\n\n /**\n * Get all nitrobase files.\n *\n * @returns all nitrobase files.\n * @example\n * ```typescript\n * const storeList = alwatrStore.getStoreList();\n * for (const nitrobase of storeList) {\n * console.log(nitrobase.meta.id, nitrobase.data);\n * }\n */\n getStoreList(): CollectionItem<Omit<StoreFileStat, 'schemaVer'>>[] {\n logger.logMethod?.('getStoreList');\n return this.rootDb__.values();\n }\n}\n", "import {createLogger, packageTracer} from '@alwatr/nanolib';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport const logger = /* #__PURE__ */ createLogger(__package_name__);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {delay} from '@alwatr/nanolib';\nimport {exitHook} from '@alwatr/nanolib/exit-hook';\nimport {existsSync, readJson, resolve, unlink, writeJson} from '@alwatr/nanolib/node-fs';\nimport {getStoreId, getStorePath} from '@alwatr/nitrobase-helper';\nimport {CollectionReference, DocumentReference} from '@alwatr/nitrobase-reference';\nimport {\n StoreFileType,\n StoreFileExtension,\n Region,\n type StoreFileStat,\n type StoreFileContext,\n type CollectionContext,\n type DocumentContext,\n type StoreFileId,\n type CollectionItem,\n} from '@alwatr/nitrobase-types';\n\nimport {logger} from './logger.js';\n\n__dev_mode__: logger.logFileModule?.('alwatr-nitrobase');\n\n/**\n * AlwatrNitrobase configuration.\n */\nexport interface AlwatrNitrobaseConfig {\n /**\n * The root path of the storage.\n * This is where the AlwatrNitrobase will nitrobase its data.\n */\n rootPath: string;\n\n /**\n * The save debounce timeout in milliseconds for minimal disk I/O usage.\n * This is used to limit the frequency of disk writes for performance reasons.\n * The recommended value is `40`.\n */\n defaultChangeDebounce?: number;\n\n /**\n * If true, an error will be thrown when trying to read or write to a nitrobase file that is not initialized (new storage).\n * The default value is `false` but highly recommended to set it to `true` in production to prevent data loss.\n */\n errorWhenNotInitialized?: boolean;\n}\n\n/**\n * AlwatrNitrobase engine.\n *\n * It provides methods to read, write, validate, and manage nitrobase files.\n * It also provides methods to interact with `documents` and `collections` in the nitrobase.\n */\nexport class AlwatrNitrobase {\n /**\n * The Alwatr Nitrobase version string.\n *\n * Use for nitrobase file format version for check compatibility.\n */\n static readonly version = __package_version__;\n\n /**\n * The root nitrobase file stat.\n */\n private static readonly rootDbStat__: StoreFileStat = {\n name: '.nitrobase',\n region: Region.Secret,\n type: StoreFileType.Collection,\n extension: StoreFileExtension.Json,\n changeDebounce: 40,\n };\n\n /**\n * `collectionReference` of all `storeFileStat`s.\n * This is the root nitrobase collection.\n */\n private rootDb__;\n\n /**\n * Keep all loaded nitrobase file context loaded in memory.\n */\n private cacheReferences__: DictionaryReq<DocumentReference | CollectionReference> = {};\n\n /**\n * Constructs an AlwatrNitrobase instance with the provided configuration.\n *\n * @param config The configuration of the AlwatrNitrobase engine.\n * @example\n * ```typescript\n * const alwatrStore = new AlwatrNitrobase({\n * rootPath: './db',\n * saveDebounce: 40,\n * });\n * ```\n */\n constructor(readonly config: AlwatrNitrobaseConfig) {\n logger.logMethodArgs?.('new', config);\n this.config.defaultChangeDebounce ??= 40;\n this.rootDb__ = this.loadRootDb__();\n this.storeChanged_ = this.storeChanged_.bind(this);\n exitHook(this.exitHook__.bind(this));\n }\n\n /**\n * Checks if a nitrobase file with the given ID exists.\n *\n * @param storeId - The ID of the nitrobase file to check.\n * @returns `true` if the nitrobase file exists, `false` otherwise.\n * @example\n * ```typescript\n * if (!alwatrStore.hasStore('user1/profile')) {\n * alwatrStore.defineDocument(...)\n * }\n * ```\n */\n hasStore(storeId: StoreFileId): boolean {\n const id_ = getStoreId(storeId);\n const exists = this.rootDb__.hasItem(id_);\n logger.logMethodFull?.('hasStore', id_, exists);\n return exists;\n }\n\n /**\n * Defines a new document with the given configuration and initial data.\n * If a document with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @param data initial data for the document\n * @template TDoc document data type\n * @example\n * ```typescript\n * await alwatrStore.newDocument<Order>(\n * {\n * name: 'profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * },\n * {\n * name: 'Ali',\n * email: 'ali@alwatr.io',\n * }\n * );\n * ```\n */\n newDocument<TDoc extends JsonObject = JsonObject>(stat: Omit<StoreFileStat, 'type'>, data: TDoc): void {\n logger.logMethodArgs?.('newDocument', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Document,\n },\n data,\n );\n }\n\n /**\n * Defines a new collection with the given configuration and initial data.\n * If a collection with the same ID already exists, an error is thrown.\n *\n * @param stat nitrobase file stat\n * @example\n * ```typescript\n * await alwatrStore.newCollection<Order>(\n * {\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * }\n * );\n * ```\n */\n newCollection(stat: Omit<StoreFileStat, 'type'>): void {\n logger.logMethodArgs?.('newCollection', stat);\n return this.newStoreFile_(\n {\n ...stat,\n type: StoreFileType.Collection,\n }\n );\n }\n\n /**\n * Defines a AlwatrNitrobaseFile with the given configuration and initial data.\n *\n * @param stat nitrobase file stat\n * @param data initial data for the document\n */\n newStoreFile_(\n stat: StoreFileStat,\n data?: DictionaryOpt,\n ): void {\n logger.logMethodArgs?.('newStoreFile_', stat);\n\n (stat.changeDebounce as number | undefined) ??= this.config.defaultChangeDebounce;\n\n let fileStoreRef: DocumentReference | CollectionReference;\n if (stat.type === StoreFileType.Document) {\n if (data === undefined) {\n logger.accident('newStoreFile_', 'document_data_required', stat);\n throw new Error('document_data_required', {cause: stat});\n }\n fileStoreRef = DocumentReference.newRefFromData(stat, data, this.storeChanged_);\n }\n else if (stat.type === StoreFileType.Collection) {\n fileStoreRef = CollectionReference.newRefFromData(stat, this.storeChanged_);\n }\n else {\n logger.accident('newStoreFile_', 'store_file_type_not_supported', stat);\n throw new Error('store_file_type_not_supported', {cause: stat});\n }\n\n if (this.rootDb__.hasItem(fileStoreRef.id)) {\n logger.accident('newStoreFile_', 'store_file_already_defined', stat);\n throw new Error('store_file_already_defined', {cause: stat});\n }\n\n this.rootDb__.addItem(fileStoreRef.id, stat);\n this.cacheReferences__[fileStoreRef.id] = fileStoreRef;\n\n // fileStoreRef.save();\n this.storeChanged_(fileStoreRef);\n }\n\n /**\n * Open a document with the given id and create and return a DocumentReference.\n * If the document not exists or its not a document, an error is thrown.\n *\n * @template TDoc document data type\n * @param documentId document id {@link StoreFileId}\n * @returns document reference {@link DocumentReference}\n * @example\n * ```typescript\n * const userProfile = await alwatrStore.openDocument<User>({\n * name: 'user1/profile',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * userProfile.update({name: 'ali'});\n * ```\n */\n async openDocument<TDoc extends JsonObject>(documentId: StoreFileId): Promise<DocumentReference<TDoc>> {\n const id = getStoreId(documentId);\n logger.logMethodArgs?.('openDocument', id);\n\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof DocumentReference)) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as DocumentReference<TDoc>;\n }\n\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openDocument', 'document_not_found', id);\n throw new Error('document_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Document) {\n logger.accident('openDocument', 'document_wrong_type', id);\n throw new Error('document_wrong_type', {cause: id});\n }\n\n const context = await this.readContext__<DocumentContext<TDoc>>(storeStat);\n const docRef = DocumentReference.newRefFromContext(context, this.storeChanged_);\n this.cacheReferences__[id] = docRef as unknown as DocumentReference;\n return docRef;\n }\n\n /**\n * Open a collection with the given id and create and return a CollectionReference.\n * If the collection not exists or its not a collection, an error is thrown.\n *\n * @template TItem collection item data type\n * @param collectionId collection id {@link StoreFileId}\n * @returns collection reference {@link CollectionReference}\n * @example\n * ```typescript\n * const orders = await alwatrStore.openCollection<Order>({\n * name: 'orders',\n * region: Region.PerUser,\n * ownerId: 'user1',\n * });\n * orders.append({name: 'order 1'});\n * ```\n */\n async openCollection<TItem extends JsonObject>(collectionId: StoreFileId): Promise<CollectionReference<TItem>> {\n const id = getStoreId(collectionId);\n logger.logMethodArgs?.('openCollection', id);\n\n // try to get from cache\n if (Object.hasOwn(this.cacheReferences__, id)) {\n const ref = this.cacheReferences__[id];\n if (!(ref instanceof CollectionReference)) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_wrong_type', {cause: id});\n }\n return this.cacheReferences__[id] as unknown as CollectionReference<TItem>;\n }\n\n // load and create new collection reference\n if (!this.rootDb__.hasItem(id)) {\n logger.accident('openCollection', 'collection_not_found', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const storeStat = this.rootDb__.getItemData(id);\n\n if (storeStat.type != StoreFileType.Collection) {\n logger.accident('openCollection', 'collection_wrong_type', id);\n throw new Error('collection_not_found', {cause: id});\n }\n\n const context = await this.readContext__<CollectionContext<TItem>>(storeStat);\n const colRef = CollectionReference.newRefFromContext(context, this.storeChanged_);\n this.cacheReferences__[id] = colRef as unknown as CollectionReference;\n return colRef;\n }\n\n /**\n * Unloads the nitrobase file with the given id from memory.\n *\n * @param storeId The unique identifier of the nitrobase file. {@link StoreFileId}\n * @example\n * ```typescript\n * alwatrStore.unloadStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // true\n * ```\n */\n unloadStore(storeId: StoreFileId): void {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('unloadStore', id_);\n const ref = this.cacheReferences__[id_];\n if (ref === undefined) return;\n if (ref.hasUnprocessedChanges_ === true) {\n ref.updateDelayed_ = false;\n this.storeChanged_(ref);\n }\n delete this.cacheReferences__[id_];\n }\n\n /**\n * Remove document or collection from nitrobase and delete the file from disk.\n * If the file is not found, an error is thrown.\n * If the file is not unloaded, it will be unloaded first.\n * You don't need to await this method to complete unless you want to make sure the file is deleted on disk.\n *\n * @param storeId The ID of the file to delete. {@link StoreFileId}\n * @returns A Promise that resolves when the file is deleted.\n * @example\n * ```typescript\n * alwatrStore.removeStore({name: 'user-list', region: Region.Secret});\n * alwatrStore.hasStore({name: 'user-list', region: Region.Secret}); // false\n * ```\n */\n async removeStore(storeId: StoreFileId): Promise<void> {\n const id_ = getStoreId(storeId);\n logger.logMethodArgs?.('removeStore', id_);\n if (!this.rootDb__.hasItem(id_)) {\n logger.accident('removeStore', 'document_not_found', id_);\n throw new Error('document_not_found', {cause: id_});\n }\n const ref = this.cacheReferences__[id_];\n if (ref !== undefined) {\n // direct unload to prevent save\n ref.freeze = true;\n ref.updateDelayed_ = false;\n ref.hasUnprocessedChanges_ = false;\n delete this.cacheReferences__[id_]; // unload\n }\n const path = getStorePath(this.rootDb__.getItemData(id_));\n this.rootDb__.removeItem(id_);\n await delay.by(0);\n try {\n await unlink(resolve(this.config.rootPath, path));\n }\n catch (error) {\n logger.error('removeStore', 'remove_file_failed', error, {id: storeId, path});\n }\n }\n\n /**\n * Saves all changes in the nitrobase.\n *\n * @returns A Promise that resolves when all changes are saved.\n * @example\n * ```typescript\n * await alwatrStore.saveAll();\n * ```\n */\n async saveAll(): Promise<void> {\n logger.logMethod?.('saveAll');\n for (const ref of Object.values(this.cacheReferences__)) {\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n ref.updateDelayed_ = false;\n await this.storeChanged_(ref);\n }\n }\n }\n\n /**\n * Reads the context from a given path or StoreFileStat object.\n *\n * @param path The path or StoreFileStat object from which to read the context.\n * @returns A promise that resolves to the context object.\n */\n private async readContext__<T extends StoreFileContext>(path: string | StoreFileStat): Promise<T> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('readContext__', path);\n logger.time?.(`readContext__time(${path})`);\n const context = (await readJson(resolve(this.config.rootPath, path))) as T;\n logger.timeEnd?.(`readContext__time(${path})`);\n return context;\n }\n\n /**\n * Writes the context to the specified path.\n *\n * @template T The type of the context.\n * @param path The path where the context will be written.\n * @param context The context to be written.\n * @param sync Indicates whether the write operation should be synchronous.\n * @returns A promise that resolves when the write operation is complete.\n */\n private writeContext__<T extends StoreFileContext>(path: string | StoreFileStat, context: T): Promise<void> {\n if (typeof path !== 'string') path = getStorePath(path);\n logger.logMethodArgs?.('writeContext__', path);\n return writeJson(resolve(this.config.rootPath, path), context);\n }\n\n /**\n * Write nitrobase file context.\n *\n * @param from nitrobase file reference\n * @returns A promise that resolves when the write operation is complete.\n */\n protected async storeChanged_<T extends JsonObject>(from: DocumentReference<T> | CollectionReference<T>): Promise<void> {\n logger.logMethodArgs?.('storeChanged__', from.id);\n const rev = from.getStoreMeta().rev;\n try {\n await this.writeContext__(from.path, from.getFullContext_());\n if (rev === from.getStoreMeta().rev) {\n // Context not changed during saving\n from.hasUnprocessedChanges_ = false;\n }\n }\n catch (error) {\n logger.error('storeChanged__', 'write_context_failed', {id: from.id, error});\n }\n }\n\n /**\n * Load storeFilesCollection or create new one.\n */\n private loadRootDb__(): CollectionReference<StoreFileStat> {\n logger.logMethod?.('loadRootDb__');\n const fullPath = resolve(this.config.rootPath, getStorePath(AlwatrNitrobase.rootDbStat__));\n if (!existsSync(fullPath)) {\n if (this.config.errorWhenNotInitialized === true) {\n throw new Error('store_not_found', {cause: 'Nitrobase not initialized'});\n }\n\n logger.banner('Initialize new alwatr-nitrobase');\n return CollectionReference.newRefFromData(AlwatrNitrobase.rootDbStat__, this.storeChanged_);\n }\n // else\n const context = readJson<CollectionContext<StoreFileStat>>(fullPath, true);\n return CollectionReference.newRefFromContext(context, this.storeChanged_, 'root-db');\n }\n\n /**\n * Save all nitrobase files.\n */\n private exitHook__(): void {\n logger.logMethod?.('exitHook__');\n for (const ref of Object.values(this.cacheReferences__)) {\n logger.logProperty?.(`StoreFile.${ref.id}.hasUnprocessedChanges`, ref.hasUnprocessedChanges_);\n if (ref.hasUnprocessedChanges_ === true && ref.freeze !== true) {\n logger.incident?.('exitHook__', 'rescue_unsaved_context', {id: ref.id});\n writeJson(resolve(this.config.rootPath, ref.path), ref.getFullContext_(), true);\n ref.hasUnprocessedChanges_ = false;\n }\n }\n }\n\n /**\n * Get all nitrobase files.\n *\n * @returns all nitrobase files.\n * @example\n * ```typescript\n * const storeList = alwatrStore.getStoreList();\n * for (const nitrobase of storeList) {\n * console.log(nitrobase.meta.id, nitrobase.data);\n * }\n */\n getStoreList(): CollectionItem<Omit<StoreFileStat, 'schemaVer'>>[] {\n logger.logMethod?.('getStoreList');\n return this.rootDb__.values();\n }\n}\n", "import {createLogger, packageTracer} from '@alwatr/nanolib';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport const logger = /* #__PURE__ */ createLogger(__package_name__);\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwatr/nitrobase-engine",
3
- "version": "7.5.0",
3
+ "version": "7.5.4",
4
4
  "description": "Nitrobase is a blazingly fast, lightweight database built on JSON. It stores data entirely in memory for lightning-quick access, while also providing a JSON file backup for persistence. You can easily serve your data over the web using our high-performance accelerated Nginx server.",
5
5
  "author": "S. Ali Mihandoost <ali.mihandoost@gmail.com>",
6
6
  "keywords": [
@@ -61,17 +61,17 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@alwatr/nanolib": "^5.2.1",
64
- "@alwatr/nitrobase-helper": "^7.5.0",
65
- "@alwatr/nitrobase-reference": "^7.5.0",
66
- "@alwatr/nitrobase-types": "^7.5.0"
64
+ "@alwatr/nitrobase-helper": "^7.5.4",
65
+ "@alwatr/nitrobase-reference": "^7.5.4",
66
+ "@alwatr/nitrobase-types": "^7.5.4"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@alwatr/nano-build": "^5.0.0",
70
70
  "@alwatr/prettier-config": "^5.0.0",
71
71
  "@alwatr/tsconfig-base": "^5.0.0",
72
72
  "@alwatr/type-helper": "^5.0.0",
73
- "@types/node": "^22.9.0",
74
- "typescript": "^5.6.3"
73
+ "@types/node": "^22.10.5",
74
+ "typescript": "^5.7.3"
75
75
  },
76
- "gitHead": "cb82a2f1ffa090db44cf7476fe68a2e4d8b0f67a"
76
+ "gitHead": "a80d61632fce6c1e8ff9380aa58bfe9c9d5cb507"
77
77
  }