@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.
- package/README.md +83 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/model/base-model.d.ts +82 -0
- package/dist/model/base-model.d.ts.map +1 -0
- package/dist/model/base-model.js +219 -0
- package/dist/model/base-model.js.map +1 -0
- package/dist/model/cached-promise.d.ts +15 -0
- package/dist/model/cached-promise.d.ts.map +1 -0
- package/dist/model/cached-promise.js +50 -0
- package/dist/model/cached-promise.js.map +1 -0
- package/dist/model/collection.d.ts +33 -0
- package/dist/model/collection.d.ts.map +1 -0
- package/dist/model/collection.js +181 -0
- package/dist/model/collection.js.map +1 -0
- package/dist/model/hydration.d.ts +13 -0
- package/dist/model/hydration.d.ts.map +1 -0
- package/dist/model/hydration.js +2 -0
- package/dist/model/hydration.js.map +1 -0
- package/dist/model/observability.d.ts +23 -0
- package/dist/model/observability.d.ts.map +1 -0
- package/dist/model/observability.js +162 -0
- package/dist/model/observability.js.map +1 -0
- package/dist/reactivity/adapter.d.ts +145 -0
- package/dist/reactivity/adapter.d.ts.map +1 -0
- package/dist/reactivity/adapter.js +95 -0
- package/dist/reactivity/adapter.js.map +1 -0
- package/dist/schema/decorators.d.ts +8 -0
- package/dist/schema/decorators.d.ts.map +1 -0
- package/dist/schema/decorators.js +117 -0
- package/dist/schema/decorators.js.map +1 -0
- package/dist/schema/hash.d.ts +6 -0
- package/dist/schema/hash.d.ts.map +1 -0
- package/dist/schema/hash.js +76 -0
- package/dist/schema/hash.js.map +1 -0
- package/dist/schema/normalize.d.ts +5 -0
- package/dist/schema/normalize.d.ts.map +1 -0
- package/dist/schema/normalize.js +194 -0
- package/dist/schema/normalize.js.map +1 -0
- package/dist/schema/registry.d.ts +147 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +304 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/schema/types.d.ts +215 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/store/types.d.ts +14 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/sync/delta-applier.d.ts +52 -0
- package/dist/sync/delta-applier.d.ts.map +1 -0
- package/dist/sync/delta-applier.js +110 -0
- package/dist/sync/delta-applier.js.map +1 -0
- package/dist/sync/rebase.d.ts +57 -0
- package/dist/sync/rebase.d.ts.map +1 -0
- package/dist/sync/rebase.js +155 -0
- package/dist/sync/rebase.js.map +1 -0
- package/dist/sync/sync-id.d.ts +17 -0
- package/dist/sync/sync-id.d.ts.map +1 -0
- package/dist/sync/sync-id.js +26 -0
- package/dist/sync/sync-id.js.map +1 -0
- package/dist/sync/types.d.ts +152 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/transaction/archive.d.ts +16 -0
- package/dist/transaction/archive.d.ts.map +1 -0
- package/dist/transaction/archive.js +23 -0
- package/dist/transaction/archive.js.map +1 -0
- package/dist/transaction/create.d.ts +31 -0
- package/dist/transaction/create.d.ts.map +1 -0
- package/dist/transaction/create.js +121 -0
- package/dist/transaction/create.js.map +1 -0
- package/dist/transaction/types.d.ts +86 -0
- package/dist/transaction/types.d.ts.map +1 -0
- package/dist/transaction/types.js +2 -0
- package/dist/transaction/types.js.map +1 -0
- package/dist/utils/assign.d.ts +9 -0
- package/dist/utils/assign.d.ts.map +1 -0
- package/dist/utils/assign.js +20 -0
- package/dist/utils/assign.js.map +1 -0
- package/dist/utils/idempotency.d.ts +16 -0
- package/dist/utils/idempotency.d.ts.map +1 -0
- package/dist/utils/idempotency.js +39 -0
- package/dist/utils/idempotency.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0BpD,MAAM,+BAA+B,GAAG,IAAI,GAAG,EAG5C,CAAC;AAEJ,MAAM,uBAAuB,GAAG,CAC9B,cAAsB,EACtB,YAAoB,EACK,EAAE;IAC3B,MAAM,QAAQ,GAAG,GAAG,aAAa,CAAC,aAAa,EAAE,IAAI,cAAc,IAAI,YAAY,EAAE,CAAC;IACtF,MAAM,MAAM,GAAG,+BAA+B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,aAAa,EAAE,EAAE,CAAC;QACtD,MAAM,UAAU,GAAG,aAAa,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IACE,IAAI,CAAC,eAAe,KAAK,YAAY;gBACrC,IAAI,CAAC,cAAc,KAAK,cAAc;gBACtC,IAAI,CAAC,UAAU,EACf,CAAC;gBACD,MAAM,QAAQ,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;gBAC5D,+BAA+B,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACxD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,+BAA+B,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,OAAO,cAAc;IACjB,aAAa,GAAQ,EAAE,CAAC;IACxB,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,CAAsB;IAC/B,KAAK,CAAS;IACd,YAAY,CAAU;IACtB,SAAS,CAAU;IACnB,UAAU,CAAU;IACpB,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,KAAmB;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,CACJ,KAAY,EACZ,YAAoB,EACpB,UAA6B,EAAE;QAE/B,IACE,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,KAAK,KAAK,KAAK;YACpB,IAAI,CAAC,YAAY,KAAK,YAAY,EAClC,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QAExD,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC;YACzC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YACvE,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;gBACtD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,2EAA2E;QAC3E,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;YACxB,UAAU;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,GAAG,CACD,QAAoD,EACpD,OAAiB;QAEjB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,yDAAyD;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CACJ,QAA0D,EAC1D,OAAiB;QAEjB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,yDAAyD;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CACF,QAA0D,EAC1D,OAAiB;IACjB,yDAAyD;;QAEzD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,yDAAyD;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CACH,QAA0D;IAC1D,yDAAyD;IACzD,OAAiB;QAEjB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,yDAAyD;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAED,GAAG,CAAC,IAAO;QACT,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,IAAO;QACZ,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,UAAU,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAoC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,KAAK,EAAE,UAAU,CAAC;QAC5D,IAAI,CAAC,CAAC,KAAK,IAAI,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,SAAS,EACT,UAAU,EACV,OAAO,CACR,CAAC;QAEF,MAAM,GAAG,GAAG,IAAI;aACb,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,0CAA0C;YAC1C,OAAO,IAAsB,CAAC;QAChC,CAAC;QAED,4DAA4D;QAC5D,0CAA0C;QAC1C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG;QAC7B,0CAA0C;QAC1C,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAC7D,CAAC;QAEF,4DAA4D;QAC5D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAa,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
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":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,4BAA4B;IAC5B,GAAG,IAAI,CAAC,CAAC;IACT,sBAAsB;IACtB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,CAAC;IACjC,yBAAyB;IACzB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC3B,yBAAyB;IACzB,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAC5B,0BAA0B;IAC1B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IACrB,mBAAmB;IACnB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC;IACxB,wBAAwB;IACxB,KAAK,IAAI,IAAI,CAAC;IACd,mBAAmB;IACnB,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC5B,qBAAqB;IACrB,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC9B,sBAAsB;IACtB,OAAO,IAAI,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,wBAAwB;IACxB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAClC,+BAA+B;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;IACf,4BAA4B;IAC5B,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;IAC5B,sCAAsC;IACtC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACrB,gCAAgC;IAChC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,CAAC,EAAE,CAAC;IAC7C,wBAAwB;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAC1B,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC;IACrD,mBAAmB;IACnB,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,CAAC,EAAE,CAAC;IAC7C,gBAAgB;IAChB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAE7E;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,CAAC,EACZ,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvB;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAE7E;;OAEG;IACH,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,CAAC,CAAC;IAE5E;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,CAAC,EACR,UAAU,EAAE,MAAM,CAAC,EACnB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,SAAS,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG;QAAE,GAAG,IAAI,CAAC,CAAA;KAAE,CAAC;CACzE;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBA8FnC,CAAC"}
|
|
@@ -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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"}
|