@iamjulianacosta/mobx-data 1.1.1 → 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.
Files changed (206) hide show
  1. package/README.md +273 -102
  2. package/dist/{CacheHandler-BTU_rYkv.js → CacheHandler-BhfbVHed.js} +17 -20
  3. package/dist/CacheHandler-BhfbVHed.js.map +1 -0
  4. package/dist/{CacheHandler-CXgY9IJo.cjs → CacheHandler-Q5VXOgh9.cjs} +2 -2
  5. package/dist/CacheHandler-Q5VXOgh9.cjs.map +1 -0
  6. package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js +173 -0
  7. package/dist/EmbeddedRecordsMixin-6mSCXsJ3.js.map +1 -0
  8. package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs +2 -0
  9. package/dist/EmbeddedRecordsMixin-BkF7MdbY.cjs.map +1 -0
  10. package/dist/{JsonApiSerializer-wndq5a1n.js → JsonApiSerializer-BV61cFAZ.js} +3 -3
  11. package/dist/JsonApiSerializer-BV61cFAZ.js.map +1 -0
  12. package/dist/{JsonApiSerializer-Bc4iQB0d.cjs → JsonApiSerializer-Dt_Y_FIo.cjs} +2 -2
  13. package/dist/JsonApiSerializer-Dt_Y_FIo.cjs.map +1 -0
  14. package/dist/JsonSerializer-BzUCyUSf.cjs +2 -0
  15. package/dist/JsonSerializer-BzUCyUSf.cjs.map +1 -0
  16. package/dist/JsonSerializer-CFqo6GjC.js +98 -0
  17. package/dist/JsonSerializer-CFqo6GjC.js.map +1 -0
  18. package/dist/MdqlMemoryExecutor-BUlsalKm.cjs +2 -0
  19. package/dist/MdqlMemoryExecutor-BUlsalKm.cjs.map +1 -0
  20. package/dist/MdqlMemoryExecutor-BWMP31zG.js +127 -0
  21. package/dist/MdqlMemoryExecutor-BWMP31zG.js.map +1 -0
  22. package/dist/{MemoryAdapter-ni25N4H0.js → MemoryAdapter-BW1HKixm.js} +2 -2
  23. package/dist/{MemoryAdapter-ni25N4H0.js.map → MemoryAdapter-BW1HKixm.js.map} +1 -1
  24. package/dist/{MemoryAdapter-BTK2D64s.cjs → MemoryAdapter-C8iXAa2v.cjs} +2 -2
  25. package/dist/{MemoryAdapter-BTK2D64s.cjs.map → MemoryAdapter-C8iXAa2v.cjs.map} +1 -1
  26. package/dist/{ODataAdapter-DAja_jKM.js → ODataAdapter-CeBJblLQ.js} +25 -22
  27. package/dist/ODataAdapter-CeBJblLQ.js.map +1 -0
  28. package/dist/{ODataAdapter-lMifLyLD.cjs → ODataAdapter-DdE6MWkG.cjs} +2 -2
  29. package/dist/ODataAdapter-DdE6MWkG.cjs.map +1 -0
  30. package/dist/RestAdapter-D7GSrsJo.cjs +2 -0
  31. package/dist/RestAdapter-D7GSrsJo.cjs.map +1 -0
  32. package/dist/{RestAdapter-CGWqOR_G.js → RestAdapter-DYUoyV5h.js} +112 -77
  33. package/dist/RestAdapter-DYUoyV5h.js.map +1 -0
  34. package/dist/SchemaService-C_pkh-vI.js +180 -0
  35. package/dist/SchemaService-C_pkh-vI.js.map +1 -0
  36. package/dist/SchemaService-DbJLoYb9.cjs +2 -0
  37. package/dist/SchemaService-DbJLoYb9.cjs.map +1 -0
  38. package/dist/Serializer-Bap9U-kR.cjs +2 -0
  39. package/dist/Serializer-Bap9U-kR.cjs.map +1 -0
  40. package/dist/{Serializer-FxJbsZ50.js → Serializer-Ca6w_QNQ.js} +63 -49
  41. package/dist/Serializer-Ca6w_QNQ.js.map +1 -0
  42. package/dist/adapter/index.cjs +1 -1
  43. package/dist/adapter/index.js +2 -2
  44. package/dist/cache/cache-utils.d.ts +1 -1
  45. package/dist/cache/cache-utils.d.ts.map +1 -1
  46. package/dist/createStore-7PecKT54.cjs +2 -0
  47. package/dist/createStore-7PecKT54.cjs.map +1 -0
  48. package/dist/createStore-BfmRfZ_2.js +1229 -0
  49. package/dist/createStore-BfmRfZ_2.js.map +1 -0
  50. package/dist/date-Bj4O2W1F.js.map +1 -1
  51. package/dist/date-CRCe-9gf.cjs.map +1 -1
  52. package/dist/decorators-CKneHgoF.js +56 -0
  53. package/dist/decorators-CKneHgoF.js.map +1 -0
  54. package/dist/decorators-DCVYKzrL.cjs +2 -0
  55. package/dist/decorators-DCVYKzrL.cjs.map +1 -0
  56. package/dist/index.cjs +1 -1
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.ts +2 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +100 -90
  61. package/dist/index.js.map +1 -1
  62. package/dist/inspector/ConsoleInspector.d.ts +49 -0
  63. package/dist/inspector/ConsoleInspector.d.ts.map +1 -0
  64. package/dist/inspector/DevToolsBridge.d.ts +21 -0
  65. package/dist/inspector/DevToolsBridge.d.ts.map +1 -0
  66. package/dist/inspector/QueryParser.d.ts +21 -0
  67. package/dist/inspector/QueryParser.d.ts.map +1 -0
  68. package/dist/inspector/StoreInspector.d.ts +31 -0
  69. package/dist/inspector/StoreInspector.d.ts.map +1 -0
  70. package/dist/inspector/index.cjs +17 -0
  71. package/dist/inspector/index.cjs.map +1 -0
  72. package/dist/inspector/index.d.ts +9 -0
  73. package/dist/inspector/index.d.ts.map +1 -0
  74. package/dist/inspector/index.js +896 -0
  75. package/dist/inspector/index.js.map +1 -0
  76. package/dist/inspector/integration.d.ts +15 -0
  77. package/dist/inspector/integration.d.ts.map +1 -0
  78. package/dist/inspector/serialization.d.ts +7 -0
  79. package/dist/inspector/serialization.d.ts.map +1 -0
  80. package/dist/inspector/types.d.ts +139 -0
  81. package/dist/inspector/types.d.ts.map +1 -0
  82. package/dist/json-api/index.cjs +1 -1
  83. package/dist/json-api/index.js +1 -1
  84. package/dist/mdql/MdqlMemoryExecutor.d.ts +17 -0
  85. package/dist/mdql/MdqlMemoryExecutor.d.ts.map +1 -0
  86. package/dist/mdql/MdqlQueryBuilder.d.ts +38 -0
  87. package/dist/mdql/MdqlQueryBuilder.d.ts.map +1 -0
  88. package/dist/mdql/MdqlValidator.d.ts +13 -0
  89. package/dist/mdql/MdqlValidator.d.ts.map +1 -0
  90. package/dist/mdql/index.d.ts +6 -0
  91. package/dist/mdql/index.d.ts.map +1 -0
  92. package/dist/mdql/types.d.ts +48 -0
  93. package/dist/mdql/types.d.ts.map +1 -0
  94. package/dist/model/Model.d.ts +4 -0
  95. package/dist/model/Model.d.ts.map +1 -1
  96. package/dist/model/Snapshot.d.ts +2 -0
  97. package/dist/model/Snapshot.d.ts.map +1 -1
  98. package/dist/model/index.cjs +1 -1
  99. package/dist/model/index.js +1 -1
  100. package/dist/odata/ODataAdapter.d.ts.map +1 -1
  101. package/dist/odata/index.cjs +1 -1
  102. package/dist/odata/index.js +1 -1
  103. package/dist/relationships-BgM0NKdb.cjs +2 -0
  104. package/dist/relationships-BgM0NKdb.cjs.map +1 -0
  105. package/dist/{relationships-BEXANmWg.js → relationships-DvSi8fVN.js} +37 -28
  106. package/dist/relationships-DvSi8fVN.js.map +1 -0
  107. package/dist/request/CacheHandler.d.ts.map +1 -1
  108. package/dist/request/index.cjs +1 -1
  109. package/dist/request/index.js +1 -1
  110. package/dist/schema/SchemaService.d.ts +38 -1
  111. package/dist/schema/SchemaService.d.ts.map +1 -1
  112. package/dist/schema/decorators.d.ts +20 -1
  113. package/dist/schema/decorators.d.ts.map +1 -1
  114. package/dist/schema/index.cjs +1 -1
  115. package/dist/schema/index.d.ts +1 -1
  116. package/dist/schema/index.d.ts.map +1 -1
  117. package/dist/schema/index.js +10 -8
  118. package/dist/schema/types.d.ts +31 -0
  119. package/dist/schema/types.d.ts.map +1 -1
  120. package/dist/serializer/JsonSerializer.d.ts +2 -0
  121. package/dist/serializer/JsonSerializer.d.ts.map +1 -1
  122. package/dist/serializer/Serializer.d.ts +9 -0
  123. package/dist/serializer/Serializer.d.ts.map +1 -1
  124. package/dist/serializer/index.cjs +1 -1
  125. package/dist/serializer/index.js +6 -5
  126. package/dist/serializer/index.js.map +1 -1
  127. package/dist/store/Store.d.ts +3 -0
  128. package/dist/store/Store.d.ts.map +1 -1
  129. package/dist/store/createStore.d.ts +12 -0
  130. package/dist/store/createStore.d.ts.map +1 -0
  131. package/dist/store/index.cjs +1 -1
  132. package/dist/store/index.d.ts +1 -0
  133. package/dist/store/index.d.ts.map +1 -1
  134. package/dist/store/index.js +5 -4
  135. package/dist/types-CC2fG3FP.js +8 -0
  136. package/dist/types-CC2fG3FP.js.map +1 -0
  137. package/dist/types-DCLy5XYj.cjs +2 -0
  138. package/dist/types-DCLy5XYj.cjs.map +1 -0
  139. package/package.json +7 -1
  140. package/src/cache/cache-utils.ts +4 -4
  141. package/src/index.ts +3 -0
  142. package/src/inspector/ConsoleInspector.ts +470 -0
  143. package/src/inspector/DevToolsBridge.ts +214 -0
  144. package/src/inspector/QueryParser.ts +343 -0
  145. package/src/inspector/StoreInspector.ts +162 -0
  146. package/src/inspector/index.ts +20 -0
  147. package/src/inspector/integration.ts +56 -0
  148. package/src/inspector/serialization.ts +100 -0
  149. package/src/inspector/types.ts +161 -0
  150. package/src/mdql/MdqlMemoryExecutor.ts +229 -0
  151. package/src/mdql/MdqlQueryBuilder.ts +170 -0
  152. package/src/mdql/MdqlValidator.ts +193 -0
  153. package/src/mdql/index.ts +21 -0
  154. package/src/mdql/types.ts +107 -0
  155. package/src/model/Model.ts +15 -0
  156. package/src/model/Snapshot.ts +3 -0
  157. package/src/odata/ODataAdapter.ts +4 -1
  158. package/src/request/CacheHandler.ts +2 -6
  159. package/src/schema/SchemaService.ts +123 -1
  160. package/src/schema/decorators.ts +29 -0
  161. package/src/schema/index.ts +1 -1
  162. package/src/schema/types.ts +34 -0
  163. package/src/serializer/JsonSerializer.ts +14 -2
  164. package/src/serializer/Serializer.ts +24 -1
  165. package/src/store/Store.ts +61 -18
  166. package/src/store/createStore.ts +39 -0
  167. package/src/store/index.ts +1 -0
  168. package/dist/CacheHandler-BTU_rYkv.js.map +0 -1
  169. package/dist/CacheHandler-CXgY9IJo.cjs.map +0 -1
  170. package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs +0 -2
  171. package/dist/EmbeddedRecordsMixin-CBvqNdgC.cjs.map +0 -1
  172. package/dist/EmbeddedRecordsMixin-VoHluHCT.js +0 -261
  173. package/dist/EmbeddedRecordsMixin-VoHluHCT.js.map +0 -1
  174. package/dist/JsonApiSerializer-Bc4iQB0d.cjs.map +0 -1
  175. package/dist/JsonApiSerializer-wndq5a1n.js.map +0 -1
  176. package/dist/ODataAdapter-DAja_jKM.js.map +0 -1
  177. package/dist/ODataAdapter-lMifLyLD.cjs.map +0 -1
  178. package/dist/RestAdapter-1V94stW-.cjs +0 -2
  179. package/dist/RestAdapter-1V94stW-.cjs.map +0 -1
  180. package/dist/RestAdapter-CGWqOR_G.js.map +0 -1
  181. package/dist/SchemaService-DZwkFgZu.js +0 -102
  182. package/dist/SchemaService-DZwkFgZu.js.map +0 -1
  183. package/dist/SchemaService-Di_yjVzU.cjs +0 -2
  184. package/dist/SchemaService-Di_yjVzU.cjs.map +0 -1
  185. package/dist/Serializer-95gi5edy.cjs +0 -2
  186. package/dist/Serializer-95gi5edy.cjs.map +0 -1
  187. package/dist/Serializer-FxJbsZ50.js.map +0 -1
  188. package/dist/Store-KvjmBTQ9.cjs +0 -2
  189. package/dist/Store-KvjmBTQ9.cjs.map +0 -1
  190. package/dist/Store-mvrDLQEZ.js +0 -957
  191. package/dist/Store-mvrDLQEZ.js.map +0 -1
  192. package/dist/cache-utils-2lswvJ87.cjs +0 -2
  193. package/dist/cache-utils-2lswvJ87.cjs.map +0 -1
  194. package/dist/cache-utils-38Dqu4Qf.js +0 -39
  195. package/dist/cache-utils-38Dqu4Qf.js.map +0 -1
  196. package/dist/decorators-HQ1KnRdh.cjs +0 -2
  197. package/dist/decorators-HQ1KnRdh.cjs.map +0 -1
  198. package/dist/decorators-Zr35qr6A.js +0 -50
  199. package/dist/decorators-Zr35qr6A.js.map +0 -1
  200. package/dist/relationships-B55LBaCW.cjs +0 -2
  201. package/dist/relationships-B55LBaCW.cjs.map +0 -1
  202. package/dist/relationships-BEXANmWg.js.map +0 -1
  203. package/dist/types-C9NB2gRj.js +0 -7
  204. package/dist/types-C9NB2gRj.js.map +0 -1
  205. package/dist/types-uWOXMPWW.cjs +0 -2
  206. package/dist/types-uWOXMPWW.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,32 +1,33 @@
