@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,181 @@
1
+ import { ModelRegistry } from "../schema/registry.js";
2
+ import { CachedPromise } from "./cached-promise.js";
3
+ const inferredCollectionRelationCache = new Map();
4
+ const inferCollectionRelation = (ownerModelName, propertyName) => {
5
+ const cacheKey = `${ModelRegistry.getSchemaHash()}:${ownerModelName}:${propertyName}`;
6
+ const cached = inferredCollectionRelationCache.get(cacheKey);
7
+ if (cached !== undefined) {
8
+ return cached;
9
+ }
10
+ for (const modelName of ModelRegistry.getModelNames()) {
11
+ const properties = ModelRegistry.getModelProperties(modelName);
12
+ for (const meta of properties.values()) {
13
+ if (meta.inverseProperty === propertyName &&
14
+ meta.referenceModel === ownerModelName &&
15
+ meta.foreignKey) {
16
+ const inferred = { foreignKey: meta.foreignKey, modelName };
17
+ inferredCollectionRelationCache.set(cacheKey, inferred);
18
+ return inferred;
19
+ }
20
+ }
21
+ }
22
+ inferredCollectionRelationCache.set(cacheKey, null);
23
+ return null;
24
+ };
25
+ export class LazyCollection {
26
+ elementsCache = [];
27
+ hydrated = false;
28
+ hydrating;
29
+ owner;
30
+ propertyName;
31
+ modelName;
32
+ foreignKey;
33
+ attached = false;
34
+ constructor(items) {
35
+ if (items !== undefined) {
36
+ this.elementsCache = [...items];
37
+ this.hydrated = true;
38
+ }
39
+ }
40
+ attach(owner, propertyName, context = {}) {
41
+ if (this.attached &&
42
+ this.owner === owner &&
43
+ this.propertyName === propertyName) {
44
+ return;
45
+ }
46
+ this.owner = owner;
47
+ this.propertyName = propertyName;
48
+ this.modelName = context.modelName ?? this.modelName;
49
+ this.foreignKey = context.foreignKey ?? this.foreignKey;
50
+ if (!(this.modelName && this.foreignKey)) {
51
+ const ownerModelName = owner.__modelName;
52
+ const inferred = inferCollectionRelation(ownerModelName, propertyName);
53
+ if (inferred) {
54
+ this.modelName = this.modelName ?? inferred.modelName;
55
+ this.foreignKey = this.foreignKey ?? inferred.foreignKey;
56
+ }
57
+ }
58
+ this.attached = true;
59
+ }
60
+ ensureHydrating() {
61
+ if (this.hydrated || this.hydrating) {
62
+ return;
63
+ }
64
+ // oxlint-disable-next-line prefer-await-to-then -- fire-and-forget pattern
65
+ this.hydrate().catch(() => {
66
+ /* noop */
67
+ });
68
+ }
69
+ get elements() {
70
+ this.ensureHydrating();
71
+ return this.elementsCache;
72
+ }
73
+ get length() {
74
+ this.ensureHydrating();
75
+ return this.elementsCache.length;
76
+ }
77
+ map(callback, thisArg) {
78
+ this.ensureHydrating();
79
+ // oxlint-disable-next-line no-array-method-this-argument
80
+ return this.elementsCache.map(callback, thisArg);
81
+ }
82
+ filter(callback, thisArg) {
83
+ this.ensureHydrating();
84
+ // oxlint-disable-next-line no-array-method-this-argument
85
+ return this.elementsCache.filter(callback, thisArg);
86
+ }
87
+ find(callback, thisArg
88
+ // oxlint-disable-next-line no-array-method-this-argument
89
+ ) {
90
+ this.ensureHydrating();
91
+ // oxlint-disable-next-line no-array-method-this-argument
92
+ return this.elementsCache.find(callback, thisArg);
93
+ }
94
+ every(callback,
95
+ // oxlint-disable-next-line no-array-method-this-argument
96
+ thisArg) {
97
+ this.ensureHydrating();
98
+ // oxlint-disable-next-line no-array-method-this-argument
99
+ return this.elementsCache.every(callback, thisArg);
100
+ }
101
+ add(item) {
102
+ this.ensureHydrating();
103
+ this.elementsCache.push(item);
104
+ }
105
+ remove(item) {
106
+ this.ensureHydrating();
107
+ const index = this.elementsCache.indexOf(item);
108
+ if (index === -1) {
109
+ return false;
110
+ }
111
+ this.elementsCache.splice(index, 1);
112
+ return true;
113
+ }
114
+ clear() {
115
+ this.ensureHydrating();
116
+ this.elementsCache = [];
117
+ this.hydrated = true;
118
+ }
119
+ toArray() {
120
+ this.ensureHydrating();
121
+ return [...this.elementsCache];
122
+ }
123
+ [Symbol.iterator]() {
124
+ this.ensureHydrating();
125
+ return this.elementsCache[Symbol.iterator]();
126
+ }
127
+ hydrate() {
128
+ if (this.hydrated) {
129
+ return Promise.resolve(this.elementsCache);
130
+ }
131
+ if (this.hydrating) {
132
+ return this.hydrating.getPromise();
133
+ }
134
+ if (!(this.owner && this.modelName && this.foreignKey)) {
135
+ return Promise.resolve(this.elementsCache);
136
+ }
137
+ const promise = (async () => {
138
+ try {
139
+ const items = await this.loadElements();
140
+ this.elementsCache = items;
141
+ this.hydrated = true;
142
+ return items;
143
+ }
144
+ catch (error) {
145
+ this.hydrating = undefined;
146
+ throw error;
147
+ }
148
+ })();
149
+ const cached = new CachedPromise(promise);
150
+ this.hydrating = cached;
151
+ return cached.getPromise();
152
+ }
153
+ async loadElements() {
154
+ const { owner, modelName, foreignKey } = this;
155
+ if (!(owner && modelName && foreignKey)) {
156
+ return this.elementsCache;
157
+ }
158
+ const store = owner.store;
159
+ const ownerId = owner.id;
160
+ const loadByIndex = store?.loadByIndex ?? store?.getByIndex;
161
+ if (!(store && ownerId && loadByIndex)) {
162
+ return this.elementsCache;
163
+ }
164
+ const rows = await loadByIndex(modelName, foreignKey, ownerId);
165
+ const ids = rows
166
+ .map((row) => row.id)
167
+ .filter((id) => typeof id === "string");
168
+ if (!store.get) {
169
+ // oxlint-disable-next-line no-return-wrap
170
+ return rows;
171
+ }
172
+ // oxlint-disable-next-line prefer-native-coercion-functions
173
+ // oxlint-disable-next-line no-return-wrap
174
+ const items = await Promise.all(
175
+ // oxlint-disable-next-line no-return-wrap
176
+ ids.map((id) => Promise.resolve(store.get?.(modelName, id))));
177
+ // oxlint-disable-next-line prefer-native-coercion-functions
178
+ return items.filter((item) => Boolean(item));
179
+ }
180
+ }
181
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/model/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Model } from "./base-model.js";
2
+ import type { CachedPromise } from "./cached-promise.js";
3
+ export type LazyReference<T extends Model> = CachedPromise<T | undefined>;
4
+ export type Hydrated<T extends Model> = T extends {
5
+ hydrated: true;
6
+ } ? T : T & {
7
+ [P in keyof T]: Required<T>[P] extends LazyReference<infer U extends Model> ? LazyReference<U> & {
8
+ value: U;
9
+ } : T[P];
10
+ } & {
11
+ hydrated: true;
12
+ };
13
+ //# sourceMappingURL=hydration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../src/model/hydration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,KAAK,IAAI,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAE1E,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAChE,CAAC,GACD,CAAC,GAAG;KACD,CAAC,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,CAClD,MAAM,CAAC,SAAS,KAAK,CACtB,GACG,aAAa,CAAC,CAAC,CAAC,GAAG;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,GAC/B,CAAC,CAAC,CAAC,CAAC;CACT,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../src/model/hydration.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ type BoxFactory = (initialValue: unknown) => {
2
+ get(): unknown;
3
+ set(value: unknown): void;
4
+ };
5
+ /**
6
+ * Registers a custom box factory for creating observable property containers.
7
+ * Called by @stratasync/mobx to plug in MobX observable.box at runtime.
8
+ */
9
+ export declare const setBoxFactory: (factory: BoxFactory) => void;
10
+ /**
11
+ * Makes a property observable using Object.defineProperty.
12
+ */
13
+ export declare const makeObservableProperty: (target: object, propertyName: string) => void;
14
+ /**
15
+ * Defines a reference model property that proxies to a reference ID property.
16
+ */
17
+ export declare const makeReferenceModelProperty: (target: object, propertyName: string, referenceIdKey: string, referenceModelName: string) => void;
18
+ /**
19
+ * Defines a reference model property that returns a CachedPromise.
20
+ */
21
+ export declare const makeCachedReferenceModelProperty: (target: object, propertyName: string, referenceIdKey: string, referenceModelName: string) => void;
22
+ export {};
23
+ //# sourceMappingURL=observability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/model/observability.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG,CAAC,YAAY,EAAE,OAAO,KAAK;IAC3C,GAAG,IAAI,OAAO,CAAC;IACf,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B,CAAC;AA0BF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,UAAU,KAAG,IAEnD,CAAC;AAqCF;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,EACd,cAAc,MAAM,KACnB,IAgCF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,GACrC,QAAQ,MAAM,EACd,cAAc,MAAM,EACpB,gBAAgB,MAAM,EACtB,oBAAoB,MAAM,KACzB,IAmBF,CAAC;AAwCF;;GAEG;AACH,eAAO,MAAM,gCAAgC,GAC3C,QAAQ,MAAM,EACd,cAAc,MAAM,EACpB,gBAAgB,MAAM,EACtB,oBAAoB,MAAM,KACzB,IA8CF,CAAC"}
@@ -0,0 +1,162 @@
1
+ import { CachedPromise } from "./cached-promise.js";
2
+ /**
3
+ * Default box factory that creates a plain get/set wrapper with no reactivity.
4
+ * Replaced at runtime by sync-mobx with a MobX observable.box factory.
5
+ */
6
+ let boxFactory = (initialValue) => {
7
+ let value = initialValue;
8
+ return {
9
+ get: () => value,
10
+ set: (v) => {
11
+ value = v;
12
+ },
13
+ };
14
+ };
15
+ /**
16
+ * Registers a custom box factory for creating observable property containers.
17
+ * Called by @stratasync/mobx to plug in MobX observable.box at runtime.
18
+ */
19
+ export const setBoxFactory = (factory) => {
20
+ boxFactory = factory;
21
+ };
22
+ const ensureBox = (target, key, initialValue) => {
23
+ const existing = target[key];
24
+ if (existing) {
25
+ return existing;
26
+ }
27
+ const box = boxFactory(initialValue);
28
+ target[key] = box;
29
+ return box;
30
+ };
31
+ const getBox = (target, key) => target[key];
32
+ const getBackingValue = (instance, key) => {
33
+ const data = instance.__data;
34
+ return data ? data[key] : undefined;
35
+ };
36
+ const setBackingValue = (instance, key, value) => {
37
+ const data = instance.__data;
38
+ if (data) {
39
+ data[key] = value;
40
+ }
41
+ };
42
+ /**
43
+ * Makes a property observable using Object.defineProperty.
44
+ */
45
+ export const makeObservableProperty = (target, propertyName) => {
46
+ Object.defineProperty(target, propertyName, {
47
+ configurable: true,
48
+ enumerable: true,
49
+ get() {
50
+ const self = this;
51
+ const box = self._mobx ? getBox(self._mobx, propertyName) : undefined;
52
+ if (box) {
53
+ return box.get();
54
+ }
55
+ return getBackingValue(this, propertyName);
56
+ },
57
+ set(value) {
58
+ const self = this;
59
+ const { _mobx: boxes } = self;
60
+ const oldValue = boxes
61
+ ? (getBox(boxes, propertyName)?.get() ??
62
+ getBackingValue(this, propertyName))
63
+ : getBackingValue(this, propertyName);
64
+ if (boxes) {
65
+ const box = ensureBox(boxes, propertyName, value);
66
+ box.set(value);
67
+ }
68
+ setBackingValue(this, propertyName, value);
69
+ if (typeof self.propertyChanged === "function") {
70
+ self.propertyChanged(propertyName, oldValue, value);
71
+ }
72
+ },
73
+ });
74
+ };
75
+ /**
76
+ * Defines a reference model property that proxies to a reference ID property.
77
+ */
78
+ export const makeReferenceModelProperty = (target, propertyName, referenceIdKey, referenceModelName) => {
79
+ Object.defineProperty(target, propertyName, {
80
+ configurable: true,
81
+ enumerable: true,
82
+ get() {
83
+ const id = this[referenceIdKey];
84
+ if (typeof id !== "string") {
85
+ return null;
86
+ }
87
+ const { store } = this;
88
+ return store?.get(referenceModelName, id) ?? null;
89
+ },
90
+ set(value) {
91
+ const refId = value?.id ?? null;
92
+ this[referenceIdKey] = refId;
93
+ },
94
+ });
95
+ };
96
+ const resolveCachedReference = (store, modelName, id) => {
97
+ const result = store.get(modelName, id);
98
+ if (result instanceof CachedPromise) {
99
+ return result;
100
+ }
101
+ // Handle synchronous values directly without wrapping in Promise
102
+ if (!(result instanceof Promise)) {
103
+ const value = result === null || result === undefined ? undefined : result;
104
+ return CachedPromise.resolve(value);
105
+ }
106
+ // Handle actual promises
107
+ const promise = (async () => {
108
+ const value = await result;
109
+ return value === null || value === undefined ? undefined : value;
110
+ })();
111
+ return new CachedPromise(promise);
112
+ };
113
+ const getCachedPromiseMap = (instance) => {
114
+ const target = instance;
115
+ if (!target.__cachedPromises) {
116
+ target.__cachedPromises = new Map();
117
+ }
118
+ return target.__cachedPromises;
119
+ };
120
+ /**
121
+ * Defines a reference model property that returns a CachedPromise.
122
+ */
123
+ export const makeCachedReferenceModelProperty = (target, propertyName, referenceIdKey, referenceModelName) => {
124
+ Object.defineProperty(target, propertyName, {
125
+ configurable: true,
126
+ enumerable: true,
127
+ get() {
128
+ const id = this[referenceIdKey];
129
+ if (typeof id !== "string") {
130
+ return CachedPromise.resolve();
131
+ }
132
+ const { store } = this;
133
+ if (!store) {
134
+ return CachedPromise.resolve();
135
+ }
136
+ const cache = getCachedPromiseMap(this);
137
+ const cached = cache.get(propertyName);
138
+ if (cached && cached.id === id) {
139
+ return cached.promise;
140
+ }
141
+ const promise = resolveCachedReference(store, referenceModelName, id);
142
+ cache.set(propertyName, { id, promise });
143
+ return promise;
144
+ },
145
+ set(value) {
146
+ if (value === null || value === undefined) {
147
+ this[referenceIdKey] = null;
148
+ return;
149
+ }
150
+ if (value instanceof CachedPromise) {
151
+ const resolved = value.value;
152
+ if (resolved?.id) {
153
+ this[referenceIdKey] = resolved.id;
154
+ }
155
+ return;
156
+ }
157
+ const refId = value?.id ?? null;
158
+ this[referenceIdKey] = refId;
159
+ },
160
+ });
161
+ };
162
+ //# sourceMappingURL=observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/model/observability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Reactivity adapter interface for integrating with state management libraries
3
+ * (MobX, Zustand, Jotai, etc.)
4
+ *
5
+ * The sync engine uses this adapter to make model instances reactive
6
+ * without being coupled to a specific state management solution.
7
+ */
8
+ /**
9
+ * Observable value container
10
+ */
11
+ export interface ObservableBox<T> {
12
+ /** Get the current value */
13
+ get(): T;
14
+ /** Set a new value */
15
+ set(value: T): void;
16
+ }
17
+ /**
18
+ * Observable map container
19
+ */
20
+ export interface ObservableMap<K, V> {
21
+ /** Get a value by key */
22
+ get(key: K): V | undefined;
23
+ /** Set a value by key */
24
+ set(key: K, value: V): void;
25
+ /** Check if key exists */
26
+ has(key: K): boolean;
27
+ /** Delete a key */
28
+ delete(key: K): boolean;
29
+ /** Clear all entries */
30
+ clear(): void;
31
+ /** Get all keys */
32
+ keys(): IterableIterator<K>;
33
+ /** Get all values */
34
+ values(): IterableIterator<V>;
35
+ /** Get all entries */
36
+ entries(): IterableIterator<[K, V]>;
37
+ /** Number of entries */
38
+ size: number;
39
+ /** Iterate over entries */
40
+ forEach(callback: (value: V, key: K) => void): void;
41
+ }
42
+ /**
43
+ * Observable array container
44
+ */
45
+ export interface ObservableArray<T> {
46
+ /** Get item at index */
47
+ get(index: number): T | undefined;
48
+ /** Get the underlying array */
49
+ toArray(): T[];
50
+ /** Push items to the end */
51
+ push(...items: T[]): number;
52
+ /** Remove and return the last item */
53
+ pop(): T | undefined;
54
+ /** Remove items by predicate */
55
+ remove(predicate: (item: T) => boolean): T[];
56
+ /** Replace all items */
57
+ replace(items: T[]): void;
58
+ /** Clear all items */
59
+ clear(): void;
60
+ /** Find an item */
61
+ find(predicate: (item: T) => boolean): T | undefined;
62
+ /** Filter items */
63
+ filter(predicate: (item: T) => boolean): T[];
64
+ /** Map items */
65
+ map<U>(mapper: (item: T) => U): U[];
66
+ /** Array length */
67
+ length: number;
68
+ /** Iterate over items */
69
+ [Symbol.iterator](): Iterator<T>;
70
+ }
71
+ /**
72
+ * Options for creating observable objects
73
+ */
74
+ export interface ObservableOptions {
75
+ /** Make the object deeply observable */
76
+ deep?: boolean;
77
+ /** Name for debugging */
78
+ name?: string;
79
+ }
80
+ /**
81
+ * Batch update function type
82
+ */
83
+ export type BatchUpdateFn = (fn: () => void) => void;
84
+ /**
85
+ * Dispose function type
86
+ */
87
+ export type DisposeFn = () => void;
88
+ /**
89
+ * Reaction options
90
+ */
91
+ export interface ReactionOptions {
92
+ /** Fire immediately */
93
+ fireImmediately?: boolean;
94
+ /** Delay in ms */
95
+ delay?: number;
96
+ /** Name for debugging */
97
+ name?: string;
98
+ }
99
+ /**
100
+ * Reactivity adapter interface
101
+ *
102
+ * Implement this interface to integrate with your preferred
103
+ * state management library.
104
+ */
105
+ export interface ReactivityAdapter {
106
+ /**
107
+ * Create an observable box (single value container)
108
+ */
109
+ createBox<T>(initialValue: T, options?: ObservableOptions): ObservableBox<T>;
110
+ /**
111
+ * Create an observable map
112
+ */
113
+ createMap<K, V>(entries?: Iterable<[K, V]>, options?: ObservableOptions): ObservableMap<K, V>;
114
+ /**
115
+ * Create an observable array
116
+ */
117
+ createArray<T>(items?: T[], options?: ObservableOptions): ObservableArray<T>;
118
+ /**
119
+ * Make an object observable (deep by default)
120
+ */
121
+ makeObservable<T extends object>(target: T, options?: ObservableOptions): T;
122
+ /**
123
+ * Batch multiple updates into a single transaction
124
+ */
125
+ batch: BatchUpdateFn;
126
+ /**
127
+ * Run a function in an action context (for MobX strict mode)
128
+ */
129
+ runInAction<T>(fn: () => T): T;
130
+ /**
131
+ * Create a reaction that runs when observed values change
132
+ */
133
+ reaction<T>(expression: () => T, effect: (value: T) => void, options?: ReactionOptions): DisposeFn;
134
+ /**
135
+ * Create a computed value
136
+ */
137
+ computed<T>(getter: () => T, options?: ObservableOptions): {
138
+ get(): T;
139
+ };
140
+ }
141
+ /**
142
+ * No-op reactivity adapter for non-reactive usage
143
+ */
144
+ export declare const noopReactivityAdapter: ReactivityAdapter;
145
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/reactivity/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Reactivity adapter interface for integrating with state management libraries
3
+ * (MobX, Zustand, Jotai, etc.)
4
+ *
5
+ * The sync engine uses this adapter to make model instances reactive
6
+ * without being coupled to a specific state management solution.
7
+ */
8
+ /**
9
+ * No-op reactivity adapter for non-reactive usage
10
+ */
11
+ export const noopReactivityAdapter = {
12
+ batch: (fn) => fn(),
13
+ computed(getter) {
14
+ return { get: getter };
15
+ },
16
+ createArray(items) {
17
+ const arr = items ? [...items] : [];
18
+ return {
19
+ [Symbol.iterator]: () => arr[Symbol.iterator](),
20
+ clear: () => {
21
+ arr.length = 0;
22
+ },
23
+ filter: (predicate) => arr.filter(predicate),
24
+ find: (predicate) => arr.find(predicate),
25
+ get: (index) => arr[index],
26
+ get length() {
27
+ return arr.length;
28
+ },
29
+ map: (mapper) => arr.map(mapper),
30
+ pop: () => arr.pop(),
31
+ push: (...newItems) => arr.push(...newItems),
32
+ remove: (predicate) => {
33
+ const removed = [];
34
+ for (let i = arr.length - 1; i >= 0; i -= 1) {
35
+ const item = arr[i];
36
+ if (item !== undefined && predicate(item)) {
37
+ removed.push(item);
38
+ arr.splice(i, 1);
39
+ }
40
+ }
41
+ return removed;
42
+ },
43
+ replace: (newItems) => {
44
+ arr.length = 0;
45
+ arr.push(...newItems);
46
+ },
47
+ toArray: () => [...arr],
48
+ };
49
+ },
50
+ createBox(initialValue) {
51
+ let value = initialValue;
52
+ return {
53
+ get: () => value,
54
+ set: (v) => {
55
+ value = v;
56
+ },
57
+ };
58
+ },
59
+ createMap(entries) {
60
+ const map = new Map(entries);
61
+ return {
62
+ clear: () => map.clear(),
63
+ delete: (key) => map.delete(key),
64
+ entries: () => map.entries(),
65
+ // oxlint-disable-next-line prefer-await-to-callbacks -- event listener registration
66
+ // oxlint-disable-next-line no-array-for-each
67
+ // oxlint-disable-next-line prefer-await-to-callbacks
68
+ // oxlint-disable-next-line no-array-for-each
69
+ // oxlint-disable-next-line no-array-for-each, prefer-await-to-callbacks
70
+ forEach: (cb) => map.forEach(cb),
71
+ get: (key) => map.get(key),
72
+ has: (key) => map.has(key),
73
+ keys: () => map.keys(),
74
+ set: (key, value) => {
75
+ map.set(key, value);
76
+ },
77
+ get size() {
78
+ return map.size;
79
+ },
80
+ values: () => map.values(),
81
+ };
82
+ },
83
+ makeObservable(target) {
84
+ return target;
85
+ },
86
+ reaction(_expression, _effect, _options) {
87
+ return () => {
88
+ // no-op
89
+ };
90
+ },
91
+ runInAction(fn) {
92
+ return fn();
93
+ },
94
+ };
95
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/reactivity/adapter.ts"],"names":[],"mappings":"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"}