aether-cache 0.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/cli/commands/init.d.ts +4 -0
  4. package/dist/cli/commands/init.d.ts.map +1 -0
  5. package/dist/cli/commands/init.js +17 -0
  6. package/dist/cli/commands/init.js.map +1 -0
  7. package/dist/cli/commands/insert.d.ts +4 -0
  8. package/dist/cli/commands/insert.d.ts.map +1 -0
  9. package/dist/cli/commands/insert.js +18 -0
  10. package/dist/cli/commands/insert.js.map +1 -0
  11. package/dist/cli/commands/new-schema.d.ts +4 -0
  12. package/dist/cli/commands/new-schema.d.ts.map +1 -0
  13. package/dist/cli/commands/new-schema.js +27 -0
  14. package/dist/cli/commands/new-schema.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +12 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/database.d.ts +32 -0
  20. package/dist/database.d.ts.map +1 -0
  21. package/dist/database.js +178 -0
  22. package/dist/database.js.map +1 -0
  23. package/dist/errors.d.ts +27 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +55 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +16 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/internal/collections/CollectionManager.d.ts +19 -0
  32. package/dist/internal/collections/CollectionManager.d.ts.map +1 -0
  33. package/dist/internal/collections/CollectionManager.js +102 -0
  34. package/dist/internal/collections/CollectionManager.js.map +1 -0
  35. package/dist/internal/identity/RecordIdentityManager.d.ts +8 -0
  36. package/dist/internal/identity/RecordIdentityManager.d.ts.map +1 -0
  37. package/dist/internal/identity/RecordIdentityManager.js +54 -0
  38. package/dist/internal/identity/RecordIdentityManager.js.map +1 -0
  39. package/dist/internal/indexing/IndexManager.d.ts +14 -0
  40. package/dist/internal/indexing/IndexManager.d.ts.map +1 -0
  41. package/dist/internal/indexing/IndexManager.js +65 -0
  42. package/dist/internal/indexing/IndexManager.js.map +1 -0
  43. package/dist/internal/persistence/JsonPersistenceAdapter.d.ts +20 -0
  44. package/dist/internal/persistence/JsonPersistenceAdapter.d.ts.map +1 -0
  45. package/dist/internal/persistence/JsonPersistenceAdapter.js +85 -0
  46. package/dist/internal/persistence/JsonPersistenceAdapter.js.map +1 -0
  47. package/dist/internal/platform/storagePath.d.ts +2 -0
  48. package/dist/internal/platform/storagePath.d.ts.map +1 -0
  49. package/dist/internal/platform/storagePath.js +21 -0
  50. package/dist/internal/platform/storagePath.js.map +1 -0
  51. package/dist/internal/schema/SchemaManager.d.ts +11 -0
  52. package/dist/internal/schema/SchemaManager.d.ts.map +1 -0
  53. package/dist/internal/schema/SchemaManager.js +41 -0
  54. package/dist/internal/schema/SchemaManager.js.map +1 -0
  55. package/dist/internal/validation/schema.d.ts +3 -0
  56. package/dist/internal/validation/schema.d.ts.map +1 -0
  57. package/dist/internal/validation/schema.js +27 -0
  58. package/dist/internal/validation/schema.js.map +1 -0
  59. package/dist/types.d.ts +57 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +3 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +60 -0
