@iamjulianacosta/mobx-data 1.1.0 → 1.4.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 +273 -102
- package/dist/{CacheHandler-BTU_rYkv.js → CacheHandler-BhfbVHed.js} +17 -20
- package/dist/CacheHandler-BhfbVHed.js.map +1 -0
- package/dist/{CacheHandler-CXgY9IJo.cjs → CacheHandler-Q5VXOgh9.cjs} +2 -2
- package/dist/CacheHandler-Q5VXOgh9.cjs.map +1 -0
- package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js +173 -0
- package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js.map +1 -0
- package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs +2 -0
- package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs.map +1 -0
- package/dist/{JsonApiSerializer-BLoE046A.js → JsonApiSerializer-BV61cFAZ.js} +3 -3
- package/dist/JsonApiSerializer-BV61cFAZ.js.map +1 -0
- package/dist/{JsonApiSerializer-DKemcyw-.cjs → JsonApiSerializer-Dt_Y_FIo.cjs} +2 -2
- package/dist/JsonApiSerializer-Dt_Y_FIo.cjs.map +1 -0
- package/dist/JsonSerializer-BzUCyUSf.cjs +2 -0
- package/dist/JsonSerializer-BzUCyUSf.cjs.map +1 -0
- package/dist/JsonSerializer-CFqo6GjC.js +98 -0
- package/dist/JsonSerializer-CFqo6GjC.js.map +1 -0
- package/dist/MdqlMemoryExecutor-BUlsalKm.cjs +2 -0
- package/dist/MdqlMemoryExecutor-BUlsalKm.cjs.map +1 -0
- package/dist/MdqlMemoryExecutor-BWMP31zG.js +127 -0
- package/dist/MdqlMemoryExecutor-BWMP31zG.js.map +1 -0
- package/dist/{MemoryAdapter-Bp-BGHH3.js → MemoryAdapter-BW1HKixm.js} +2 -2
- package/dist/{MemoryAdapter-Bp-BGHH3.js.map → MemoryAdapter-BW1HKixm.js.map} +1 -1
- package/dist/{MemoryAdapter-DH-gzSSl.cjs → MemoryAdapter-C8iXAa2v.cjs} +2 -2
- package/dist/{MemoryAdapter-DH-gzSSl.cjs.map → MemoryAdapter-C8iXAa2v.cjs.map} +1 -1
- package/dist/{ODataAdapter-RQUjVTcf.js → ODataAdapter-CeBJblLQ.js} +25 -22
- package/dist/ODataAdapter-CeBJblLQ.js.map +1 -0
- package/dist/{ODataAdapter-CrDFvBEZ.cjs → ODataAdapter-DdE6MWkG.cjs} +2 -2
- package/dist/ODataAdapter-DdE6MWkG.cjs.map +1 -0
- package/dist/RestAdapter-D7GSrsJo.cjs +2 -0
- package/dist/RestAdapter-D7GSrsJo.cjs.map +1 -0
- package/dist/{RestAdapter-D6bGIHZT.js → RestAdapter-DYUoyV5h.js} +112 -77
- package/dist/RestAdapter-DYUoyV5h.js.map +1 -0
- package/dist/SchemaService-C_pkh-vI.js +180 -0
- package/dist/SchemaService-C_pkh-vI.js.map +1 -0
- package/dist/SchemaService-DbJLoYb9.cjs +2 -0
- package/dist/SchemaService-DbJLoYb9.cjs.map +1 -0
- package/dist/Serializer-Bap9U-kR.cjs +2 -0
- package/dist/Serializer-Bap9U-kR.cjs.map +1 -0
- package/dist/{Serializer-FxJbsZ50.js → Serializer-Ca6w_QNQ.js} +63 -49
- package/dist/Serializer-Ca6w_QNQ.js.map +1 -0
- package/dist/adapter/index.cjs +1 -1
- package/dist/adapter/index.js +2 -2
- package/dist/createStore-7PecKT54.cjs +2 -0
- package/dist/createStore-7PecKT54.cjs.map +1 -0
- package/dist/createStore-BfmRfZ_2.js +1229 -0
- package/dist/createStore-BfmRfZ_2.js.map +1 -0
- package/dist/date-Bj4O2W1F.js.map +1 -1
- package/dist/date-CRCe-9gf.cjs.map +1 -1
- package/dist/decorators-CKneHgoF.js +56 -0
- package/dist/decorators-CKneHgoF.js.map +1 -0
- package/dist/decorators-DCVYKzrL.cjs +2 -0
- package/dist/decorators-DCVYKzrL.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -90
- package/dist/index.js.map +1 -1
- package/dist/inspector/ConsoleInspector.d.ts +49 -0
- package/dist/inspector/ConsoleInspector.d.ts.map +1 -0
- package/dist/inspector/DevToolsBridge.d.ts +21 -0
- package/dist/inspector/DevToolsBridge.d.ts.map +1 -0
- package/dist/inspector/QueryParser.d.ts +21 -0
- package/dist/inspector/QueryParser.d.ts.map +1 -0
- package/dist/inspector/StoreInspector.d.ts +31 -0
- package/dist/inspector/StoreInspector.d.ts.map +1 -0
- package/dist/inspector/index.cjs +17 -0
- package/dist/inspector/index.cjs.map +1 -0
- package/dist/inspector/index.d.ts +9 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +896 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/inspector/integration.d.ts +15 -0
- package/dist/inspector/integration.d.ts.map +1 -0
- package/dist/inspector/serialization.d.ts +7 -0
- package/dist/inspector/serialization.d.ts.map +1 -0
- package/dist/inspector/types.d.ts +139 -0
- package/dist/inspector/types.d.ts.map +1 -0
- package/dist/json-api/index.cjs +1 -1
- package/dist/json-api/index.js +1 -1
- package/dist/mdql/MdqlMemoryExecutor.d.ts +17 -0
- package/dist/mdql/MdqlMemoryExecutor.d.ts.map +1 -0
- package/dist/mdql/MdqlQueryBuilder.d.ts +38 -0
- package/dist/mdql/MdqlQueryBuilder.d.ts.map +1 -0
- package/dist/mdql/MdqlValidator.d.ts +13 -0
- package/dist/mdql/MdqlValidator.d.ts.map +1 -0
- package/dist/mdql/index.d.ts +6 -0
- package/dist/mdql/index.d.ts.map +1 -0
- package/dist/mdql/types.d.ts +48 -0
- package/dist/mdql/types.d.ts.map +1 -0
- package/dist/model/Model.d.ts +4 -0
- package/dist/model/Model.d.ts.map +1 -1
- package/dist/model/Snapshot.d.ts +2 -0
- package/dist/model/Snapshot.d.ts.map +1 -1
- package/dist/model/index.cjs +1 -1
- package/dist/model/index.js +1 -1
- package/dist/odata/ODataAdapter.d.ts.map +1 -1
- package/dist/odata/index.cjs +1 -1
- package/dist/odata/index.js +1 -1
- package/dist/relationships-BgM0NKdb.cjs +2 -0
- package/dist/relationships-BgM0NKdb.cjs.map +1 -0
- package/dist/{relationships-BEXANmWg.js → relationships-DvSi8fVN.js} +37 -28
- package/dist/relationships-DvSi8fVN.js.map +1 -0
- package/dist/request/CacheHandler.d.ts.map +1 -1
- package/dist/request/index.cjs +1 -1
- package/dist/request/index.js +1 -1
- package/dist/schema/SchemaService.d.ts +38 -1
- package/dist/schema/SchemaService.d.ts.map +1 -1
- package/dist/schema/decorators.d.ts +20 -1
- package/dist/schema/decorators.d.ts.map +1 -1
- package/dist/schema/index.cjs +1 -1
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +10 -8
- package/dist/schema/types.d.ts +31 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/serializer/JsonSerializer.d.ts +2 -0
- package/dist/serializer/JsonSerializer.d.ts.map +1 -1
- package/dist/serializer/Serializer.d.ts +9 -0
- package/dist/serializer/Serializer.d.ts.map +1 -1
- package/dist/serializer/index.cjs +1 -1
- package/dist/serializer/index.js +6 -5
- package/dist/serializer/index.js.map +1 -1
- package/dist/store/Store.d.ts +3 -0
- package/dist/store/Store.d.ts.map +1 -1
- package/dist/store/createStore.d.ts +12 -0
- package/dist/store/createStore.d.ts.map +1 -0
- package/dist/store/index.cjs +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +5 -4
- package/dist/types-CC2fG3FP.js +8 -0
- package/dist/types-CC2fG3FP.js.map +1 -0
- package/dist/types-DCLy5XYj.cjs +2 -0
- package/dist/types-DCLy5XYj.cjs.map +1 -0
- package/package.json +7 -1
- package/src/index.ts +3 -0
- package/src/inspector/ConsoleInspector.ts +470 -0
- package/src/inspector/DevToolsBridge.ts +214 -0
- package/src/inspector/QueryParser.ts +343 -0
- package/src/inspector/StoreInspector.ts +162 -0
- package/src/inspector/index.ts +20 -0
- package/src/inspector/integration.ts +56 -0
- package/src/inspector/serialization.ts +100 -0
- package/src/inspector/types.ts +161 -0
- package/src/mdql/MdqlMemoryExecutor.ts +229 -0
- package/src/mdql/MdqlQueryBuilder.ts +170 -0
- package/src/mdql/MdqlValidator.ts +193 -0
- package/src/mdql/index.ts +21 -0
- package/src/mdql/types.ts +107 -0
- package/src/model/Model.ts +15 -0
- package/src/model/Snapshot.ts +3 -0
- package/src/odata/ODataAdapter.ts +4 -1
- package/src/request/CacheHandler.ts +2 -6
- package/src/schema/SchemaService.ts +123 -1
- package/src/schema/decorators.ts +29 -0
- package/src/schema/index.ts +1 -1
- package/src/schema/types.ts +34 -0
- package/src/serializer/JsonSerializer.ts +14 -2
- package/src/serializer/Serializer.ts +24 -1
- package/src/store/Store.ts +57 -14
- package/src/store/createStore.ts +39 -0
- package/src/store/index.ts +1 -0
- package/dist/CacheHandler-BTU_rYkv.js.map +0 -1
- package/dist/CacheHandler-CXgY9IJo.cjs.map +0 -1
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs +0 -2
- package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs.map +0 -1
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js +0 -261
- package/dist/EmbeddedRecordsMixin-VoHluHCT.js.map +0 -1
- package/dist/JsonApiSerializer-BLoE046A.js.map +0 -1
- package/dist/JsonApiSerializer-DKemcyw-.cjs.map +0 -1
- package/dist/ODataAdapter-CrDFvBEZ.cjs.map +0 -1
- package/dist/ODataAdapter-RQUjVTcf.js.map +0 -1
- package/dist/RestAdapter-CSoJg7D2.cjs +0 -2
- package/dist/RestAdapter-CSoJg7D2.cjs.map +0 -1
- package/dist/RestAdapter-D6bGIHZT.js.map +0 -1
- package/dist/SchemaService-DZwkFgZu.js +0 -102
- package/dist/SchemaService-DZwkFgZu.js.map +0 -1
- package/dist/SchemaService-Di_yjVzU.cjs +0 -2
- package/dist/SchemaService-Di_yjVzU.cjs.map +0 -1
- package/dist/Serializer-95gi5edy.cjs +0 -2
- package/dist/Serializer-95gi5edy.cjs.map +0 -1
- package/dist/Serializer-FxJbsZ50.js.map +0 -1
- package/dist/Store-Bm5JivTc.js +0 -957
- package/dist/Store-Bm5JivTc.js.map +0 -1
- package/dist/Store-DX9D0Mmy.cjs +0 -2
- package/dist/Store-DX9D0Mmy.cjs.map +0 -1
- package/dist/cache-utils-B2wFhisx.js +0 -39
- package/dist/cache-utils-B2wFhisx.js.map +0 -1
- package/dist/cache-utils-CSwsqOi3.cjs +0 -2
- package/dist/cache-utils-CSwsqOi3.cjs.map +0 -1
- package/dist/decorators-HQ1KnRdh.cjs +0 -2
- package/dist/decorators-HQ1KnRdh.cjs.map +0 -1
- package/dist/decorators-Zr35qr6A.js +0 -50
- package/dist/decorators-Zr35qr6A.js.map +0 -1
- package/dist/relationships-B55LBaCW.cjs +0 -2
- package/dist/relationships-B55LBaCW.cjs.map +0 -1
- package/dist/relationships-BEXANmWg.js.map +0 -1
- package/dist/types-C9NB2gRj.js +0 -7
- package/dist/types-C9NB2gRj.js.map +0 -1
- package/dist/types-uWOXMPWW.cjs +0 -2
- package/dist/types-uWOXMPWW.cjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,32 +1,33 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
import { a as
|
|
3
|
-
import { S as
|
|
4
|
-
import { A as
|
|
5
|
-
import { A as
|
|
6
|
-
import { A as
|
|
7
|
-
import { M as
|
|
8
|
-
import { S as
|
|
9
|
-
import { E as
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { A as _, M as y, a as b, R as E } from "./types-CC2fG3FP.js";
|
|
2
|
+
import { a as M, b as R, h as P, m as w } from "./decorators-CKneHgoF.js";
|
|
3
|
+
import { S as q } from "./SchemaService-C_pkh-vI.js";
|
|
4
|
+
import { A as N, a as g, E as D, M as K, b as H, S as I, c as j } from "./relationships-DvSi8fVN.js";
|
|
5
|
+
import { a as F, A as J, I as Y, M as z, b as k, d as V, O as v, R as C, S as U, c as $ } from "./createStore-BfmRfZ_2.js";
|
|
6
|
+
import { A as G, a as W, R as X, b as Z, e as ee, p as te } from "./RestAdapter-DYUoyV5h.js";
|
|
7
|
+
import { M as se } from "./MemoryAdapter-BW1HKixm.js";
|
|
8
|
+
import { S as oe } from "./Serializer-Ca6w_QNQ.js";
|
|
9
|
+
import { E as ce, R as ie } from "./EmbeddedRecordsMixin-6mSCXsJ3.js";
|
|
10
|
+
import { J as le } from "./JsonSerializer-CFqo6GjC.js";
|
|
11
|
+
import { B as pe, a as me, D as he, N as Ae, S as Te } from "./date-Bj4O2W1F.js";
|
|
12
|
+
import { C as Se, F as _e, R as ye } from "./CacheHandler-BhfbVHed.js";
|
|
13
|
+
import { J as Ee, a as xe } from "./JsonApiSerializer-BV61cFAZ.js";
|
|
14
|
+
import { O as Re } from "./ODataAdapter-CeBJblLQ.js";
|
|
15
|
+
import { M as we } from "./MdqlMemoryExecutor-BWMP31zG.js";
|
|
16
|
+
const o = "cache-entries", m = 1, h = 36e5;
|
|
17
|
+
class l {
|
|
17
18
|
constructor(e = {}) {
|
|
18
|
-
this._database = null, this._openPromise = null, this._databaseName = e.databaseName ?? "mobx-data-cache", this._defaultTTL = e.defaultTTL ??
|
|
19
|
+
this._database = null, this._openPromise = null, this._databaseName = e.databaseName ?? "mobx-data-cache", this._defaultTTL = e.defaultTTL ?? h;
|
|
19
20
|
}
|
|
20
21
|
get defaultTTL() {
|
|
21
22
|
return this._defaultTTL;
|
|
22
23
|
}
|
|
23
24
|
async open() {
|
|
24
|
-
return this._database ? this._database : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e,
|
|
25
|
-
const t = indexedDB.open(this._databaseName,
|
|
25
|
+
return this._database ? this._database : this._openPromise ? this._openPromise : (this._openPromise = new Promise((e, a) => {
|
|
26
|
+
const t = indexedDB.open(this._databaseName, m);
|
|
26
27
|
t.onupgradeneeded = () => {
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
29
|
-
const n =
|
|
28
|
+
const s = t.result;
|
|
29
|
+
if (!s.objectStoreNames.contains(o)) {
|
|
30
|
+
const n = s.createObjectStore(o, {
|
|
30
31
|
keyPath: "key"
|
|
31
32
|
});
|
|
32
33
|
n.createIndex("modelName", "modelName", { unique: !1 }), n.createIndex("expiresAt", "expiresAt", { unique: !1 });
|
|
@@ -34,67 +35,67 @@ class u {
|
|
|
34
35
|
}, t.onsuccess = () => {
|
|
35
36
|
this._database = t.result, e(this._database);
|
|
36
37
|
}, t.onerror = () => {
|
|
37
|
-
this._openPromise = null,
|
|
38
|
+
this._openPromise = null, a(t.error);
|
|
38
39
|
};
|
|
39
40
|
}), this._openPromise);
|
|
40
41
|
}
|
|
41
|
-
static cacheKey(e,
|
|
42
|
-
return `${e}:${
|
|
42
|
+
static cacheKey(e, a) {
|
|
43
|
+
return `${e}:${a}`;
|
|
43
44
|
}
|
|
44
|
-
async get(e,
|
|
45
|
+
async get(e, a) {
|
|
45
46
|
const t = await this.open();
|
|
46
|
-
return new Promise((
|
|
47
|
-
const r = t.transaction(o, "readonly").objectStore(o).get(
|
|
47
|
+
return new Promise((s, n) => {
|
|
48
|
+
const r = t.transaction(o, "readonly").objectStore(o).get(l.cacheKey(e, a));
|
|
48
49
|
r.onsuccess = () => {
|
|
49
50
|
const c = r.result;
|
|
50
51
|
if (!c) {
|
|
51
|
-
|
|
52
|
+
s(null);
|
|
52
53
|
return;
|
|
53
54
|
}
|
|
54
55
|
if (Date.now() > c.expiresAt) {
|
|
55
|
-
this.invalidate(e,
|
|
56
|
+
this.invalidate(e, a), s(null);
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
+
s(c);
|
|
59
60
|
}, r.onerror = () => n(r.error);
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
|
-
async set(e,
|
|
63
|
-
const n = await this.open(), d = Date.now(), i =
|
|
64
|
-
key:
|
|
63
|
+
async set(e, a, t, s = {}) {
|
|
64
|
+
const n = await this.open(), d = Date.now(), i = s.ttl ?? this._defaultTTL, r = {
|
|
65
|
+
key: l.cacheKey(e, a),
|
|
65
66
|
modelName: e,
|
|
66
|
-
id:
|
|
67
|
+
id: a,
|
|
67
68
|
attributes: t,
|
|
68
|
-
relationships:
|
|
69
|
+
relationships: s.relationships,
|
|
69
70
|
cachedAt: d,
|
|
70
71
|
expiresAt: d + i
|
|
71
72
|
};
|
|
72
73
|
return new Promise((c, p) => {
|
|
73
|
-
const
|
|
74
|
-
|
|
74
|
+
const u = n.transaction(o, "readwrite").objectStore(o).put(r);
|
|
75
|
+
u.onsuccess = () => c(), u.onerror = () => p(u.error);
|
|
75
76
|
});
|
|
76
77
|
}
|
|
77
|
-
async has(e,
|
|
78
|
-
return await this.get(e,
|
|
78
|
+
async has(e, a) {
|
|
79
|
+
return await this.get(e, a) !== null;
|
|
79
80
|
}
|
|
80
|
-
async invalidate(e,
|
|
81
|
+
async invalidate(e, a) {
|
|
81
82
|
const t = await this.open();
|
|
82
|
-
return new Promise((
|
|
83
|
-
const r = t.transaction(o, "readwrite").objectStore(o).delete(
|
|
84
|
-
r.onsuccess = () =>
|
|
83
|
+
return new Promise((s, n) => {
|
|
84
|
+
const r = t.transaction(o, "readwrite").objectStore(o).delete(l.cacheKey(e, a));
|
|
85
|
+
r.onsuccess = () => s(), r.onerror = () => n(r.error);
|
|
85
86
|
});
|
|
86
87
|
}
|
|
87
88
|
async invalidateAll(e) {
|
|
88
|
-
const
|
|
89
|
-
return e ? new Promise((t,
|
|
90
|
-
const r =
|
|
89
|
+
const a = await this.open();
|
|
90
|
+
return e ? new Promise((t, s) => {
|
|
91
|
+
const r = a.transaction(o, "readwrite").objectStore(o).index("modelName").openCursor(IDBKeyRange.only(e));
|
|
91
92
|
r.onsuccess = () => {
|
|
92
93
|
const c = r.result;
|
|
93
94
|
c ? (c.delete(), c.continue()) : t();
|
|
94
|
-
}, r.onerror = () =>
|
|
95
|
-
}) : new Promise((t,
|
|
96
|
-
const i =
|
|
97
|
-
i.onsuccess = () => t(), i.onerror = () =>
|
|
95
|
+
}, r.onerror = () => s(r.error);
|
|
96
|
+
}) : new Promise((t, s) => {
|
|
97
|
+
const i = a.transaction(o, "readwrite").objectStore(o).clear();
|
|
98
|
+
i.onsuccess = () => t(), i.onerror = () => s(i.error);
|
|
98
99
|
});
|
|
99
100
|
}
|
|
100
101
|
async close() {
|
|
@@ -102,46 +103,55 @@ class u {
|
|
|
102
103
|
}
|
|
103
104
|
}
|
|
104
105
|
export {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
106
|
+
F as ALL_OPERATORS,
|
|
107
|
+
_ as ATTRIBUTES_META_KEY,
|
|
108
|
+
G as Adapter,
|
|
109
|
+
J as AdapterPopulatedRecordArray,
|
|
110
|
+
N as AsyncBelongsTo,
|
|
111
|
+
g as AsyncHasMany,
|
|
112
|
+
pe as BaseTransform,
|
|
113
|
+
me as BooleanTransform,
|
|
114
|
+
Se as CacheHandler,
|
|
115
|
+
he as DateTransform,
|
|
116
|
+
ce as EmbeddedRecordsMixin,
|
|
117
|
+
D as Errors,
|
|
118
|
+
_e as FetchHandler,
|
|
119
|
+
Y as IdentityMap,
|
|
120
|
+
l as IndexedDBCache,
|
|
121
|
+
Ee as JsonApiAdapter,
|
|
122
|
+
xe as JsonApiSerializer,
|
|
123
|
+
le as JsonSerializer,
|
|
124
|
+
y as MODEL_NAME_META_KEY,
|
|
125
|
+
b as MODEL_OPTIONS_META_KEY,
|
|
126
|
+
K as ManyArray,
|
|
127
|
+
we as MdqlMemoryExecutor,
|
|
128
|
+
z as MdqlQueryBuilder,
|
|
129
|
+
k as MdqlValidationException,
|
|
130
|
+
V as MdqlValidator,
|
|
131
|
+
se as MemoryAdapter,
|
|
125
132
|
H as Model,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
133
|
+
Ae as NumberTransform,
|
|
134
|
+
Re as ODataAdapter,
|
|
135
|
+
v as OPERATORS_FOR_TYPE,
|
|
136
|
+
E as RELATIONSHIPS_META_KEY,
|
|
137
|
+
W as RESPONSE_HEADERS,
|
|
138
|
+
C as RecordArray,
|
|
139
|
+
ye as RequestManager,
|
|
140
|
+
X as RestAdapter,
|
|
141
|
+
ie as RestSerializer,
|
|
142
|
+
q as SchemaService,
|
|
143
|
+
oe as Serializer,
|
|
144
|
+
I as Snapshot,
|
|
145
|
+
j as StateMachine,
|
|
146
|
+
U as Store,
|
|
147
|
+
Te as StringTransform,
|
|
148
|
+
Z as attachResponseHeaders,
|
|
149
|
+
M as attr,
|
|
142
150
|
R as belongsTo,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
151
|
+
$ as createStore,
|
|
152
|
+
ee as extractResponseHeaders,
|
|
153
|
+
P as hasMany,
|
|
154
|
+
w as model,
|
|
155
|
+
te as parseCacheTTLFromHeaders
|
|
146
156
|
};
|
|
147
157
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/cache/IndexedDBCache.ts"],"sourcesContent":["import type { RelationshipRef } from '@mobx-data/model';\nimport type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';\n\nconst STORE_NAME = 'cache-entries';\nconst DATABASE_VERSION = 1;\nconst DEFAULT_TTL = 3_600_000;\n\ninterface StoredEntry extends CacheEntryData {\n key: string;\n}\n\nexport class IndexedDBCache implements CacheLike {\n private _databaseName: string;\n\n private _defaultTTL: number;\n\n private _database: IDBDatabase | null = null;\n\n private _openPromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBCacheOptions = {}) {\n this._databaseName = options.databaseName ?? 'mobx-data-cache';\n this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;\n }\n\n get defaultTTL(): number {\n return this._defaultTTL;\n }\n\n private async open(): Promise<IDBDatabase> {\n if (this._database) {\n return this._database;\n }\n if (this._openPromise) {\n return this._openPromise;\n }\n\n this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this._databaseName, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n const store = database.createObjectStore(STORE_NAME, {\n keyPath: 'key',\n });\n store.createIndex('modelName', 'modelName', { unique: false });\n store.createIndex('expiresAt', 'expiresAt', { unique: false });\n }\n };\n request.onsuccess = () => {\n this._database = request.result;\n resolve(this._database);\n };\n request.onerror = () => {\n this._openPromise = null;\n reject(request.error);\n };\n });\n return this._openPromise;\n }\n\n static cacheKey(modelName: string, id: string): string {\n return `${modelName}:${id}`;\n }\n\n async get(modelName: string, id: string): Promise<CacheEntryData | null> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => {\n const entry = request.result as StoredEntry | undefined;\n if (!entry) {\n resolve(null);\n return;\n }\n if (Date.now() > entry.expiresAt) {\n this.invalidate(modelName, id);\n resolve(null);\n return;\n }\n resolve(entry);\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n async set(\n modelName: string,\n id: string,\n attributes: Record<string, unknown>,\n options: {\n relationships?: Record<string, RelationshipRef>;\n ttl?: number;\n } = {},\n ): Promise<void> {\n const database = await this.open();\n const now = Date.now();\n const ttl = options.ttl ?? this._defaultTTL;\n const entry: StoredEntry = {\n key: IndexedDBCache.cacheKey(modelName, id),\n modelName,\n id,\n attributes,\n relationships: options.relationships,\n cachedAt: now,\n expiresAt: now + ttl,\n };\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put(entry);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async has(modelName: string, id: string): Promise<boolean> {\n const entry = await this.get(modelName, id);\n return entry !== null;\n }\n\n async invalidate(modelName: string, id: string): Promise<void> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.delete(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async invalidateAll(modelName?: string): Promise<void> {\n const database = await this.open();\n if (!modelName) {\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index('modelName');\n const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n cursorRequest.onerror = () => reject(cursorRequest.error);\n });\n }\n\n async close(): Promise<void> {\n if (this._database) {\n this._database.close();\n this._database = null;\n this._openPromise = null;\n }\n }\n}\n"],"names":["STORE_NAME","DATABASE_VERSION","DEFAULT_TTL","IndexedDBCache","options","resolve","reject","request","database","store","modelName","id","entry","attributes","now","ttl","cursorRequest","cursor"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/cache/IndexedDBCache.ts"],"sourcesContent":["import type { RelationshipRef } from '@mobx-data/model';\nimport type { CacheEntryData, IndexedDBCacheOptions, CacheLike } from './types.js';\n\nconst STORE_NAME = 'cache-entries';\nconst DATABASE_VERSION = 1;\nconst DEFAULT_TTL = 3_600_000;\n\ninterface StoredEntry extends CacheEntryData {\n key: string;\n}\n\nexport class IndexedDBCache implements CacheLike {\n private _databaseName: string;\n\n private _defaultTTL: number;\n\n private _database: IDBDatabase | null = null;\n\n private _openPromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBCacheOptions = {}) {\n this._databaseName = options.databaseName ?? 'mobx-data-cache';\n this._defaultTTL = options.defaultTTL ?? DEFAULT_TTL;\n }\n\n get defaultTTL(): number {\n return this._defaultTTL;\n }\n\n private async open(): Promise<IDBDatabase> {\n if (this._database) {\n return this._database;\n }\n if (this._openPromise) {\n return this._openPromise;\n }\n\n this._openPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(this._databaseName, DATABASE_VERSION);\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE_NAME)) {\n const store = database.createObjectStore(STORE_NAME, {\n keyPath: 'key',\n });\n store.createIndex('modelName', 'modelName', { unique: false });\n store.createIndex('expiresAt', 'expiresAt', { unique: false });\n }\n };\n request.onsuccess = () => {\n this._database = request.result;\n resolve(this._database);\n };\n request.onerror = () => {\n this._openPromise = null;\n reject(request.error);\n };\n });\n return this._openPromise;\n }\n\n static cacheKey(modelName: string, id: string): string {\n return `${modelName}:${id}`;\n }\n\n async get(modelName: string, id: string): Promise<CacheEntryData | null> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readonly');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.get(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => {\n const entry = request.result as StoredEntry | undefined;\n if (!entry) {\n resolve(null);\n return;\n }\n if (Date.now() > entry.expiresAt) {\n this.invalidate(modelName, id);\n resolve(null);\n return;\n }\n resolve(entry);\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n async set(\n modelName: string,\n id: string,\n attributes: Record<string, unknown>,\n options: {\n relationships?: Record<string, RelationshipRef>;\n ttl?: number;\n } = {},\n ): Promise<void> {\n const database = await this.open();\n const now = Date.now();\n const ttl = options.ttl ?? this._defaultTTL;\n const entry: StoredEntry = {\n key: IndexedDBCache.cacheKey(modelName, id),\n modelName,\n id,\n attributes,\n relationships: options.relationships,\n cachedAt: now,\n expiresAt: now + ttl,\n };\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.put(entry);\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async has(modelName: string, id: string): Promise<boolean> {\n const entry = await this.get(modelName, id);\n return entry !== null;\n }\n\n async invalidate(modelName: string, id: string): Promise<void> {\n const database = await this.open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.delete(IndexedDBCache.cacheKey(modelName, id));\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n\n async invalidateAll(modelName?: string): Promise<void> {\n const database = await this.open();\n if (!modelName) {\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const request = store.clear();\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n }\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(STORE_NAME, 'readwrite');\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index('modelName');\n const cursorRequest = index.openCursor(IDBKeyRange.only(modelName));\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n cursorRequest.onerror = () => reject(cursorRequest.error);\n });\n }\n\n async close(): Promise<void> {\n if (this._database) {\n this._database.close();\n this._database = null;\n this._openPromise = null;\n }\n }\n}\n"],"names":["STORE_NAME","DATABASE_VERSION","DEFAULT_TTL","IndexedDBCache","options","resolve","reject","request","database","store","modelName","id","entry","attributes","now","ttl","cursorRequest","cursor"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Model } from '@mobx-data/model';
|
|
2
|
+
import type { Store } from '@mobx-data/store';
|
|
3
|
+
import { StoreInspector } from './StoreInspector.js';
|
|
4
|
+
import type { RecordSummary, RecordDetail, StoreSummary, SchemaInfo } from './types.js';
|
|
5
|
+
export type RecordResult = Model & {
|
|
6
|
+
show(): void;
|
|
7
|
+
toJSON(): Record<string, unknown>;
|
|
8
|
+
inspect(): RecordDetail;
|
|
9
|
+
summary(): RecordSummary;
|
|
10
|
+
};
|
|
11
|
+
export type ResultSet = RecordResult[] & {
|
|
12
|
+
show(): void;
|
|
13
|
+
toJSON(): Array<Record<string, unknown>>;
|
|
14
|
+
};
|
|
15
|
+
interface Showable {
|
|
16
|
+
show(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class ConsoleInspector {
|
|
19
|
+
private readonly inspector;
|
|
20
|
+
private readonly storeName;
|
|
21
|
+
constructor(store: Store, name?: string);
|
|
22
|
+
summary(): StoreSummary & Showable;
|
|
23
|
+
records(modelName: string): ResultSet;
|
|
24
|
+
record(modelName: string, id: string): RecordResult | null;
|
|
25
|
+
query(text: string): ResultSet;
|
|
26
|
+
dirty(): ResultSet;
|
|
27
|
+
newRecords(): ResultSet;
|
|
28
|
+
saving(): ResultSet;
|
|
29
|
+
errored(): ResultSet;
|
|
30
|
+
private collectModels;
|
|
31
|
+
schema(modelName: string): SchemaInfo & Showable;
|
|
32
|
+
types(): string[] & Showable;
|
|
33
|
+
snapshot(): unknown;
|
|
34
|
+
observe(): () => void;
|
|
35
|
+
raw(): StoreInspector;
|
|
36
|
+
command(input: string): unknown;
|
|
37
|
+
help(): void;
|
|
38
|
+
private isQueryCommand;
|
|
39
|
+
private resolveModelCommand;
|
|
40
|
+
private wrapModel;
|
|
41
|
+
private createResultSet;
|
|
42
|
+
private renderSummary;
|
|
43
|
+
private renderRecords;
|
|
44
|
+
private renderRecordDetail;
|
|
45
|
+
private renderSchema;
|
|
46
|
+
private renderFilteredRecords;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=ConsoleInspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleInspector.d.ts","sourceRoot":"","sources":["../../src/inspector/ConsoleInspector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAwBxF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,IAAI,YAAY,CAAC;IACxB,OAAO,IAAI,aAAa,CAAC;CAC1B,CAAC;AAgCF,MAAM,MAAM,SAAS,GAAG,YAAY,EAAE,GAAG;IACvC,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC;AAEF,UAAU,QAAQ;IAChB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,MAAkB;IAKlD,OAAO,IAAI,YAAY,GAAG,QAAQ;IAUlC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAKrC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAM1D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAY9B,KAAK,IAAI,SAAS;IAKlB,UAAU,IAAI,SAAS;IAKvB,MAAM,IAAI,SAAS;IAKnB,OAAO,IAAI,SAAS;IAKpB,OAAO,CAAC,aAAa;IAYrB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ;IAUhD,KAAK,IAAI,MAAM,EAAE,GAAG,QAAQ;IAe5B,QAAQ,IAAI,OAAO;IAInB,OAAO,IAAI,MAAM,IAAI;IAarB,GAAG,IAAI,cAAc;IAIrB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IA2D/B,IAAI,IAAI,IAAI;IAsCZ,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,kBAAkB;IA8C1B,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,qBAAqB;CAiB9B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Store } from '@mobx-data/store';
|
|
2
|
+
import { StoreInspector } from './StoreInspector.js';
|
|
3
|
+
export interface DevToolsHook {
|
|
4
|
+
stores: Map<string, StoreInspector>;
|
|
5
|
+
version: string;
|
|
6
|
+
registerStore(storeId: string, store: Store): void;
|
|
7
|
+
unregisterStore(storeId: string): void;
|
|
8
|
+
}
|
|
9
|
+
export declare class DevToolsBridge {
|
|
10
|
+
private readonly stores;
|
|
11
|
+
private readonly disposers;
|
|
12
|
+
private messageHandler;
|
|
13
|
+
install(): void;
|
|
14
|
+
registerStore(storeId: string, store: Store): void;
|
|
15
|
+
unregisterStore(storeId: string): void;
|
|
16
|
+
destroy(): void;
|
|
17
|
+
private handleMessage;
|
|
18
|
+
private isValidPayload;
|
|
19
|
+
private sendToPanel;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=DevToolsBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevToolsBridge.d.ts","sourceRoot":"","sources":["../../src/inspector/DevToolsBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACnD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAsBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,cAAc,CAA2C;IAEjE,OAAO,IAAI,IAAI;IA8Bf,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAqBlD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAStC,OAAO,IAAI,IAAI;IAiBf,OAAO,CAAC,aAAa;IAkFrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;CAWpB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MdqlQueryObject } from '@mobx-data/mdql';
|
|
2
|
+
export declare class QueryParser {
|
|
3
|
+
static parse(input: string): MdqlQueryObject;
|
|
4
|
+
private tokens;
|
|
5
|
+
private position;
|
|
6
|
+
private constructor();
|
|
7
|
+
private static tokenize;
|
|
8
|
+
private peek;
|
|
9
|
+
private advance;
|
|
10
|
+
private expect;
|
|
11
|
+
private expectNullToken;
|
|
12
|
+
private matchKeyword;
|
|
13
|
+
private parseQuery;
|
|
14
|
+
private parseFilterExpression;
|
|
15
|
+
private parseCondition;
|
|
16
|
+
private parseOrderBy;
|
|
17
|
+
private parseDirection;
|
|
18
|
+
private parseValue;
|
|
19
|
+
private parseArray;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=QueryParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryParser.d.ts","sourceRoot":"","sources":["../../src/inspector/QueryParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAOhB,MAAM,iBAAiB,CAAC;AAiCzB,qBAAa,WAAW;IACtB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAK5C,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAKP,OAAO,CAAC,MAAM,CAAC,QAAQ;IAyEvB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,UAAU;IAkClB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,cAAc;IAmDtB,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,UAAU;CAyBnB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Model } from '@mobx-data/model';
|
|
2
|
+
import type { Store } from '@mobx-data/store';
|
|
3
|
+
import type { StoreSummary, RecordSummary, RecordDetail, SchemaInfo, InspectorChangeEvent } from './types.js';
|
|
4
|
+
export declare class StoreInspector {
|
|
5
|
+
private readonly store;
|
|
6
|
+
constructor(store: Store);
|
|
7
|
+
summary(): StoreSummary;
|
|
8
|
+
records(modelName: string): RecordSummary[];
|
|
9
|
+
record(modelName: string, id: string): RecordDetail | null;
|
|
10
|
+
dirty(): RecordSummary[];
|
|
11
|
+
newRecords(): RecordSummary[];
|
|
12
|
+
errored(): RecordSummary[];
|
|
13
|
+
saving(): RecordSummary[];
|
|
14
|
+
schema(modelName: string): SchemaInfo;
|
|
15
|
+
types(): string[];
|
|
16
|
+
query(text: string): Model[];
|
|
17
|
+
queryWithMeta(text: string): {
|
|
18
|
+
modelName: string;
|
|
19
|
+
results: Model[];
|
|
20
|
+
};
|
|
21
|
+
liveModels(modelName: string): Model[];
|
|
22
|
+
liveModel(modelName: string, id: string): Model | null;
|
|
23
|
+
snapshot(): {
|
|
24
|
+
records: Record<string, unknown[]>;
|
|
25
|
+
};
|
|
26
|
+
observe(callback: (event: InspectorChangeEvent) => void): () => void;
|
|
27
|
+
private allRecordsWhere;
|
|
28
|
+
private captureState;
|
|
29
|
+
private diffAndEmit;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=StoreInspector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreInspector.d.ts","sourceRoot":"","sources":["../../src/inspector/StoreInspector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAGpB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAElB,KAAK,EAAE,KAAK;IAIxB,OAAO,IAAI,YAAY;IAcvB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAI3C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQ1D,KAAK,IAAI,aAAa,EAAE;IAIxB,UAAU,IAAI,aAAa,EAAE;IAI7B,OAAO,IAAI,aAAa,EAAE;IAI1B,MAAM,IAAI,aAAa,EAAE;IAIzB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAIrC,KAAK,IAAI,MAAM,EAAE;IAIjB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE;IAM5B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,EAAE,CAAA;KAAE;IASpE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAItC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAItD,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;KAAE;IAIlD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,MAAM,IAAI;IAapE,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,WAAW;CAyBpB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("mobx"),T=require("../MdqlMemoryExecutor-BUlsalKm.cjs"),V=new Set(["where","and","or","not","order","by","sort","limit","offset","is","null","in","between","asc","desc","contains","startswith","endswith"]),S={"=":"equals","==":"equals","!=":"notEquals","<>":"notEquals",">":"greaterThan",">=":"greaterThanOrEquals","<":"lessThan","<=":"lessThanOrEquals","~":"contains","^=":"startsWith","$=":"endsWith",contains:"contains",startswith:"startsWith",endswith:"endsWith"},$=new Set(["=","!","<",">","~","^","$"]);class v{static parse(e){return new v(e).parseQuery()}constructor(e){this.tokens=v.tokenize(e),this.position=0}static tokenize(e){const s=[];let t=0;for(;t<e.length;){if(e[t]===" "||e[t]===" "){t++;continue}if(e[t]==="["||e[t]==="]"||e[t]===","){s.push({type:"bracket",value:e[t],raw:e[t]}),t++;continue}if(e[t]==='"'||e[t]==="'"){const o=e[t];let i="";for(t++;t<e.length&&e[t]!==o;)e[t]==="\\"&&t+1<e.length&&t++,i+=e[t],t++;t++,s.push({type:"string",value:i,raw:i});continue}if($.has(e[t])){let o="";for(;t<e.length&&$.has(e[t]);)o+=e[t],t++;s.push({type:"operator",value:o,raw:o});continue}let r="";for(;t<e.length&&e[t]!==" "&&e[t]!==" "&&!$.has(e[t])&&e[t]!=="["&&e[t]!=="]"&&e[t]!==",";)r+=e[t],t++;if(r===""){t++;continue}const n=r.toLowerCase();if(n==="null")s.push({type:"null",value:"null",raw:null});else if(V.has(n))s.push({type:"keyword",value:n,raw:r});else{const o=Number(r);!Number.isNaN(o)&&r!==""?s.push({type:"number",value:r,raw:o}):s.push({type:"identifier",value:r,raw:r})}}return s}peek(){return this.tokens[this.position]??null}advance(){const e=this.tokens[this.position]??null;return this.position++,e}expect(e,s){const t=this.advance();if(!t||t.type!==e||s!==void 0&&t.value!==s){const r=t?`${t.type}:${t.value}`:"end of input";throw new Error(`Expected ${e}${s?`:${s}`:""}, got ${r}`)}return t}expectNullToken(){const e=this.advance();if(!e||e.type!=="null"&&e.value!=="null"){const s=e?`${e.type}:${e.value}`:"end of input";throw new Error(`Expected null, got ${s}`)}}matchKeyword(e){const s=this.peek();return(s==null?void 0:s.type)==="keyword"&&s.value===e?(this.advance(),!0):!1}parseQuery(){const e=this.advance();if(!e)throw new Error("Expected model name");const s=e.value;let t={kind:"and",children:[]};const r=[];let n=null,o=null;return this.matchKeyword("where")&&(t=this.parseFilterExpression()),this.matchKeyword("order")?(this.expect("keyword","by"),this.parseOrderBy(r)):this.matchKeyword("sort")&&this.parseOrderBy(r),this.matchKeyword("limit")&&(n=this.expect("number").raw),this.matchKeyword("offset")&&(o=this.expect("number").raw),{modelName:s,filters:t,orderBy:r,limit:n,offset:o,includes:[]}}parseFilterExpression(){const e=this.parseCondition(),s=[e];let t="and";for(;this.peek();){const r=this.peek();if(r.type==="keyword"&&r.value==="and")this.advance(),t="and",s.push(this.parseCondition());else if(r.type==="keyword"&&r.value==="or")this.advance(),t="or",s.push(this.parseCondition());else break}return s.length===1&&e.kind!=="condition"?e:{kind:t,children:s}}parseCondition(){var o,i,l,h,p,d;if(this.matchKeyword("not"))return{kind:"not",children:[this.parseCondition()]};const e=this.advance();if(!e)throw new Error("Expected field name");const s=e.value;if(((o=this.peek())==null?void 0:o.type)==="keyword"&&((i=this.peek())==null?void 0:i.value)==="is")return this.advance(),this.matchKeyword("not")?(this.expectNullToken(),{kind:"condition",field:s,operator:"isNotNull",value:void 0}):(this.expectNullToken(),{kind:"condition",field:s,operator:"isNull",value:void 0});if(((l=this.peek())==null?void 0:l.type)==="keyword"&&((h=this.peek())==null?void 0:h.value)==="in"){this.advance();const f=this.parseArray();return{kind:"condition",field:s,operator:"in",value:f}}if(((p=this.peek())==null?void 0:p.type)==="keyword"&&((d=this.peek())==null?void 0:d.value)==="between"){this.advance();const f=this.parseValue(),j=this.parseValue();return{kind:"condition",field:s,operator:"between",value:[f,j]}}const t=this.advance();if(!t)throw new Error(`Expected operator after field "${s}"`);let r;if(t.type==="operator"){if(r=S[t.value],!r)throw new Error(`Unknown operator: ${t.value}`)}else if(t.type==="keyword"&&S[t.value])r=S[t.value];else throw new Error(`Expected operator, got ${t.type}:${t.value}`);const n=this.parseValue();return{kind:"condition",field:s,operator:r,value:n}}parseOrderBy(e){var t,r;const s=this.advance();if(!s)throw new Error("Expected field name after order by / sort");for(e.push({field:s.value,direction:this.parseDirection()});((t=this.peek())==null?void 0:t.type)==="bracket"&&((r=this.peek())==null?void 0:r.value)===",";){this.advance();const n=this.advance();if(!n)break;e.push({field:n.value,direction:this.parseDirection()})}}parseDirection(){const e=this.peek();return(e==null?void 0:e.type)==="keyword"&&(e.value==="asc"||e.value==="desc")?(this.advance(),e.value):"asc"}parseValue(){const e=this.advance();if(!e)throw new Error("Expected value");if(e.type==="string"||e.type==="number")return e.raw;if(e.type==="null"||e.type==="keyword"&&e.value==="null")return null;if(e.type==="identifier")return e.value;throw new Error(`Unexpected value token: ${e.type}:${e.value}`)}parseArray(){var s,t,r,n,o,i,l,h,p,d,f;const e=[];if(((s=this.peek())==null?void 0:s.type)==="bracket"&&((t=this.peek())==null?void 0:t.value)==="["){for(this.advance();this.peek()&&!(((r=this.peek())==null?void 0:r.type)==="bracket"&&((n=this.peek())==null?void 0:n.value)==="]");){if(((o=this.peek())==null?void 0:o.type)==="bracket"&&((i=this.peek())==null?void 0:i.value)===","){this.advance();continue}e.push(this.parseValue())}((l=this.peek())==null?void 0:l.type)==="bracket"&&((h=this.peek())==null?void 0:h.value)==="]"&&this.advance()}else for(;this.peek()&&((p=this.peek())==null?void 0:p.type)!=="keyword";){if(((d=this.peek())==null?void 0:d.type)==="bracket"&&((f=this.peek())==null?void 0:f.value)===","){this.advance();continue}e.push(this.parseValue())}return e}}function y(a){return{modelName:a.modelName,id:a.id,clientId:a._clientId,currentState:a.currentState,isNew:a.isNew,isDirty:a.isDirty,isDeleted:a.isDeleted,isError:a.isError,isLoading:a.isLoading,isSaving:a.isSaving,hasDirtyAttributes:a.hasDirtyAttributes,hasErrors:!a.isValid}}function E(a){const e=a,s={};if(e._relationships)for(const[o,i]of e._relationships)s[o]=i;const t=[];for(const[o,i]of a.errors)t.push({attribute:o,messages:i.map(l=>l.message)});const r=Object.create(null);for(const o of Object.keys(e._data))o==="__proto__"||o==="constructor"||(r[o]=e._data[o]);const n=Object.create(null);for(const o of Object.keys(e._originalData))o==="__proto__"||o==="constructor"||(n[o]=e._originalData[o]);return{...y(a),attributes:r,originalAttributes:n,changedAttributes:a.changedAttributes(),relationships:s,errors:t}}function W(a,e){const s=a.schema.attributesDefinitionFor(e),t=a.schema.relationshipsDefinitionFor(e),r=a.schema.discriminatorFor(e),n=[];for(const[i,l]of s)n.push({name:i,type:l.type});const o=[];for(const[i,l]of t)o.push({name:i,kind:l.kind,type:l.type,async:l.options.async??!1,inverse:l.options.inverse??null,polymorphic:l.options.polymorphic??!1});return{modelName:e,isAbstract:a.schema.isAbstract(e),discriminator:r?{key:r.key}:null,attributes:n,relationships:o}}class D{constructor(e){this.store=e}summary(){const e=[];let s=0;for(const t of this.store.schema.registeredNames()){const r=this.store.peekAll(t).length;r>0&&e.push({modelName:t,count:r}),s+=r}return e.sort((t,r)=>t.modelName.localeCompare(r.modelName)),{types:e,totalRecords:s}}records(e){return this.store.peekAll(e).toArray().map(y)}record(e,s){const t=this.store.identityMap.get(e,s);return t?E(t):null}dirty(){return this.allRecordsWhere(e=>e.isDirty)}newRecords(){return this.allRecordsWhere(e=>e.isNew)}errored(){return this.allRecordsWhere(e=>e.isError||!e.isValid)}saving(){return this.allRecordsWhere(e=>e.isSaving)}schema(e){return W(this.store,e)}types(){return this.store.schema.registeredNames().sort()}query(e){const s=v.parse(e),t=this.store.peekAll(s.modelName).toArray();return T.MdqlMemoryExecutor.executeMany(t,s)}queryWithMeta(e){const s=v.parse(e),t=this.store.peekAll(s.modelName).toArray();return{modelName:s.modelName,results:T.MdqlMemoryExecutor.executeMany(t,s)}}liveModels(e){return this.store.peekAll(e).toArray()}liveModel(e,s){return this.store.peekRecord(e,s)}snapshot(){return this.store.serialize()}observe(e){let s=this.captureState();return P.reaction(()=>this.captureState(),t=>{this.diffAndEmit(s,t,e),s=t},{delay:100})}allRecordsWhere(e){const s=[];for(const t of this.store.schema.registeredNames())for(const r of this.store.peekAll(t).toArray())e(r)&&s.push(y(r));return s}captureState(){const e=new Map;for(const[s,t]of this.store.identityMap._buckets){const r=new Map;for(const[n,o]of t)r.set(n,o.currentState);e.set(s,r)}return e}diffAndEmit(e,s,t){for(const[r,n]of s){const o=e.get(r);for(const[i,l]of n)o!=null&&o.has(i)?o.get(i)!==l&&t({type:"updated",modelName:r,id:i}):t({type:"added",modelName:r,id:i})}for(const[r,n]of e){const o=s.get(r);for(const[i]of n)o!=null&&o.has(i)||t({type:"removed",modelName:r,id:i})}}}const m="color: #2196f3; font-weight: bold",u="color: #ff9800; font-weight: bold",w="color: #f44336; font-weight: bold",b="color: #4caf50",c="color: inherit";function k(a){return a.isError?"ERROR":a.isSaving?"SAVING":a.isNew?"NEW":a.isDirty?"DIRTY":a.isDeleted?"DELETED":a.isLoading?"LOADING":"SAVED"}function K(a){return a.isError||a.hasErrors?w:a.isDirty||a.isNew?u:b}const x=new Set(["show","toJSON","inspect","summary"]);function F(a,e){const s={show(){e(a)},toJSON(){const t=E(a);return{...t.attributes,id:t.id,_state:t.currentState}},inspect(){return E(a)},summary(){return y(a)}};return new Proxy(a,{get(t,r){return typeof r=="string"&&x.has(r)?s[r]:Reflect.get(t,r)},has(t,r){return typeof r=="string"&&x.has(r)?!0:Reflect.has(t,r)}})}class _{constructor(e,s="default"){this.inspector=new D(e),this.storeName=s}summary(){const e=this.inspector.summary(),s=this;return Object.assign(e,{show(){s.renderSummary(e)}})}records(e){const s=this.inspector.liveModels(e);return this.createResultSet(s,()=>this.renderRecords(e,this.inspector.records(e)))}record(e,s){const t=this.inspector.liveModel(e,s);return t?this.wrapModel(t):null}query(e){const{modelName:s,results:t}=this.inspector.queryWithMeta(e);return this.createResultSet(t,()=>{const r=this.inspector.records(s),n=new Map(r.map(i=>[i.id,i])),o=t.map(i=>n.get(i.id)).filter(Boolean);this.renderRecords(`${s} (query)`,o.length>0?o:r)})}dirty(){const e=this.collectModels(s=>s.isDirty);return this.createResultSet(e,()=>this.renderFilteredRecords("Dirty records",e.map(y)))}newRecords(){const e=this.collectModels(s=>s.isNew);return this.createResultSet(e,()=>this.renderFilteredRecords("New records",e.map(y)))}saving(){const e=this.collectModels(s=>s.isSaving);return this.createResultSet(e,()=>this.renderFilteredRecords("Saving records",e.map(y)))}errored(){const e=this.collectModels(s=>s.isError||!s.isValid);return this.createResultSet(e,()=>this.renderFilteredRecords("Errored records",e.map(y)))}collectModels(e){const s=[];for(const t of this.inspector.types())for(const r of this.inspector.liveModels(t))e(r)&&s.push(r);return s}schema(e){const s=this.inspector.schema(e),t=this;return Object.assign(s,{show(){t.renderSchema(e,s)}})}types(){const e=this.inspector.types(),s=this,t=[...e];return t.show=()=>{const r=s.inspector.summary(),n=new Map(r.types.map(o=>[o.modelName,o.count]));console.log(`%c[mobx-data] Registered types (${e.length})`,m);for(const o of e)console.log(` ${o} (${n.get(o)??0})`)},t}snapshot(){return this.inspector.snapshot()}observe(){return console.log("%c[mobx-data] Live observation started. Call the returned function to stop.",m),this.inspector.observe(e=>{const s=e.type==="removed"?w:e.type==="added"?b:u,t=e.type.toUpperCase(),r=e.id??"(new)",n=e.record?` [${k(e.record)}]`:"";console.log(`%c[mobx-data] %c${t}%c ${e.modelName}:${r}${n}`,m,s,c)})}raw(){return this.inspector}command(e){var o;const s=e.trim();if(this.isQueryCommand(s)){const i=this.query(s);return i.show(),i}const t=s.split(/\s+/),r=((o=t[0])==null?void 0:o.toLowerCase())??"",n=t[1];switch(r){case"help":case"h":case"?":this.help();return;case"summary":case"s":{const i=this.summary();return i.show(),i}case"types":case"t":{const i=this.types();return i.show(),i}case"dirty":case"d":{const i=this.dirty();return i.show(),i}case"saving":{const i=this.saving();return i.show(),i}case"errored":case"errors":case"e":{const i=this.errored();return i.show(),i}case"schema":if(n){const i=this.schema(n);return i.show(),i}console.log("%c[mobx-data] Usage: schema <type>",w);return;case"snap":case"snapshot":return this.snapshot();case"watch":case"observe":return this.observe();default:return this.resolveModelCommand(r,n)}}help(){console.log("%c[mobx-data] CLI commands:",m),console.log(`
|
|
2
|
+
%c$m('help')%c Show this help
|
|
3
|
+
%c$m('summary')%c Overview of all types and counts
|
|
4
|
+
%c$m('types')%c List registered model names
|
|
5
|
+
%c$m('user')%c All records (returns live refs)
|
|
6
|
+
%c$m('user 1')%c Single record (live ref)
|
|
7
|
+
%c$m('user where age > 25')%c Query with filters
|
|
8
|
+
%c$m('user where name ~ "Al"')%c Contains search
|
|
9
|
+
%c$m('post where title ~ h sort title')%c Query + sort
|
|
10
|
+
%c$m('dirty')%c All dirty records
|
|
11
|
+
%c$m('saving')%c All records being saved
|
|
12
|
+
%c$m('errored')%c All records with errors
|
|
13
|
+
%c$m('schema user')%c Attribute/relationship metadata
|
|
14
|
+
%c$m('snapshot')%c Full store snapshot
|
|
15
|
+
%c$m('watch')%c Live change logging (returns stop fn)
|
|
16
|
+
`,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c,u,c),console.log("%c Operators: = != > >= < <= ~ (contains) ^= (startsWith) $= (endsWith) in between is null",b),console.log("%c All methods return live objects. Use .show() to render, [0] for refs.",b),console.log("%c Shortcuts: s=summary, t=types, d=dirty, e=errored, h=help",b)}isQueryCommand(e){const s=e.toLowerCase();return s.includes(" where ")||s.includes(" sort ")||/ order by /i.test(s)||/ limit /i.test(s)||/ offset /i.test(s)}resolveModelCommand(e,s){const t=this.inspector.types(),r=t.includes(e)?e:t.includes(`${e}s`)?`${e}s`:null;if(r){if(s){const o=this.record(r,s);return o?o.show():console.log(`%c[mobx-data] ${r}:${s} not found`,w),o}const n=this.records(r);return n.show(),n}if(e===""){const n=this.summary();return n.show(),n}console.log(`%c[mobx-data] Unknown command: "${e}". Try $m('help')`,w)}wrapModel(e){return F(e,s=>{const t=E(s);this.renderRecordDetail(t.modelName,t.id??t.clientId,t)})}createResultSet(e,s){const t=e.map(n=>this.wrapModel(n)),r=t;return r.show=s,r.toJSON=()=>t.map(n=>n.toJSON()),r}renderSummary(e){if(console.log(`%c[mobx-data] Store "${this.storeName}" — ${e.totalRecords} records`,m),e.types.length===0){console.log(" (empty)");return}console.table(e.types.reduce((s,t)=>(s[t.modelName]={count:t.count},s),{}))}renderRecords(e,s){if(console.log(`%c[mobx-data] ${e} — ${s.length} records`,m),s.length===0){console.log(" (none)");return}console.table(s.map(t=>({id:t.id??t.clientId,state:k(t),isDirty:t.isDirty,isNew:t.isNew,isSaving:t.isSaving,hasErrors:t.hasErrors})))}renderRecordDetail(e,s,t){const r=k(t),n=K(t);console.groupCollapsed(`%c[mobx-data] %c${e}:${s}%c — %c${r}%c (${t.currentState})`,m,c,c,n,c),console.groupCollapsed("Attributes");const o=new Set(Object.keys(t.changedAttributes)),i={};for(const[l,h]of Object.entries(t.attributes))i[l]={current:h,original:t.originalAttributes[l],changed:o.has(l)?"YES":""};if(console.table(i),console.groupEnd(),Object.keys(t.relationships).length>0){console.groupCollapsed("Relationships");for(const[l,h]of Object.entries(t.relationships)){const p=h==null?void 0:h.data;if(Array.isArray(p)){const d=p.map(f=>`${f.type}:${f.id}`);console.log(` ${l} → [${d.join(", ")}]`)}else if(p&&typeof p=="object"){const d=p;console.log(` ${l} → ${d.type}:${d.id}`)}else console.log(` ${l} → null`)}console.groupEnd()}if(t.errors.length>0){console.groupCollapsed(`%cErrors (${t.errors.length})`,w);for(const l of t.errors)console.log(` ${l.attribute}: ${l.messages.join(", ")}`);console.groupEnd()}console.groupEnd()}renderSchema(e,s){console.log(`%c[mobx-data] Schema: ${e}${s.isAbstract?" (abstract)":""}`,m),s.discriminator&&console.log(` Discriminator key: ${s.discriminator.key}`),s.attributes.length>0&&(console.log("%cAttributes:",m),console.table(s.attributes.map(t=>({name:t.name,type:t.type??"(untyped)"})))),s.relationships.length>0&&(console.log("%cRelationships:",m),console.table(s.relationships.map(t=>({name:t.name,kind:t.kind,type:t.type,async:t.async,inverse:t.inverse??"(none)"}))))}renderFilteredRecords(e,s){if(console.log(`%c[mobx-data] ${e} — ${s.length} total`,m),s.length===0){console.log(" (none)");return}console.table(s.map(t=>({type:t.modelName,id:t.id??t.clientId,state:k(t),isDirty:t.isDirty,isNew:t.isNew,hasErrors:t.hasErrors})))}}const A="__MOBX_DATA_DEVTOOLS_HOOK__",M="mobx-data-devtools",O="1.4.0";function N(){return typeof globalThis<"u"?globalThis:typeof window<"u"?window:{}}function R(){const a=N();return typeof a.addEventListener=="function"?a:null}class C{constructor(){this.stores=new Map,this.disposers=new Map,this.messageHandler=null}install(){const e=N(),s={stores:this.stores,version:O,registerStore:(r,n)=>this.registerStore(r,n),unregisterStore:r=>this.unregisterStore(r)};Object.defineProperty(e,A,{value:s,writable:!0,enumerable:!1,configurable:!0});const t=R();t!=null&&t.addEventListener&&(this.messageHandler=r=>{var o,i,l;const n=r;n.origin&&typeof location<"u"&&n.origin!==location.origin||((o=n.data)==null?void 0:o.source)!==M||((i=n.data)==null?void 0:i.direction)!=="panel-to-page"||this.isValidPayload((l=n.data)==null?void 0:l.payload)&&this.handleMessage(n)},t.addEventListener("message",this.messageHandler))}registerStore(e,s){const t=new D(s);this.stores.set(e,t);const r=t.observe(n=>{this.sendToPanel({type:"changeEvent",storeId:e,event:n})});this.disposers.set(e,r),this.sendToPanel({type:"init",storeId:e,storeCount:this.stores.size,version:O})}unregisterStore(e){const s=this.disposers.get(e);s&&(s(),this.disposers.delete(e)),this.stores.delete(e)}destroy(){for(const t of this.disposers.values())t();this.disposers.clear(),this.stores.clear();const e=R();e!=null&&e.removeEventListener&&this.messageHandler&&(e.removeEventListener("message",this.messageHandler),this.messageHandler=null);const s=N();delete s[A]}handleMessage(e){const{payload:s}=e.data,t="storeId"in s?s.storeId:void 0,r=t?this.stores.get(t):void 0;switch(s.type){case"requestSummary":{if(!r)return;this.sendToPanel({type:"summary",storeId:t,data:r.summary()});break}case"requestRecords":{if(!r||!("modelName"in s))return;this.sendToPanel({type:"records",storeId:t,modelName:s.modelName,data:r.records(s.modelName)});break}case"requestRecordDetail":{if(!r||!("modelName"in s)||!("id"in s))return;const n=r.record(s.modelName,s.id);if(!n)return;this.sendToPanel({type:"recordDetail",storeId:t,modelName:s.modelName,id:s.id,data:n});break}case"requestSchema":{if(!r||!("modelName"in s))return;this.sendToPanel({type:"schema",storeId:t,modelName:s.modelName,data:r.schema(s.modelName)});break}case"requestSnapshot":{if(!r)return;this.sendToPanel({type:"snapshot",storeId:t,data:r.snapshot()});break}case"requestQuery":{if(!r||!("queryText"in s))return;const n=s.queryText;try{const{modelName:o,results:i}=r.queryWithMeta(n),l=r.records(o),h=new Map(l.map(d=>[d.id,d])),p=i.map(d=>h.get(d.id)).filter(Boolean);this.sendToPanel({type:"queryResult",storeId:t,queryText:n,data:p,error:null})}catch(o){this.sendToPanel({type:"queryResult",storeId:t,queryText:n,data:[],error:o instanceof Error?o.message:String(o)})}break}}}isValidPayload(e){if(!e||typeof e!="object")return!1;const s=e,t=["requestSummary","requestRecords","requestRecordDetail","requestSchema","requestSnapshot","requestQuery"];return typeof s.type=="string"&&t.includes(s.type)&&typeof s.storeId=="string"}sendToPanel(e){const s=R();if(!(s!=null&&s.postMessage))return;const t={source:M,direction:"page-to-panel",payload:e},r=typeof location<"u"?location.origin:"*";s.postMessage(t,r)}}let g=null,q=0;function I(a,e="default"){const s=new _(a,e);return typeof window<"u"&&(window.$mobxData=s,window.$m=t=>s.command(t)),s}function L(a,e){if(typeof window>"u")return()=>{};g||(g=new C,g.install()),q+=1;const s=e??`store-${q}`;return g.registerStore(s,a),()=>{g==null||g.unregisterStore(s)}}function H(a,e="default"){const s=I(a,e),t=L(a,e);return{consoleInspector:s,cleanup:t}}exports.ConsoleInspector=_;exports.DevToolsBridge=C;exports.QueryParser=v;exports.StoreInspector=D;exports.enableConsoleInspector=I;exports.enableDevTools=L;exports.enableInspector=H;
|
|
17
|
+
//# sourceMappingURL=index.cjs.map
|