@stratasync/core 0.2.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 (90) hide show
  1. package/README.md +83 -0
  2. package/dist/index.d.ts +21 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +14 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/model/base-model.d.ts +82 -0
  7. package/dist/model/base-model.d.ts.map +1 -0
  8. package/dist/model/base-model.js +219 -0
  9. package/dist/model/base-model.js.map +1 -0
  10. package/dist/model/cached-promise.d.ts +15 -0
  11. package/dist/model/cached-promise.d.ts.map +1 -0
  12. package/dist/model/cached-promise.js +50 -0
  13. package/dist/model/cached-promise.js.map +1 -0
  14. package/dist/model/collection.d.ts +33 -0
  15. package/dist/model/collection.d.ts.map +1 -0
  16. package/dist/model/collection.js +181 -0
  17. package/dist/model/collection.js.map +1 -0
  18. package/dist/model/hydration.d.ts +13 -0
  19. package/dist/model/hydration.d.ts.map +1 -0
  20. package/dist/model/hydration.js +2 -0
  21. package/dist/model/hydration.js.map +1 -0
  22. package/dist/model/observability.d.ts +23 -0
  23. package/dist/model/observability.d.ts.map +1 -0
  24. package/dist/model/observability.js +162 -0
  25. package/dist/model/observability.js.map +1 -0
  26. package/dist/reactivity/adapter.d.ts +145 -0
  27. package/dist/reactivity/adapter.d.ts.map +1 -0
  28. package/dist/reactivity/adapter.js +95 -0
  29. package/dist/reactivity/adapter.js.map +1 -0
  30. package/dist/schema/decorators.d.ts +8 -0
  31. package/dist/schema/decorators.d.ts.map +1 -0
  32. package/dist/schema/decorators.js +117 -0
  33. package/dist/schema/decorators.js.map +1 -0
  34. package/dist/schema/hash.d.ts +6 -0
  35. package/dist/schema/hash.d.ts.map +1 -0
  36. package/dist/schema/hash.js +76 -0
  37. package/dist/schema/hash.js.map +1 -0
  38. package/dist/schema/normalize.d.ts +5 -0
  39. package/dist/schema/normalize.d.ts.map +1 -0
  40. package/dist/schema/normalize.js +194 -0
  41. package/dist/schema/normalize.js.map +1 -0
  42. package/dist/schema/registry.d.ts +147 -0
  43. package/dist/schema/registry.d.ts.map +1 -0
  44. package/dist/schema/registry.js +304 -0
  45. package/dist/schema/registry.js.map +1 -0
  46. package/dist/schema/types.d.ts +215 -0
  47. package/dist/schema/types.d.ts.map +1 -0
  48. package/dist/schema/types.js +2 -0
  49. package/dist/schema/types.js.map +1 -0
  50. package/dist/store/types.d.ts +14 -0
  51. package/dist/store/types.d.ts.map +1 -0
  52. package/dist/store/types.js +2 -0
  53. package/dist/store/types.js.map +1 -0
  54. package/dist/sync/delta-applier.d.ts +52 -0
  55. package/dist/sync/delta-applier.d.ts.map +1 -0
  56. package/dist/sync/delta-applier.js +110 -0
  57. package/dist/sync/delta-applier.js.map +1 -0
  58. package/dist/sync/rebase.d.ts +57 -0
  59. package/dist/sync/rebase.d.ts.map +1 -0
  60. package/dist/sync/rebase.js +155 -0
  61. package/dist/sync/rebase.js.map +1 -0
  62. package/dist/sync/sync-id.d.ts +17 -0
  63. package/dist/sync/sync-id.d.ts.map +1 -0
  64. package/dist/sync/sync-id.js +26 -0
  65. package/dist/sync/sync-id.js.map +1 -0
  66. package/dist/sync/types.d.ts +152 -0
  67. package/dist/sync/types.d.ts.map +1 -0
  68. package/dist/sync/types.js +2 -0
  69. package/dist/sync/types.js.map +1 -0
  70. package/dist/transaction/archive.d.ts +16 -0
  71. package/dist/transaction/archive.d.ts.map +1 -0
  72. package/dist/transaction/archive.js +23 -0
  73. package/dist/transaction/archive.js.map +1 -0
  74. package/dist/transaction/create.d.ts +31 -0
  75. package/dist/transaction/create.d.ts.map +1 -0
  76. package/dist/transaction/create.js +121 -0
  77. package/dist/transaction/create.js.map +1 -0
  78. package/dist/transaction/types.d.ts +86 -0
  79. package/dist/transaction/types.d.ts.map +1 -0
  80. package/dist/transaction/types.js +2 -0
  81. package/dist/transaction/types.js.map +1 -0
  82. package/dist/utils/assign.d.ts +9 -0
  83. package/dist/utils/assign.d.ts.map +1 -0
  84. package/dist/utils/assign.js +20 -0
  85. package/dist/utils/assign.js.map +1 -0
  86. package/dist/utils/idempotency.d.ts +16 -0
  87. package/dist/utils/idempotency.d.ts.map +1 -0
  88. package/dist/utils/idempotency.js +39 -0
  89. package/dist/utils/idempotency.js.map +1 -0
  90. package/package.json +37 -0