@@ -0,0 +1,19 @@
1
+ import { Collection, CollectionMetadata, CollectionName, DatabaseStore, RecordData, SchemaDefinition } from "../../types";
2
+ export declare class CollectionManager<TRecord extends RecordData = RecordData> {
3
+ private collections;
4
+ private readonly onCollectionChange?;
5
+ private readonly recordIdentityManager;
6
+ constructor(collections?: DatabaseStore<TRecord>["collections"], onCollectionChange?: () => void);
7
+ setCollections(collections: DatabaseStore<TRecord>["collections"]): void;
8
+ getCollections(): DatabaseStore<TRecord>["collections"];
9
+ createCollection(name: CollectionName, schema: SchemaDefinition, metadata?: Partial<CollectionMetadata>): Collection<TRecord>;
10
+ deleteCollection(name: CollectionName): boolean;
11
+ getCollection(name: CollectionName): Collection<TRecord>;
12
+ hasCollection(name: CollectionName): boolean;
13
+ updateSchema(name: CollectionName, schema: SchemaDefinition): Collection<TRecord>;
14
+ touchCollection(name: CollectionName): void;
15
+ private normalizeCollection;
16
+ private normalizeRecords;
17
+ private createMetadata;
18
+ }
19
+ //# sourceMappingURL=CollectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionManager.d.ts","sourceRoot":"","sources":["../../../src/internal/collections/CollectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,UAAU,EACV,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAOrB,qBAAa,iBAAiB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACpE,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAwB;gBAG5D,WAAW,GAAE,aAAa,CAAC,OAAO,CAAC,CAAC,aAAa,CAAM,EACvD,kBAAkB,CAAC,EAAE,MAAM,IAAI;IAOjC,cAAc,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI;IAcxE,cAAc,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;IAIvD,gBAAgB,CACd,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,GAAE,OAAO,CAAC,kBAAkB,CAAM,GACzC,UAAU,CAAC,OAAO,CAAC;IAkBtB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAU/C,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC;IAUxD,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAI5C,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC;IAYjF,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAO3C,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;CAYvB"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CollectionManager = void 0;
4
+ const errors_1 = require("../../errors");
5
+ const RecordIdentityManager_1 = require("../identity/RecordIdentityManager");
6
+ class CollectionManager {
7
+ collections;
8
+ onCollectionChange;
9
+ recordIdentityManager;
10
+ constructor(collections = {}, onCollectionChange) {
11
+ this.collections = collections;
12
+ this.onCollectionChange = onCollectionChange;
13
+ this.recordIdentityManager = new RecordIdentityManager_1.RecordIdentityManager();
14
+ }
15
+ setCollections(collections) {
16
+ this.collections = Object.keys(collections).reduce((normalizedCollections, name) => {
17
+ normalizedCollections[name] = this.normalizeCollection(name, collections[name]);
18
+ return normalizedCollections;
19
+ }, {});
20
+ this.onCollectionChange?.();
21
+ }
22
+ getCollections() {
23
+ return this.collections;
24
+ }
25
+ createCollection(name, schema, metadata = {}) {
26
+ if (this.collections[name]) {
27
+ throw new errors_1.CollectionExistsError(name);
28
+ }
29
+ const collection = {
30
+ name,
31
+ schema,
32
+ metadata: this.createMetadata(metadata),
33
+ records: {},
34
+ indexes: {},
35
+ };
36
+ this.collections[name] = collection;
37
+ this.onCollectionChange?.();
38
+ return collection;
39
+ }
40
+ deleteCollection(name) {
41
+ if (!this.collections[name]) {
42
+ return false;
43
+ }
44
+ delete this.collections[name];
45
+ this.onCollectionChange?.();
46
+ return true;
47
+ }
48
+ getCollection(name) {
49
+ const collection = this.collections[name];
50
+ if (!collection) {
51
+ throw new errors_1.CollectionNotFoundError(name);
52
+ }
53
+ return collection;
54
+ }
55
+ hasCollection(name) {
56
+ return Boolean(this.collections[name]);
57
+ }
58
+ updateSchema(name, schema) {
59
+ const collection = this.collections[name];
60
+ if (!collection) {
61
+ return this.createCollection(name, schema);
62
+ }
63
+ collection.schema = schema;
64
+ this.touchCollection(name);
65
+ return collection;
66
+ }
67
+ touchCollection(name) {
68
+ const collection = this.getCollection(name);
69
+ collection.metadata.updatedAt = new Date().toISOString();
70
+ collection.metadata.recordCount = Object.keys(collection.records).length;
71
+ this.onCollectionChange?.();
72
+ }
73
+ normalizeCollection(name, collection) {
74
+ const records = this.normalizeRecords(collection.records ?? {});
75
+ const metadata = this.createMetadata(collection.metadata);
76
+ metadata.recordCount = Object.keys(records).length;
77
+ return {
78
+ name: collection.name ?? name,
79
+ schema: collection.schema ?? {},
80
+ metadata,
81
+ records,
82
+ indexes: collection.indexes ?? {},
83
+ };
84
+ }
85
+ normalizeRecords(records) {
86
+ return Object.keys(records).reduce((normalizedRecords, id) => {
87
+ normalizedRecords[id] = this.recordIdentityManager.normalizeRecord(id, records[id]);
88
+ return normalizedRecords;
89
+ }, {});
90
+ }
91
+ createMetadata(metadata = {}) {
92
+ const now = new Date().toISOString();
93
+ return {
94
+ createdAt: metadata.createdAt ?? now,
95
+ updatedAt: metadata.updatedAt ?? now,
96
+ recordCount: metadata.recordCount ?? 0,
97
+ ...metadata,
98
+ };
99
+ }
100
+ }
101
+ exports.CollectionManager = CollectionManager;
102
+ //# sourceMappingURL=CollectionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionManager.js","sourceRoot":"","sources":["../../../src/internal/collections/CollectionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Collection, RecordData, RecordId, StoredRecord } from "../../types";
2
+ export declare class RecordIdentityManager {
3
+ createRecord<TRecord extends RecordData>(collection: Collection<TRecord>, data: TRecord, requestedId?: RecordId): StoredRecord<TRecord>;
4
+ normalizeRecord<TRecord extends RecordData>(id: RecordId, record: StoredRecord<TRecord> | TRecord): StoredRecord<TRecord>;
5
+ private generateId;
6
+ private isStoredRecord;
7
+ }
8
+ //# sourceMappingURL=RecordIdentityManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordIdentityManager.d.ts","sourceRoot":"","sources":["../../../src/internal/identity/RecordIdentityManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7E,qBAAa,qBAAqB;IAChC,YAAY,CAAC,OAAO,SAAS,UAAU,EACrC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAC/B,IAAI,EAAE,OAAO,EACb,WAAW,CAAC,EAAE,QAAQ,GACrB,YAAY,CAAC,OAAO,CAAC;IAgBxB,eAAe,CAAC,OAAO,SAAS,UAAU,EACxC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,OAAO,GACtC,YAAY,CAAC,OAAO,CAAC;IAsBxB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,cAAc;CAUvB"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordIdentityManager = void 0;
4
+ const errors_1 = require("../../errors");
5
+ class RecordIdentityManager {
6
+ createRecord(collection, data, requestedId) {
7
+ const id = requestedId ?? this.generateId();
8
+ if (collection.records[id]) {
9
+ throw new errors_1.DuplicateRecordIdError(id);
10
+ }
11
+ return {
12
+ id,
13
+ identity: {
14
+ primaryKey: id,
15
+ },
16
+ data,
17
+ };
18
+ }
19
+ normalizeRecord(id, record) {
20
+ if (this.isStoredRecord(record)) {
21
+ const primaryKey = record.identity?.primaryKey ?? record.id ?? id;
22
+ return {
23
+ ...record,
24
+ id: record.id ?? id,
25
+ identity: {
26
+ primaryKey,
27
+ },
28
+ };
29
+ }
30
+ return {
31
+ id,
32
+ identity: {
33
+ primaryKey: id,
34
+ },
35
+ data: record,
36
+ };
37
+ }
38
+ generateId() {
39
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
40
+ return crypto.randomUUID();
41
+ }
42
+ return `${Date.now().toString(36)}_${Math.random()
43
+ .toString(36)
44
+ .slice(2, 12)}`;
45
+ }
46
+ isStoredRecord(record) {
47
+ return (record !== null &&
48
+ typeof record === "object" &&
49
+ "id" in record &&
50
+ "data" in record);
51
+ }
52
+ }
53
+ exports.RecordIdentityManager = RecordIdentityManager;
54
+ //# sourceMappingURL=RecordIdentityManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordIdentityManager.js","sourceRoot":"","sources":["../../../src/internal/identity/RecordIdentityManager.ts"],"names":[],"mappings":";;;AACA,yCAAsD;AAEtD,MAAa,qBAAqB;IAChC,YAAY,CACV,UAA+B,EAC/B,IAAa,EACb,WAAsB;QAEtB,MAAM,EAAE,GAAG,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAE5C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,+BAAsB,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QAED,OAAO;YACL,EAAE;YACF,QAAQ,EAAE;gBACR,UAAU,EAAE,EAAE;aACf;YACD,IAAI;SACL,CAAC;IACJ,CAAC;IAED,eAAe,CACb,EAAY,EACZ,MAAuC;QAEvC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;YAElE,OAAO;gBACL,GAAG,MAAM;gBACT,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;gBACnB,QAAQ,EAAE;oBACR,UAAU;iBACX;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE;YACF,QAAQ,EAAE;gBACR,UAAU,EAAE,EAAE;aACf;YACD,IAAI,EAAE,MAAM;SACb,CAAC;IACJ,CAAC;IAEO,UAAU;QAChB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC5D,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;aAC/C,QAAQ,CAAC,EAAE,CAAC;aACZ,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACpB,CAAC;IAEO,cAAc,CACpB,MAAuC;QAEvC,OAAO,CACL,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,IAAI,IAAI,MAAM;YACd,MAAM,IAAI,MAAM,CACjB,CAAC;IACJ,CAAC;CACF;AAlED,sDAkEC"}
@@ -0,0 +1,14 @@
1
+ import { Collection, CollectionName, RecordData, RecordId, StoredRecord } from "../../types";
2
+ export declare class IndexManager<TRecord extends RecordData = RecordData> {
3
+ private indexes;
4
+ initializeCollection(collection: Collection<TRecord>): void;
5
+ ensureCollection(collection: Collection<TRecord>): void;
6
+ dropCollection(collectionName: CollectionName): boolean;
7
+ indexRecord(collectionName: CollectionName, record: StoredRecord<TRecord>): void;
8
+ updateRecord(collectionName: CollectionName, record: StoredRecord<TRecord>): void;
9
+ deleteRecord(collectionName: CollectionName, recordId: RecordId): boolean;
10
+ getByPrimaryKey(collectionName: CollectionName, recordId: RecordId): StoredRecord<TRecord> | undefined;
11
+ hasPrimaryKey(collectionName: CollectionName, recordId: RecordId): boolean;
12
+ private getCollectionIndexes;
13
+ }
14
+ //# sourceMappingURL=IndexManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexManager.d.ts","sourceRoot":"","sources":["../../../src/internal/indexing/IndexManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,cAAc,EACd,UAAU,EACV,QAAQ,EACR,YAAY,EACb,MAAM,aAAa,CAAC;AAGrB,qBAAa,YAAY,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IAC/D,OAAO,CAAC,OAAO,CAA0D;IAEzE,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAkB3D,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAMvD,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO;IASvD,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAKhF,YAAY,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI;IAIjF,YAAY,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAWzE,eAAe,CACb,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,QAAQ,GACjB,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS;IAIpC,aAAa,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAI1E,OAAO,CAAC,oBAAoB;CAc7B"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexManager = void 0;
4
+ const errors_1 = require("../../errors");
5
+ class IndexManager {
6
+ indexes = {};
7
+ initializeCollection(collection) {
8
+ this.indexes[collection.name] = {
9
+ primary: {
10
+ name: "primary",
11
+ kind: "primary",
12
+ field: "identity.primaryKey",
13
+ entries: { ...collection.records },
14
+ },
15
+ secondary: {},
16
+ };
17
+ collection.indexes.primary = {
18
+ name: "primary",
19
+ kind: "primary",
20
+ field: "identity.primaryKey",
21
+ };
22
+ }
23
+ ensureCollection(collection) {
24
+ if (!this.indexes[collection.name]) {
25
+ this.initializeCollection(collection);
26
+ }
27
+ }
28
+ dropCollection(collectionName) {
29
+ if (!this.indexes[collectionName]) {
30
+ return false;
31
+ }
32
+ delete this.indexes[collectionName];
33
+ return true;
34
+ }
35
+ indexRecord(collectionName, record) {
36
+ const collectionIndexes = this.getCollectionIndexes(collectionName);
37
+ collectionIndexes.primary.entries[record.identity.primaryKey] = record;
38
+ }
39
+ updateRecord(collectionName, record) {
40
+ this.indexRecord(collectionName, record);
41
+ }
42
+ deleteRecord(collectionName, recordId) {
43
+ const collectionIndexes = this.getCollectionIndexes(collectionName);
44
+ if (!collectionIndexes.primary.entries[recordId]) {
45
+ return false;
46
+ }
47
+ delete collectionIndexes.primary.entries[recordId];
48
+ return true;
49
+ }
50
+ getByPrimaryKey(collectionName, recordId) {
51
+ return this.indexes[collectionName]?.primary.entries[recordId];
52
+ }
53
+ hasPrimaryKey(collectionName, recordId) {
54
+ return Boolean(this.getByPrimaryKey(collectionName, recordId));
55
+ }
56
+ getCollectionIndexes(collectionName) {
57
+ const collectionIndexes = this.indexes[collectionName];
58
+ if (!collectionIndexes) {
59
+ throw new errors_1.AetherCacheError("COLLECTION_NOT_FOUND", `Indexes for collection '${collectionName}' do not exist`);
60
+ }
61
+ return collectionIndexes;
62
+ }
63
+ }
64
+ exports.IndexManager = IndexManager;
65
+ //# sourceMappingURL=IndexManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexManager.js","sourceRoot":"","sources":["../../../src/internal/indexing/IndexManager.ts"],"names":[],"mappings":";;;AAQA,yCAAgD;AAEhD,MAAa,YAAY;IACf,OAAO,GAAuD,EAAE,CAAC;IAEzE,oBAAoB,CAAC,UAA+B;QAClD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YAC9B,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE;aACnC;YACD,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,UAAU,CAAC,OAAO,CAAC,OAAO,GAAG;YAC3B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,qBAAqB;SAC7B,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,UAA+B;QAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,cAA8B;QAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,cAA8B,EAAE,MAA6B;QACvE,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACpE,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IACzE,CAAC;IAED,YAAY,CAAC,cAA8B,EAAE,MAA6B;QACxE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,cAA8B,EAAE,QAAkB;QAC7D,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAEpE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CACb,cAA8B,EAC9B,QAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,aAAa,CAAC,cAA8B,EAAE,QAAkB;QAC9D,OAAO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,oBAAoB,CAC1B,cAA8B;QAE9B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEvD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,yBAAgB,CACxB,sBAAsB,EACtB,2BAA2B,cAAc,gBAAgB,CAC1D,CAAC;QACJ,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AAjFD,oCAiFC"}
@@ -0,0 +1,20 @@
1
+ import { DatabaseStore, RecordData, SchemaRegistration } from "../../types";
2
+ export interface PersistenceSnapshot<TRecord extends RecordData = RecordData> {
3
+ data?: DatabaseStore<TRecord>;
4
+ schemas?: SchemaRegistration[];
5
+ }
6
+ export declare class JsonPersistenceAdapter<TRecord extends RecordData = RecordData> {
7
+ private readonly storageDir;
8
+ private readonly dataFileName;
9
+ private readonly schemaFileName;
10
+ constructor(storageDir?: string);
11
+ load(): Promise<PersistenceSnapshot<TRecord>>;
12
+ saveData(data: DatabaseStore<TRecord>): Promise<void>;
13
+ saveSchemas(schemas: SchemaRegistration[]): Promise<void>;
14
+ save(snapshot: PersistenceSnapshot<TRecord>): Promise<void>;
15
+ private get dataPath();
16
+ private get schemaPath();
17
+ private readJson;
18
+ private writeJsonAtomic;
19
+ }
20
+ //# sourceMappingURL=JsonPersistenceAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonPersistenceAdapter.d.ts","sourceRoot":"","sources":["../../../src/internal/persistence/JsonPersistenceAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAI5E,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IAC1E,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,qBAAa,sBAAsB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;gBAEzC,UAAU,GAAE,MAA+B;IAIjD,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAY7C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjE,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,UAAU,GAErB;YAEa,QAAQ;YAoBR,eAAe;CAc9B"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JsonPersistenceAdapter = void 0;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const errors_1 = require("../../errors");
10
+ const storagePath_1 = require("../platform/storagePath");
11
+ class JsonPersistenceAdapter {
12
+ storageDir;
13
+ dataFileName = "dataStore.json";
14
+ schemaFileName = "schemaStore.json";
15
+ constructor(storageDir = (0, storagePath_1.getDefaultStorageDir)()) {
16
+ this.storageDir = storageDir;
17
+ }
18
+ async load() {
19
+ const [data, schemas] = await Promise.all([
20
+ this.readJson(this.dataPath),
21
+ this.readJson(this.schemaPath),
22
+ ]);
23
+ return {
24
+ data,
25
+ schemas,
26
+ };
27
+ }
28
+ async saveData(data) {
29
+ await this.writeJsonAtomic(this.dataPath, data);
30
+ }
31
+ async saveSchemas(schemas) {
32
+ await this.writeJsonAtomic(this.schemaPath, schemas);
33
+ }
34
+ async save(snapshot) {
35
+ const writes = [];
36
+ if (snapshot.data) {
37
+ writes.push(this.saveData(snapshot.data));
38
+ }
39
+ if (snapshot.schemas) {
40
+ writes.push(this.saveSchemas(snapshot.schemas));
41
+ }
42
+ await Promise.all(writes);
43
+ }
44
+ get dataPath() {
45
+ return node_path_1.default.join(this.storageDir, this.dataFileName);
46
+ }
47
+ get schemaPath() {
48
+ return node_path_1.default.join(this.storageDir, this.schemaFileName);
49
+ }
50
+ async readJson(filePath) {
51
+ try {
52
+ const raw = await (0, promises_1.readFile)(filePath, "utf8");
53
+ if (!raw.trim()) {
54
+ return undefined;
55
+ }
56
+ return JSON.parse(raw);
57
+ }
58
+ catch (error) {
59
+ if (isNodeError(error) && error.code === "ENOENT") {
60
+ return undefined;
61
+ }
62
+ throw new errors_1.PersistenceError(`Failed to read '${filePath}': ${formatError(error)}`);
63
+ }
64
+ }
65
+ async writeJsonAtomic(filePath, value) {
66
+ try {
67
+ await (0, promises_1.mkdir)(node_path_1.default.dirname(filePath), { recursive: true });
68
+ const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
69
+ const json = `${JSON.stringify(value, null, 2)}\n`;
70
+ await (0, promises_1.writeFile)(tempPath, json, "utf8");
71
+ await (0, promises_1.rename)(tempPath, filePath);
72
+ }
73
+ catch (error) {
74
+ throw new errors_1.PersistenceError(`Failed to write '${filePath}': ${formatError(error)}`);
75
+ }
76
+ }
77
+ }
78
+ exports.JsonPersistenceAdapter = JsonPersistenceAdapter;
79
+ function isNodeError(error) {
80
+ return error instanceof Error && "code" in error;
81
+ }
82
+ function formatError(error) {
83
+ return error instanceof Error ? error.message : String(error);
84
+ }
85
+ //# sourceMappingURL=JsonPersistenceAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonPersistenceAdapter.js","sourceRoot":"","sources":["../../../src/internal/persistence/JsonPersistenceAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getDefaultStorageDir(): string;
2
+ //# sourceMappingURL=storagePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storagePath.d.ts","sourceRoot":"","sources":["../../../src/internal/platform/storagePath.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,IAAI,MAAM,CAgB7C"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getDefaultStorageDir = getDefaultStorageDir;
7
+ const node_os_1 = __importDefault(require("node:os"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function getDefaultStorageDir() {
10
+ switch (process.platform) {
11
+ case "linux":
12
+ return node_path_1.default.join(node_os_1.default.homedir(), ".local", "share", "aether-cache");
13
+ case "win32":
14
+ return node_path_1.default.join(node_os_1.default.homedir(), "AppData", "Roaming", "aether-cache");
15
+ case "darwin":
16
+ return node_path_1.default.join(node_os_1.default.homedir(), "Library", "Application Support", "aether-cache");
17
+ default:
18
+ return node_path_1.default.join(node_os_1.default.homedir(), ".aether-cache");
19
+ }
20
+ }
21
+ //# sourceMappingURL=storagePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storagePath.js","sourceRoot":"","sources":["../../../src/internal/platform/storagePath.ts"],"names":[],"mappings":";;;;;AAGA,oDAgBC;AAnBD,sDAAyB;AACzB,0DAA6B;AAE7B,SAAgB,oBAAoB;IAClC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACpE,KAAK,OAAO;YACV,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACvE,KAAK,QAAQ;YACX,OAAO,mBAAI,CAAC,IAAI,CACd,iBAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,qBAAqB,EACrB,cAAc,CACf,CAAC;QACJ;YACE,OAAO,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { RecordData, SchemaDefinition, SchemaRegistration } from "../../types";
2
+ import { CollectionManager } from "../collections/CollectionManager";
3
+ export declare class SchemaManager<TRecord extends RecordData = RecordData> {
4
+ private collectionManager?;
5
+ bindCollectionManager(collectionManager: CollectionManager<TRecord>): void;
6
+ registerSchema(name: string, schema: SchemaDefinition): SchemaRegistration[];
7
+ validate(collectionName: string, value: unknown): void;
8
+ getSchema(collectionName: string): SchemaRegistration | undefined;
9
+ listSchemas(): SchemaRegistration[];
10
+ }
11
+ //# sourceMappingURL=SchemaManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaManager.d.ts","sourceRoot":"","sources":["../../../src/internal/schema/SchemaManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,qBAAa,aAAa,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IAChE,OAAO,CAAC,iBAAiB,CAAC,CAA6B;IAEvD,qBAAqB,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,IAAI;IAI1E,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,gBAAgB,GACvB,kBAAkB,EAAE;IAQvB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKtD,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAajE,WAAW,IAAI,kBAAkB,EAAE;CAYpC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaManager = void 0;
4
+ const schema_1 = require("../validation/schema");
5
+ class SchemaManager {
6
+ collectionManager;
7
+ bindCollectionManager(collectionManager) {
8
+ this.collectionManager = collectionManager;
9
+ }
10
+ registerSchema(name, schema) {
11
+ if (this.collectionManager) {
12
+ this.collectionManager.updateSchema(name, schema);
13
+ }
14
+ return this.listSchemas();
15
+ }
16
+ validate(collectionName, value) {
17
+ const schema = this.collectionManager?.getCollection(collectionName).schema;
18
+ (0, schema_1.validateRecord)(collectionName, value, schema);
19
+ }
20
+ getSchema(collectionName) {
21
+ const collection = this.collectionManager?.getCollection(collectionName);
22
+ if (!collection) {
23
+ return undefined;
24
+ }
25
+ return {
26
+ name: collection.name,
27
+ schema: collection.schema,
28
+ };
29
+ }
30
+ listSchemas() {
31
+ if (!this.collectionManager) {
32
+ return [];
33
+ }
34
+ return Object.values(this.collectionManager.getCollections()).map((collection) => ({
35
+ name: collection.name,
36
+ schema: collection.schema,
37
+ }));
38
+ }
39
+ }
40
+ exports.SchemaManager = SchemaManager;
41
+ //# sourceMappingURL=SchemaManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaManager.js","sourceRoot":"","sources":["../../../src/internal/schema/SchemaManager.ts"],"names":[],"mappings":";;;AAOA,iDAAsD;AAEtD,MAAa,aAAa;IAChB,iBAAiB,CAA8B;IAEvD,qBAAqB,CAAC,iBAA6C;QACjE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;IAED,cAAc,CACZ,IAAY,EACZ,MAAwB;QAExB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,QAAQ,CAAC,cAAsB,EAAE,KAAc;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;QAC5E,IAAA,uBAAc,EAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,SAAS,CAAC,cAAsB;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;QAEzE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAC/D,CAAC,UAA+B,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAhDD,sCAgDC"}
@@ -0,0 +1,3 @@
1
+ import { SchemaDefinition } from "../../types";
2
+ export declare function validateRecord(collectionName: string, value: unknown, schema: SchemaDefinition | undefined): void;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/internal/validation/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,IAAI,CA4BN"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateRecord = validateRecord;
4
+ const errors_1 = require("../../errors");
5
+ function validateRecord(collectionName, value, schema) {
6
+ if (!schema) {
7
+ throw new errors_1.SchemaNotFoundError(collectionName);
8
+ }
9
+ if (!isPlainObject(value)) {
10
+ throw new errors_1.ValidationError("Record value must be a plain object");
11
+ }
12
+ const record = value;
13
+ const missingKeys = Object.keys(schema).filter((key) => !(key in record));
14
+ if (missingKeys.length > 0) {
15
+ throw new errors_1.ValidationError(`Validation failed: missing required field(s): ${missingKeys.join(", ")}`);
16
+ }
17
+ const invalidTypes = Object.entries(schema)
18
+ .filter(([key, expectedType]) => typeof record[key] !== expectedType)
19
+ .map(([key, expectedType]) => `Field '${key}' expected ${expectedType}, received ${typeof record[key]}`);
20
+ if (invalidTypes.length > 0) {
21
+ throw new errors_1.ValidationError(invalidTypes.join("; "));
22
+ }
23
+ }
24
+ function isPlainObject(value) {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/internal/validation/schema.ts"],"names":[],"mappings":";;AAGA,wCAgCC;AAlCD,yCAAoE;AAEpE,SAAgB,cAAc,CAC5B,cAAsB,EACtB,KAAc,EACd,MAAoC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,4BAAmB,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,wBAAe,CAAC,qCAAqC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;IAE1E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,wBAAe,CACvB,iDAAiD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC;SACpE,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,CACtB,UAAU,GAAG,cAAc,YAAY,cAAc,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAC5E,CAAC;IAEJ,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,wBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,57 @@
1
+ export type PrimitiveSchemaType = "string" | "number" | "boolean" | "object";
2
+ export type SchemaDefinition = Record<string, PrimitiveSchemaType>;
3
+ export type RecordId = string;
4
+ export type CollectionName = string;
5
+ export interface AetherCacheOptions {
6
+ persist?: boolean;
7
+ storageDir?: string;
8
+ }
9
+ export interface RecordIdentity {
10
+ primaryKey: RecordId;
11
+ }
12
+ export type RecordData = object;
13
+ export interface StoredRecord<TRecord extends RecordData = RecordData> {
14
+ id: RecordId;
15
+ identity: RecordIdentity;
16
+ data: TRecord;
17
+ }
18
+ export type IndexKind = "primary" | "secondary";
19
+ export interface IndexMetadata {
20
+ name: string;
21
+ kind: IndexKind;
22
+ field: string;
23
+ }
24
+ export interface PrimaryKeyIndex<TRecord extends RecordData = RecordData> {
25
+ name: string;
26
+ kind: "primary";
27
+ field: "identity.primaryKey";
28
+ entries: Record<RecordId, StoredRecord<TRecord>>;
29
+ }
30
+ export interface CollectionIndexes<TRecord extends RecordData = RecordData> {
31
+ primary: PrimaryKeyIndex<TRecord>;
32
+ secondary: Record<string, unknown>;
33
+ }
34
+ export interface CollectionMetadata {
35
+ createdAt: string;
36
+ updatedAt: string;
37
+ recordCount: number;
38
+ [key: string]: unknown;
39
+ }
40
+ export interface Collection<TRecord extends RecordData = RecordData> {
41
+ name: CollectionName;
42
+ schema: SchemaDefinition;
43
+ metadata: CollectionMetadata;
44
+ records: Record<RecordId, StoredRecord<TRecord>>;
45
+ indexes: Record<string, IndexMetadata>;
46
+ }
47
+ export interface DatabaseStore<TRecord extends RecordData = RecordData> {
48
+ collections: Record<CollectionName, Collection<TRecord>>;
49
+ }
50
+ export interface SchemaRegistration {
51
+ name: CollectionName;
52
+ schema: SchemaDefinition;
53
+ }
54
+ export type FilterPredicate<TRecord extends RecordData> = (record: TRecord & {
55
+ id: RecordId;
56
+ }) => boolean;
57
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC7E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACnE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC9B,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,QAAQ,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACnE,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACxE,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACjE,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU;IACpE,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,UAAU,IAAI,CACxD,MAAM,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAA;CAAE,KAC/B,OAAO,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}