1
- import { A as T, M as b, R as _ } from "./types-C9NB2gRj.js";
2
- import { a as E, b as R, h as w } from "./decorators-Zr35qr6A.js";
3
- import { S as P } from "./SchemaService-DZwkFgZu.js";
4
- import { A as g, a as L, E as q, M as D, b as H, S as K, c as O } from "./relationships-BEXANmWg.js";
5
- import { A as I, I as B, R as J, S as z } from "./Store-mvrDLQEZ.js";
6
- import { A as k, R as Y } from "./RestAdapter-CGWqOR_G.js";
7
- import { M as C } from "./MemoryAdapter-ni25N4H0.js";
8
- import { S as $ } from "./Serializer-FxJbsZ50.js";
9
- import { E as G, J as Q, R as W } from "./EmbeddedRecordsMixin-VoHluHCT.js";
10
- import { B as Z, a as ee, D as te, N as se, S as ae } from "./date-Bj4O2W1F.js";
11
- import { C as oe, F as ne, R as ce } from "./CacheHandler-BTU_rYkv.js";
12
- import { J as de, a as ue } from "./JsonApiSerializer-wndq5a1n.js";
13
- import { O as pe } from "./ODataAdapter-DAja_jKM.js";
14
- import { R as me, a as Ae, e as fe, p as ye } from "./cache-utils-38Dqu4Qf.js";
15
- const o = "cache-entries", h = 1, m = 36e5;
16
- class u {
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 ?? m;
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, s) => {
25
- const t = indexedDB.open(this._databaseName, h);
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 a = t.result;
28
- if (!a.objectStoreNames.contains(o)) {
29
- const n = a.createObjectStore(o, {
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, s(t.error);
38
+ this._openPromise = null, a(t.error);
38
39
  };
39
40
  }), this._openPromise);