@@ -0,0 +1,8 @@
1
+ import type { BackReferenceOptions, ModelConstructor, ModelOptions, PropertyOptions, ReferenceArrayOptions, ReferenceCollectionOptions, ReferenceOptions } from "./types.js";
2
+ export declare const ClientModel: (modelName: string, options?: ModelOptions) => <T extends ModelConstructor>(modelConstructor: T) => T;
3
+ export declare const Property: (options?: PropertyOptions) => (target: object, propertyKey: string | symbol) => void;
4
+ export declare const Reference: (modelFactory: () => ModelConstructor, inverseProperty?: string, options?: ReferenceOptions) => (target: object, propertyKey: string | symbol) => void;
5
+ export declare const OneToMany: (options?: ReferenceCollectionOptions) => (target: object, propertyKey: string | symbol) => void;
6
+ export declare const BackReference: (options?: BackReferenceOptions) => (target: object, propertyKey: string | symbol) => void;
7
+ export declare const ReferenceArray: (options?: ReferenceArrayOptions) => (target: object, propertyKey: string | symbol) => void;
8
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/schema/decorators.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEhB,YAAY,EAEZ,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,WAAW,GACrB,WAAW,MAAM,EAAE,UAAS,YAAiB,MAC7C,CAAC,SAAS,gBAAgB,EAAE,kBAAkB,CAAC,KAAG,CAiBlD,CAAC;AAEJ,eAAO,MAAM,QAAQ,GAClB,UAAS,eAAoB,MAC7B,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAG,MAAM,KAAG,IAW/C,CAAC;AA4CJ,eAAO,MAAM,SAAS,GACpB,cAAc,MAAM,gBAAgB,EACpC,kBAAkB,MAAM,EACxB,UAAS,gBAAqB,cAxCjB,MAAM,eAAe,MAAM,GAAG,MAAM,KAAK,IAyCoB,CAAC;AAE7E,eAAO,MAAM,SAAS,GACnB,UAAS,0BAA+B,MACxC,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAG,MAAM,KAAG,IA4C/C,CAAC;AAEJ,eAAO,MAAM,aAAa,GACvB,UAAS,oBAAyB,MAClC,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAG,MAAM,KAAG,IAW/C,CAAC;AAEJ,eAAO,MAAM,cAAc,GACxB,UAAS,qBAA0B,MACnC,QAAQ,MAAM,EAAE,aAAa,MAAM,GAAG,MAAM,KAAG,IAW/C,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { LazyCollection } from "../model/collection.js";
2
+ import { makeCachedReferenceModelProperty, makeObservableProperty, } from "../model/observability.js";
3
+ import { assignIfDefined } from "../utils/assign.js";
4
+ import { ModelRegistry } from "./registry.js";
5
+ export const ClientModel = (modelName, options = {}) => (modelConstructor) => {
6
+ const metadata = {
7
+ loadStrategy: options.loadStrategy ?? "instant",
8
+ name: modelName,
9
+ };
10
+ assignIfDefined(metadata, "partialLoadMode", options.partialLoadMode);
11
+ assignIfDefined(metadata, "usedForPartialIndexes", options.usedForPartialIndexes);
12
+ assignIfDefined(metadata, "schemaVersion", options.schemaVersion);
13
+ assignIfDefined(metadata, "tableName", options.tableName);
14
+ ModelRegistry.registerModel(modelName, modelConstructor, metadata);
15
+ return modelConstructor;
16
+ };
17
+ export const Property = (options = {}) => (target, propertyKey) => {
18
+ const name = propertyKey.toString();
19
+ const meta = {
20
+ type: "property",
21
+ };
22
+ assignIfDefined(meta, "lazy", options.lazy);
23
+ assignIfDefined(meta, "serializer", options.serializer);
24
+ ModelRegistry.registerProperty(target, name, meta);
25
+ makeObservableProperty(target, name);
26
+ };
27
+ const createReferenceDecorator = (refModelName, inverseProperty, options) => (target, propertyKey) => {
28
+ const name = propertyKey.toString();
29
+ const referenceId = options.foreignKey ?? `${name}Id`;
30
+ const indexed = options.indexed ?? (inverseProperty ? true : undefined);
31
+ const referenceMeta = {
32
+ foreignKey: referenceId,
33
+ referenceModel: refModelName,
34
+ type: "reference",
35
+ };
36
+ assignIfDefined(referenceMeta, "inverseProperty", inverseProperty);
37
+ assignIfDefined(referenceMeta, "lazy", options.lazy);
38
+ assignIfDefined(referenceMeta, "serializer", options.serializer);
39
+ assignIfDefined(referenceMeta, "indexed", indexed);
40
+ assignIfDefined(referenceMeta, "nullable", options.nullable);
41
+ const referenceModelMeta = {
42
+ foreignKey: referenceId,
43
+ referenceModel: refModelName,
44
+ type: "referenceModel",
45
+ };
46
+ assignIfDefined(referenceModelMeta, "inverseProperty", inverseProperty);
47
+ assignIfDefined(referenceModelMeta, "lazy", options.lazy);
48
+ assignIfDefined(referenceModelMeta, "serializer", options.serializer);
49
+ assignIfDefined(referenceModelMeta, "indexed", indexed);
50
+ assignIfDefined(referenceModelMeta, "nullable", options.nullable);
51
+ ModelRegistry.registerProperty(target, referenceId, referenceMeta);
52
+ ModelRegistry.registerProperty(target, name, referenceModelMeta);
53
+ makeObservableProperty(target, referenceId);
54
+ makeCachedReferenceModelProperty(target, name, referenceId, refModelName);
55
+ };
56
+ export const Reference = (modelFactory, inverseProperty, options = {}) => createReferenceDecorator(modelFactory().name, inverseProperty, options);
57
+ export const OneToMany = (options = {}) => (target, propertyKey) => {
58
+ const name = propertyKey.toString();
59
+ const meta = {
60
+ type: "referenceCollection",
61
+ };
62
+ assignIfDefined(meta, "lazy", options.lazy);
63
+ assignIfDefined(meta, "serializer", options.serializer);
64
+ assignIfDefined(meta, "indexed", options.indexed);
65
+ assignIfDefined(meta, "nullable", options.nullable);
66
+ assignIfDefined(meta, "foreignKey", options.foreignKey);
67
+ ModelRegistry.registerProperty(target, name, meta);
68
+ const storageKey = `__collection:${name}`;
69
+ Object.defineProperty(target, name, {
70
+ configurable: true,
71
+ enumerable: true,
72
+ get() {
73
+ const record = this;
74
+ let collection = record[storageKey];
75
+ if (!collection) {
76
+ collection = new LazyCollection();
77
+ record[storageKey] = collection;
78
+ }
79
+ if (collection instanceof LazyCollection) {
80
+ collection.attach(this, name, {
81
+ foreignKey: options.foreignKey,
82
+ });
83
+ }
84
+ return collection;
85
+ },
86
+ set(value) {
87
+ const record = this;
88
+ if (value instanceof LazyCollection) {
89
+ value.attach(this, name, {
90
+ foreignKey: options.foreignKey,
91
+ });
92
+ }
93
+ record[storageKey] = value;
94
+ },
95
+ });
96
+ };
97
+ export const BackReference = (options = {}) => (target, propertyKey) => {
98
+ const name = propertyKey.toString();
99
+ const meta = {
100
+ type: "backReference",
101
+ };
102
+ assignIfDefined(meta, "lazy", options.lazy);
103
+ assignIfDefined(meta, "serializer", options.serializer);
104
+ assignIfDefined(meta, "foreignKey", options.foreignKey);
105
+ ModelRegistry.registerProperty(target, name, meta);
106
+ };
107
+ export const ReferenceArray = (options = {}) => (target, propertyKey) => {
108
+ const name = propertyKey.toString();
109
+ const meta = {
110
+ type: "referenceArray",
111
+ };
112
+ assignIfDefined(meta, "lazy", options.lazy);
113
+ assignIfDefined(meta, "serializer", options.serializer);
114
+ assignIfDefined(meta, "through", options.through);
115
+ ModelRegistry.registerProperty(target, name, meta);
116
+ };
117
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/schema/decorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ModelRegistrySnapshot, SchemaDefinition } from "./types.js";
2
+ /**
3
+ * Computes a deterministic hash of the model registry snapshot
4
+ */
5
+ export declare const computeSchemaHash: (input: ModelRegistrySnapshot | SchemaDefinition) => string;
6
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/schema/hash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EAErB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAkFpB;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,qBAAqB,GAAG,gBAAgB,KAC9C,MAMF,CAAC"}
@@ -0,0 +1,76 @@
1
+ import { isRegistrySnapshot, schemaToSnapshot } from "./normalize.js";
2
+ // oxlint-disable-next-line number-literal-case
3
+ const FNV_OFFSET_BASIS_64 = 0xcbf29ce484222325n;
4
+ // oxlint-disable-next-line number-literal-case
5
+ const FNV_PRIME_64 = 0x100000001b3n;
6
+ const stableHash64 = (str) => {
7
+ let hash = FNV_OFFSET_BASIS_64;
8
+ for (let i = 0; i < str.length; i += 1) {
9
+ // biome-ignore lint/suspicious/noBitwiseOperators: FNV-1a requires XOR mixing.
10
+ // oxlint-disable-next-line no-bitwise
11
+ const mixed = hash ^ BigInt(str.codePointAt(i) ?? 0);
12
+ hash = BigInt.asUintN(64, mixed * FNV_PRIME_64);
13
+ }
14
+ return hash;
15
+ };
16
+ /**
17
+ * Converts a bigint hash to a hex string with padding
18
+ */
19
+ const toHex = (num) => num.toString(16).padStart(16, "0");
20
+ /**
21
+ * Sorts object keys alphabetically and removes undefined values
22
+ */
23
+ const sortObject = (obj) => {
24
+ const sorted = {};
25
+ const keys = Object.keys(obj).toSorted();
26
+ for (const key of keys) {
27
+ const value = obj[key];
28
+ if (value !== undefined) {
29
+ sorted[key] = value;
30
+ }
31
+ }
32
+ return sorted;
33
+ };
34
+ const canonicalizeProperty = (prop) => sortObject({
35
+ foreignKey: prop.foreignKey,
36
+ indexed: prop.indexed,
37
+ inverseProperty: prop.inverseProperty,
38
+ lazy: prop.lazy,
39
+ nullable: prop.nullable,
40
+ referenceModel: prop.referenceModel,
41
+ through: prop.through,
42
+ type: prop.type,
43
+ });
44
+ const canonicalizeModelEntry = (entry) => {
45
+ const properties = Object.entries(entry.properties)
46
+ .toSorted(([a], [b]) => a.localeCompare(b))
47
+ .map(([propName, prop]) => [propName, canonicalizeProperty(prop)]);
48
+ return {
49
+ meta: sortObject({
50
+ loadStrategy: entry.meta.loadStrategy,
51
+ name: entry.meta.name,
52
+ partialLoadMode: entry.meta.partialLoadMode,
53
+ schemaVersion: entry.meta.schemaVersion,
54
+ tableName: entry.meta.tableName,
55
+ usedForPartialIndexes: entry.meta.usedForPartialIndexes,
56
+ }),
57
+ properties: sortObject(Object.fromEntries(properties)),
58
+ };
59
+ };
60
+ const canonicalizeSnapshot = (snapshot) => {
61
+ const models = Object.entries(snapshot.models)
62
+ .toSorted(([a], [b]) => a.localeCompare(b))
63
+ .map(([name, entry]) => [name, canonicalizeModelEntry(entry)]);
64
+ return { models: sortObject(Object.fromEntries(models)) };
65
+ };
66
+ /**
67
+ * Computes a deterministic hash of the model registry snapshot
68
+ */
69
+ export const computeSchemaHash = (input) => {
70
+ const snapshot = isRegistrySnapshot(input) ? input : schemaToSnapshot(input);
71
+ const canonical = canonicalizeSnapshot(snapshot);
72
+ const jsonStr = JSON.stringify(canonical);
73
+ const hash = stableHash64(jsonStr);
74
+ return toHex(hash);
75
+ };
76
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/schema/hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ModelRegistrySnapshot, SchemaDefinition } from "./types.js";
2
+ export declare const isRegistrySnapshot: (value: unknown) => value is ModelRegistrySnapshot;
3
+ export declare const schemaToSnapshot: (schema: SchemaDefinition) => ModelRegistrySnapshot;
4
+ export declare const snapshotToSchemaDefinition: (snapshot: ModelRegistrySnapshot) => SchemaDefinition;
5
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/schema/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,qBAAqB,EAIrB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAKpB,eAAO,MAAM,kBAAkB,GAC7B,OAAO,OAAO,KACb,KAAK,IAAI,qBAoBX,CAAC;AAiGF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,gBAAgB,KACvB,qBAyBF,CAAC;AA2BF,eAAO,MAAM,0BAA0B,GACrC,UAAU,qBAAqB,KAC9B,gBAkEF,CAAC"}
@@ -0,0 +1,194 @@
1
+ import { assignOptionalFields } from "../utils/assign.js";
2
+ const isObject = (value) => typeof value === "object" && value !== null;
3
+ export const isRegistrySnapshot = (value) => {
4
+ if (!isObject(value)) {
5
+ return false;
6
+ }
7
+ const { models } = value;
8
+ if (!isObject(models)) {
9
+ return false;
10
+ }
11
+ const entries = Object.values(models);
12
+ if (entries.length === 0) {
13
+ return true;
14
+ }
15
+ return entries.every((entry) => isObject(entry) &&
16
+ "meta" in entry &&
17
+ "properties" in entry &&
18
+ isObject(entry.meta) &&
19
+ isObject(entry.properties));
20
+ };
21
+ const normalizeRelationKind = (kind) => {
22
+ switch (kind) {
23
+ case "belongsTo":
24
+ case "reference":
25
+ case "referenceModel": {
26
+ return "referenceModel";
27
+ }
28
+ case "hasMany":
29
+ case "referenceCollection": {
30
+ return "referenceCollection";
31
+ }
32
+ case "manyToMany":
33
+ case "referenceArray": {
34
+ return "referenceArray";
35
+ }
36
+ case "backReference": {
37
+ return "backReference";
38
+ }
39
+ default: {
40
+ return "referenceModel";
41
+ }
42
+ }
43
+ };
44
+ const toModelMetadata = (name, model) => {
45
+ const metadata = {
46
+ loadStrategy: model.loadStrategy ?? "instant",
47
+ name,
48
+ };
49
+ assignOptionalFields(metadata, model, [
50
+ "partialLoadMode",
51
+ "usedForPartialIndexes",
52
+ "schemaVersion",
53
+ "tableName",
54
+ ]);
55
+ return metadata;
56
+ };
57
+ const toPropertyFromField = (field) => {
58
+ const meta = {
59
+ type: field.ephemeral ? "ephemeralProperty" : "property",
60
+ };
61
+ assignOptionalFields(meta, field, [
62
+ "lazy",
63
+ "serializer",
64
+ "indexed",
65
+ "nullable",
66
+ ]);
67
+ return meta;
68
+ };
69
+ const toPropertyFromRelation = (relation) => {
70
+ const kind = relation.kind ?? relation.type;
71
+ const meta = {
72
+ referenceModel: relation.model,
73
+ type: normalizeRelationKind(kind),
74
+ };
75
+ assignOptionalFields(meta, relation, [
76
+ "inverseProperty",
77
+ "foreignKey",
78
+ "through",
79
+ "lazy",
80
+ "serializer",
81
+ "indexed",
82
+ "nullable",
83
+ ]);
84
+ return meta;
85
+ };
86
+ const ensurePrimaryField = (fields, primaryKey) => {
87
+ if (fields[primaryKey]) {
88
+ return fields;
89
+ }
90
+ return {
91
+ ...fields,
92
+ [primaryKey]: {},
93
+ };
94
+ };
95
+ export const schemaToSnapshot = (schema) => {
96
+ const models = {};
97
+ for (const [name, model] of Object.entries(schema.models)) {
98
+ const primaryKey = model.primaryKey ?? "id";
99
+ const fields = ensurePrimaryField(model.fields ?? {}, primaryKey);
100
+ const relations = model.relations ?? {};
101
+ const properties = {};
102
+ for (const [fieldName, field] of Object.entries(fields)) {
103
+ properties[fieldName] = toPropertyFromField(field);
104
+ }
105
+ for (const [relationName, relation] of Object.entries(relations)) {
106
+ properties[relationName] = toPropertyFromRelation(relation);
107
+ }
108
+ models[name] = {
109
+ meta: toModelMetadata(name, model),
110
+ properties,
111
+ };
112
+ }
113
+ return { models };
114
+ };
115
+ const relationKindFromProperty = (type) => {
116
+ switch (type) {
117
+ case "referenceModel": {
118
+ return "referenceModel";
119
+ }
120
+ case "referenceCollection": {
121
+ return "referenceCollection";
122
+ }
123
+ case "backReference": {
124
+ return "backReference";
125
+ }
126
+ case "referenceArray": {
127
+ return "referenceArray";
128
+ }
129
+ case "reference": {
130
+ return "reference";
131
+ }
132
+ default: {
133
+ return undefined;
134
+ }
135
+ }
136
+ };
137
+ export const snapshotToSchemaDefinition = (snapshot) => {
138
+ const models = {};
139
+ for (const [name, entry] of Object.entries(snapshot.models)) {
140
+ const fields = {};
141
+ const relations = {};
142
+ for (const [propertyName, property] of Object.entries(entry.properties)) {
143
+ if (property.type === "property" ||
144
+ property.type === "ephemeralProperty" ||
145
+ property.type === "reference") {
146
+ const field = {};
147
+ assignOptionalFields(field, property, [
148
+ "indexed",
149
+ "nullable",
150
+ "serializer",
151
+ "lazy",
152
+ ]);
153
+ if (property.type === "ephemeralProperty") {
154
+ field.ephemeral = true;
155
+ }
156
+ fields[propertyName] = field;
157
+ continue;
158
+ }
159
+ const kind = relationKindFromProperty(property.type);
160
+ if (!(kind && property.referenceModel)) {
161
+ continue;
162
+ }
163
+ const relation = {
164
+ kind,
165
+ model: property.referenceModel,
166
+ };
167
+ assignOptionalFields(relation, property, [
168
+ "inverseProperty",
169
+ "foreignKey",
170
+ "through",
171
+ "lazy",
172
+ "serializer",
173
+ "indexed",
174
+ "nullable",
175
+ ]);
176
+ relations[propertyName] = relation;
177
+ }
178
+ const model = {
179
+ fields,
180
+ loadStrategy: entry.meta.loadStrategy,
181
+ name,
182
+ relations,
183
+ };
184
+ assignOptionalFields(model, entry.meta, [
185
+ "partialLoadMode",
186
+ "usedForPartialIndexes",
187
+ "schemaVersion",
188
+ "tableName",
189
+ ]);
190
+ models[name] = model;
191
+ }
192
+ return { models };
193
+ };
194
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/schema/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import type { ModelConstructor, ModelDefinition, ModelMetadata, ModelRegistrySnapshot, PropertyMetadata, SchemaDefinition } from "./types.js";
2
+ /**
3
+ * Runtime registry for model metadata (Done).
4
+ *
5
+ * Static methods operate on the global decorator-driven registry, populated at
6
+ * import time by @ClientModel/@Property decorators.
7
+ *
8
+ * Instance methods operate on a frozen schema snapshot, used by transport
9
+ * layers and server-side code.
10
+ */
11
+ export declare class ModelRegistry {
12
+ static modelLookup: Map<string, ModelConstructor>;
13
+ static modelMetadata: Map<string, ModelMetadata>;
14
+ static modelPropertyLookup: Map<string, Map<string, PropertyMetadata>>;
15
+ static modelReferencedPropertyLookup: Map<string, Map<string, PropertyMetadata>>;
16
+ static __schemaHash: string;
17
+ private static constructorLookup;
18
+ private static pendingProperties;
19
+ private readonly snapshotData;
20
+ private readonly schemaHash;
21
+ private readonly models;
22
+ constructor(schema?: SchemaDefinition | ModelRegistrySnapshot);
23
+ /**
24
+ * Registers a model and finalizes any pending property metadata.
25
+ */
26
+ static registerModel(modelName: string, ctor: ModelConstructor, metadata: ModelMetadata): void;
27
+ /**
28
+ * Registers a property for a model constructor or model name.
29
+ */
30
+ static registerProperty(target: ModelConstructor | object, propertyName: string, metadata: PropertyMetadata): void;
31
+ /**
32
+ * Global: Returns the model metadata from the global decorator registry.
33
+ */
34
+ static getModelMetadata(modelName: string): ModelMetadata | undefined;
35
+ /**
36
+ * Snapshot: Returns the model metadata from this schema snapshot.
37
+ */
38
+ getModelMetadata(modelName: string): ModelMetadata | undefined;
39
+ /**
40
+ * Returns the model constructor.
41
+ */
42
+ static getModelConstructor(modelName: string): ModelConstructor | undefined;
43
+ /**
44
+ * Returns the model name for a constructor.
45
+ */
46
+ static getModelName(ctor: ModelConstructor): string | undefined;
47
+ /**
48
+ * Global: Returns all model names from the global decorator registry.
49
+ */
50
+ static getModelNames(): string[];
51
+ /**
52
+ * Snapshot: Returns all model names from this schema snapshot.
53
+ */
54
+ getModelNames(): string[];
55
+ /**
56
+ * Global: Checks whether a model is registered in the global decorator registry.
57
+ */
58
+ static hasModel(modelName: string): boolean;
59
+ /**
60
+ * Snapshot: Checks whether a model exists in this schema snapshot.
61
+ */
62
+ hasModel(modelName: string): boolean;
63
+ /**
64
+ * Global: Returns all model metadata entries from the global decorator registry.
65
+ */
66
+ static getModelMetadataEntries(): [string, ModelMetadata][];
67
+ /**
68
+ * Snapshot: Returns all model metadata entries from this schema snapshot.
69
+ */
70
+ getModelMetadataEntries(): [string, ModelMetadata][];
71
+ /**
72
+ * Global: Returns bootstrap model names (instant load strategy) from the global decorator registry.
73
+ */
74
+ static getBootstrapModelNames(): string[];
75
+ /**
76
+ * Snapshot: Returns bootstrap model names (instant load strategy) from this schema snapshot.
77
+ */
78
+ getBootstrapModelNames(): string[];
79
+ /**
80
+ * Global: Returns partial model names (lazy-hydrated) from the global decorator registry.
81
+ */
82
+ static getPartialModelNames(): string[];
83
+ /**
84
+ * Snapshot: Returns partial model names (lazy-hydrated) from this schema snapshot.
85
+ */
86
+ getPartialModelNames(): string[];
87
+ /**
88
+ * Global: Returns property metadata for a model from the global decorator registry.
89
+ */
90
+ static getModelProperties(modelName: string): Map<string, PropertyMetadata>;
91
+ /**
92
+ * Snapshot: Returns property metadata for a model from this schema snapshot.
93
+ */
94
+ getModelProperties(modelName: string): Map<string, PropertyMetadata>;
95
+ /**
96
+ * Returns referenced property metadata for a model.
97
+ */
98
+ static getReferencedProperties(modelName: string): Map<string, PropertyMetadata>;
99
+ /**
100
+ * Global: Returns property names for hashing and storage from the global decorator registry.
101
+ */
102
+ static getPropertyNames(modelName: string): string[];
103
+ /**
104
+ * Snapshot: Returns property names for hashing and storage from this schema snapshot.
105
+ */
106
+ getPropertyNames(modelName: string): string[];
107
+ /**
108
+ * Global: Returns the schema hash from the global decorator registry.
109
+ */
110
+ static getSchemaHash(): string;
111
+ /**
112
+ * Snapshot: Returns the schema hash from this schema snapshot.
113
+ */
114
+ getSchemaHash(): string;
115
+ /**
116
+ * Global: Creates a snapshot of the global decorator registry.
117
+ */
118
+ static snapshot(): ModelRegistrySnapshot;
119
+ /**
120
+ * Snapshot: Returns this frozen schema snapshot.
121
+ */
122
+ snapshot(): ModelRegistrySnapshot;
123
+ private static registerPropertyMap;
124
+ private static resolveConstructor;
125
+ private static normalizeModelDefinition;
126
+ /**
127
+ * Returns the model definition.
128
+ */
129
+ getModel(modelName: string): ModelDefinition | undefined;
130
+ /**
131
+ * Returns all model definitions.
132
+ */
133
+ getAllModels(): ModelDefinition[];
134
+ /**
135
+ * Returns model definitions that should be loaded during bootstrap.
136
+ */
137
+ getBootstrapModels(): ModelDefinition[];
138
+ /**
139
+ * Returns model definitions that are partial (lazy-hydrated).
140
+ */
141
+ getPartialModels(): ModelDefinition[];
142
+ /**
143
+ * Returns the primary key for a model (defaults to id).
144
+ */
145
+ getPrimaryKey(modelName: string): string;
146
+ }
147
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/schema/registry.ts"],"names":[],"mappings":"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"}