40
41
  }
41
- static cacheKey(e, s) {
42
- return `${e}:${s}`;
42
+ static cacheKey(e, a) {
43
+ return `${e}:${a}`;
43
44
  }
44
- async get(e, s) {
45
+ async get(e, a) {
45
46
  const t = await this.open();
46
- return new Promise((a, n) => {
47
- const r = t.transaction(o, "readonly").objectStore(o).get(u.cacheKey(e, s));
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
- a(null);
52
+ s(null);
52
53
  return;
53
54
  }
54
55
  if (Date.now() > c.expiresAt) {
55
- this.invalidate(e, s), a(null);
56
+ this.invalidate(e, a), s(null);
56
57
  return;
57
58
  }
58
- a(c);
59
+ s(c);
59
60
  }, r.onerror = () => n(r.error);
60
61
  });
61
62
  }
62
- async set(e, s, t, a = {}) {
63
- const n = await this.open(), d = Date.now(), i = a.ttl ?? this._defaultTTL, r = {
64
- key: u.cacheKey(e, s),
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: s,
67
+ id: a,
67
68
  attributes: t,
68
- relationships: a.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 l = n.transaction(o, "readwrite").objectStore(o).put(r);
74
- l.onsuccess = () => c(), l.onerror = () => p(l.error);
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, s) {
78
- return await this.get(e, s) !== null;
78
+ async has(e, a) {
79
+ return await this.get(e, a) !== null;
79
80
  }
80
- async invalidate(e, s) {
81
+ async invalidate(e, a) {
81
82
  const t = await this.open();
82
- return new Promise((a, n) => {
83
- const r = t.transaction(o, "readwrite").objectStore(o).delete(u.cacheKey(e, s));
84
- r.onsuccess = () => a(), r.onerror = () => n(r.error);
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 s = await this.open();
89
- return e ? new Promise((t, a) => {
90
- const r = s.transaction(o, "readwrite").objectStore(o).index("modelName").openCursor(IDBKeyRange.only(e));
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 = () => a(r.error);
95
- }) : new Promise((t, a) => {
96
- const i = s.transaction(o, "readwrite").objectStore(o).clear();
97
- i.onsuccess = () => t(), i.onerror = () => a(i.error);
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
- T as ATTRIBUTES_META_KEY,
106
- k as Adapter,
107
- I as AdapterPopulatedRecordArray,
108
- g as AsyncBelongsTo,
109
- L as AsyncHasMany,
110
- Z as BaseTransform,
111
- ee as BooleanTransform,
112
- oe as CacheHandler,
113
- te as DateTransform,
114
- G as EmbeddedRecordsMixin,
115
- q as Errors,
116
- ne as FetchHandler,
117
- B as IdentityMap,
118
- u as IndexedDBCache,
119
- de as JsonApiAdapter,
120
- ue as JsonApiSerializer,
121
- Q as JsonSerializer,
122
- b as MODEL_NAME_META_KEY,
123
- D as ManyArray,
124
- C as MemoryAdapter,
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
- se as NumberTransform,
127
- pe as ODataAdapter,
128
- _ as RELATIONSHIPS_META_KEY,
129
- me as RESPONSE_HEADERS,
130
- J as RecordArray,
131
- ce as RequestManager,
132
- Y as RestAdapter,
133
- W as RestSerializer,
134
- P as SchemaService,
135
- $ as Serializer,
136
- K as Snapshot,
137
- O as StateMachine,
138
- z as Store,
139
- ae as StringTransform,
140
- Ae as attachResponseHeaders,
141
- E as attr,
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
- fe as extractResponseHeaders,
144
- w as hasMany,
145
- ye as parseCacheTTLFromHeaders
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":"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"}
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