on-zero 0.4.23 → 0.4.24

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 (93) hide show
  1. package/dist/cjs/combineZeroClients.cjs +101 -0
  2. package/dist/cjs/combineZeroClients.native.js +150 -0
  3. package/dist/cjs/combineZeroClients.native.js.map +1 -0
  4. package/dist/cjs/createUseQuery.cjs +92 -4
  5. package/dist/cjs/createUseQuery.native.js +130 -4
  6. package/dist/cjs/createUseQuery.native.js.map +1 -1
  7. package/dist/cjs/createZeroClient.cjs +41 -13
  8. package/dist/cjs/createZeroClient.native.js +75 -43
  9. package/dist/cjs/createZeroClient.native.js.map +1 -1
  10. package/dist/cjs/index.cjs +1 -0
  11. package/dist/cjs/index.native.js +1 -0
  12. package/dist/cjs/index.native.js.map +1 -1
  13. package/dist/cjs/instanceRegistry.cjs +65 -0
  14. package/dist/cjs/instanceRegistry.native.js +111 -0
  15. package/dist/cjs/instanceRegistry.native.js.map +1 -0
  16. package/dist/cjs/multiInstance.test.cjs +322 -0
  17. package/dist/cjs/multiInstance.test.native.js +387 -0
  18. package/dist/cjs/multiInstance.test.native.js.map +1 -0
  19. package/dist/cjs/multiInstanceNested.test.cjs +206 -0
  20. package/dist/cjs/multiInstanceNested.test.native.js +254 -0
  21. package/dist/cjs/multiInstanceNested.test.native.js.map +1 -0
  22. package/dist/cjs/run.cjs +5 -5
  23. package/dist/cjs/run.native.js +6 -5
  24. package/dist/cjs/run.native.js.map +1 -1
  25. package/dist/cjs/zeroRunner.cjs +4 -1
  26. package/dist/cjs/zeroRunner.native.js +4 -1
  27. package/dist/cjs/zeroRunner.native.js.map +1 -1
  28. package/dist/esm/combineZeroClients.mjs +76 -0
  29. package/dist/esm/combineZeroClients.mjs.map +1 -0
  30. package/dist/esm/combineZeroClients.native.js +122 -0
  31. package/dist/esm/combineZeroClients.native.js.map +1 -0
  32. package/dist/esm/createUseQuery.mjs +92 -5
  33. package/dist/esm/createUseQuery.mjs.map +1 -1
  34. package/dist/esm/createUseQuery.native.js +130 -5
  35. package/dist/esm/createUseQuery.native.js.map +1 -1
  36. package/dist/esm/createZeroClient.mjs +42 -14
  37. package/dist/esm/createZeroClient.mjs.map +1 -1
  38. package/dist/esm/createZeroClient.native.js +76 -44
  39. package/dist/esm/createZeroClient.native.js.map +1 -1
  40. package/dist/esm/index.js +1 -0
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/index.mjs +1 -0
  43. package/dist/esm/index.mjs.map +1 -1
  44. package/dist/esm/index.native.js +1 -0
  45. package/dist/esm/index.native.js.map +1 -1
  46. package/dist/esm/instanceRegistry.mjs +38 -0
  47. package/dist/esm/instanceRegistry.mjs.map +1 -0
  48. package/dist/esm/instanceRegistry.native.js +81 -0
  49. package/dist/esm/instanceRegistry.native.js.map +1 -0
  50. package/dist/esm/multiInstance.test.mjs +323 -0
  51. package/dist/esm/multiInstance.test.mjs.map +1 -0
  52. package/dist/esm/multiInstance.test.native.js +385 -0
  53. package/dist/esm/multiInstance.test.native.js.map +1 -0
  54. package/dist/esm/multiInstanceNested.test.mjs +207 -0
  55. package/dist/esm/multiInstanceNested.test.mjs.map +1 -0
  56. package/dist/esm/multiInstanceNested.test.native.js +252 -0
  57. package/dist/esm/multiInstanceNested.test.native.js.map +1 -0
  58. package/dist/esm/run.mjs +5 -5
  59. package/dist/esm/run.mjs.map +1 -1
  60. package/dist/esm/run.native.js +6 -5
  61. package/dist/esm/run.native.js.map +1 -1
  62. package/dist/esm/zeroRunner.mjs +4 -1
  63. package/dist/esm/zeroRunner.mjs.map +1 -1
  64. package/dist/esm/zeroRunner.native.js +4 -1
  65. package/dist/esm/zeroRunner.native.js.map +1 -1
  66. package/package.json +5 -3
  67. package/readme.md +59 -0
  68. package/src/combineZeroClients.tsx +186 -0
  69. package/src/createUseQuery.tsx +175 -12
  70. package/src/createZeroClient.tsx +107 -42
  71. package/src/index.ts +1 -0
  72. package/src/instanceRegistry.ts +75 -0
  73. package/src/multiInstance.test.tsx +284 -0
  74. package/src/multiInstanceNested.test.tsx +205 -0
  75. package/src/run.ts +7 -6
  76. package/src/zeroRunner.ts +7 -1
  77. package/types/combineZeroClients.d.ts +38 -0
  78. package/types/combineZeroClients.d.ts.map +1 -0
  79. package/types/createUseQuery.d.ts +15 -0
  80. package/types/createUseQuery.d.ts.map +1 -1
  81. package/types/createZeroClient.d.ts +7 -2
  82. package/types/createZeroClient.d.ts.map +1 -1
  83. package/types/index.d.ts +1 -0
  84. package/types/index.d.ts.map +1 -1
  85. package/types/instanceRegistry.d.ts +15 -0
  86. package/types/instanceRegistry.d.ts.map +1 -0
  87. package/types/multiInstance.test.d.ts +2 -0
  88. package/types/multiInstance.test.d.ts.map +1 -0
  89. package/types/multiInstanceNested.test.d.ts +5 -0
  90. package/types/multiInstanceNested.test.d.ts.map +1 -0
  91. package/types/run.d.ts.map +1 -1
  92. package/types/zeroRunner.d.ts +3 -1
  93. package/types/zeroRunner.d.ts.map +1 -1
@@ -0,0 +1,385 @@
1
+ import { createSchema, string, table } from "@rocicorp/zero";
2
+ import { createEmitter } from "@take-out/helpers";
3
+ import { describe, expect, test, vi } from "vitest";
4
+ import { combineZeroClients } from "./combineZeroClients.native.js";
5
+ import { createZeroClient } from "./createZeroClient.native.js";
6
+ import { getInstanceForNamespace, registerClientInstance } from "./instanceRegistry.native.js";
7
+ import { registerQuery } from "./queryRegistry.native.js";
8
+ import { run } from "./run.native.js";
9
+ import { setRunner } from "./zeroRunner.native.js";
10
+ var userTable = table("user").columns({
11
+ id: string(),
12
+ name: string()
13
+ }).primaryKey("id");
14
+ var taskTable = table("task").columns({
15
+ id: string(),
16
+ title: string()
17
+ }).primaryKey("id");
18
+ var schema = createSchema({
19
+ tables: [userTable, taskTable]
20
+ });
21
+ var makeQueryFn = function () {
22
+ return function (args) {
23
+ return args;
24
+ };
25
+ };
26
+ function makeClient(instanceName, namespace) {
27
+ var byId = makeQueryFn();
28
+ return {
29
+ byId,
30
+ client: createZeroClient({
31
+ schema,
32
+ models: {},
33
+ groupedQueries: {
34
+ [namespace]: {
35
+ byId
36
+ }
37
+ },
38
+ instanceName
39
+ })
40
+ };
41
+ }
42
+ function fakeClient(name, namespaces, zeroStub) {
43
+ registerClientInstance({
44
+ name,
45
+ namespaces,
46
+ // boundary stub: dispatch tests never resolve queries through it
47
+ customQueries: {}
48
+ });
49
+ return {
50
+ instanceName: name,
51
+ useQuery: vi.fn(function () {
52
+ return `${name}-useQuery`;
53
+ }),
54
+ useQueryDirect: vi.fn(function () {
55
+ return `${name}-useQueryDirect`;
56
+ }),
57
+ usePermission: vi.fn(function () {
58
+ return `${name}-usePermission`;
59
+ }),
60
+ usePermissionDirect: vi.fn(function () {
61
+ return `${name}-usePermissionDirect`;
62
+ }),
63
+ zero: zeroStub,
64
+ preload: vi.fn(function () {
65
+ return `${name}-preload`;
66
+ }),
67
+ getQuery: vi.fn(function () {
68
+ return `${name}-getQuery`;
69
+ }),
70
+ zeroEvents: createEmitter(`zero:test-${name}`, null),
71
+ ControlQueries: function (param) {
72
+ var {
73
+ children
74
+ } = param;
75
+ return children;
76
+ }
77
+ };
78
+ }
79
+ describe("multi-instance namespace dispatch", function () {
80
+ test("run() dispatches named queries to the owning instance runner", async function () {
81
+ var control = makeClient("run-control", "runUser");
82
+ var project = makeClient("run-project", "runTask");
83
+ var controlRunner = vi.fn(async function () {
84
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
85
+ _args[_key] = arguments[_key];
86
+ }
87
+ return {
88
+ from: "control"
89
+ };
90
+ });
91
+ var projectRunner = vi.fn(async function () {
92
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
93
+ _args[_key] = arguments[_key];
94
+ }
95
+ return {
96
+ from: "project"
97
+ };
98
+ });
99
+ getInstanceForNamespace("runUser").runner = controlRunner;
100
+ getInstanceForNamespace("runTask").runner = projectRunner;
101
+ var ambientRunner = vi.fn(async function () {
102
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
103
+ _args[_key] = arguments[_key];
104
+ }
105
+ return {
106
+ from: "ambient"
107
+ };
108
+ });
109
+ setRunner(ambientRunner);
110
+ await expect(run(control.byId, {
111
+ id: "1"
112
+ })).resolves.toEqual({
113
+ from: "control"
114
+ });
115
+ await expect(run(project.byId, {
116
+ id: "2"
117
+ })).resolves.toEqual({
118
+ from: "project"
119
+ });
120
+ expect(ambientRunner).not.toHaveBeenCalled();
121
+ var request = controlRunner.mock.calls[0][0];
122
+ expect(request.query.queryName).toBe("runUser.byId");
123
+ });
124
+ test("a claimed namespace with an unmounted instance uses the ambient runner (server path)", async function () {
125
+ var {
126
+ byId
127
+ } = makeClient("srv-instance", "srvThing");
128
+ var ambient = vi.fn(async function () {
129
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
130
+ _args[_key] = arguments[_key];
131
+ }
132
+ return {
133
+ from: "ambient"
134
+ };
135
+ });
136
+ setRunner(ambient);
137
+ await expect(run(byId, {
138
+ id: "1"
139
+ })).resolves.toEqual({
140
+ from: "ambient"
141
+ });
142
+ expect(ambient).toHaveBeenCalledTimes(1);
143
+ });
144
+ test("duplicate namespace claim throws at create time", function () {
145
+ makeClient("dup-a", "dupNs");
146
+ expect(function () {
147
+ return makeClient("dup-b", "dupNs");
148
+ }).toThrow(/already claimed/);
149
+ });
150
+ test("re-creating an instance under the same name re-claims without throwing (hmr)", function () {
151
+ var _getInstanceForNamespace;
152
+ makeClient("hmr", "hmrNs");
153
+ expect(function () {
154
+ return makeClient("hmr", "hmrNs");
155
+ }).not.toThrow();
156
+ expect((_getInstanceForNamespace = getInstanceForNamespace("hmrNs")) === null || _getInstanceForNamespace === void 0 ? void 0 : _getInstanceForNamespace.name).toBe("hmr");
157
+ });
158
+ test("model namespaces are claimed too", function () {
159
+ var _getInstanceForNamespace;
160
+ var models = {
161
+ mdlThing: {
162
+ mutate: {
163
+ insert: async function () {}
164
+ }
165
+ }
166
+ };
167
+ createZeroClient({
168
+ schema,
169
+ models,
170
+ groupedQueries: {},
171
+ instanceName: "mdl-a"
172
+ });
173
+ expect((_getInstanceForNamespace = getInstanceForNamespace("mdlThing")) === null || _getInstanceForNamespace === void 0 ? void 0 : _getInstanceForNamespace.name).toBe("mdl-a");
174
+ expect(function () {
175
+ return createZeroClient({
176
+ schema,
177
+ models,
178
+ groupedQueries: {},
179
+ instanceName: "mdl-b"
180
+ });
181
+ }).toThrow(/already claimed/);
182
+ });
183
+ });
184
+ describe("multi-instance isolation", function () {
185
+ test("each instance has an isolated zeroEvents emitter", function () {
186
+ var _a_zeroEvents_options, _b_zeroEvents_options;
187
+ var {
188
+ client: a
189
+ } = makeClient("emit-a", "emitA");
190
+ var {
191
+ client: b
192
+ } = makeClient("emit-b", "emitB");
193
+ expect(a.zeroEvents).not.toBe(b.zeroEvents);
194
+ expect((_a_zeroEvents_options = a.zeroEvents.options) === null || _a_zeroEvents_options === void 0 ? void 0 : _a_zeroEvents_options.name).toBe("zero:emit-a");
195
+ expect((_b_zeroEvents_options = b.zeroEvents.options) === null || _b_zeroEvents_options === void 0 ? void 0 : _b_zeroEvents_options.name).toBe("zero:emit-b");
196
+ var seenByB = [];
197
+ b.zeroEvents.listen(function (event) {
198
+ return seenByB.push(event);
199
+ });
200
+ a.zeroEvents.emit({
201
+ type: "error",
202
+ message: "a-only"
203
+ });
204
+ expect(seenByB).toEqual([]);
205
+ expect(a.zeroEvents.value).toEqual({
206
+ type: "error",
207
+ message: "a-only"
208
+ });
209
+ expect(b.zeroEvents.value).toBe(null);
210
+ });
211
+ test("the default instance keeps the legacy emitter name", function () {
212
+ var _client_zeroEvents_options;
213
+ var {
214
+ client
215
+ } = makeClient("default", "defaultNs");
216
+ expect((_client_zeroEvents_options = client.zeroEvents.options) === null || _client_zeroEvents_options === void 0 ? void 0 : _client_zeroEvents_options.name).toBe("zero");
217
+ });
218
+ test("each instance has its own unmounted zero proxy", function () {
219
+ var {
220
+ client: a
221
+ } = makeClient("proxy-a", "proxyA");
222
+ var {
223
+ client: b
224
+ } = makeClient("proxy-b", "proxyB");
225
+ expect(a.zero === b.zero).toBe(false);
226
+ expect(function () {
227
+ return a.zero.clientID;
228
+ }).toThrow(/not initialized/);
229
+ expect(function () {
230
+ return b.zero.clientID;
231
+ }).toThrow(/not initialized/);
232
+ });
233
+ });
234
+ describe("combineZeroClients facade", function () {
235
+ test("zero.mutate dispatches by model namespace, rest forwards to primary", function () {
236
+ var insertSpy = vi.fn();
237
+ var updateSpy = vi.fn();
238
+ var control = fakeClient("fz-control", ["fzUser"], {
239
+ mutate: {
240
+ fzUser: {
241
+ insert: insertSpy
242
+ }
243
+ },
244
+ userID: "primary-user"
245
+ });
246
+ var project = fakeClient("fz-project", ["fzTask"], {
247
+ mutate: {
248
+ fzTask: {
249
+ update: updateSpy
250
+ }
251
+ },
252
+ userID: "project-user"
253
+ });
254
+ var combined = combineZeroClients(control, project);
255
+ var zero = combined.zero;
256
+ zero.mutate.fzUser.insert({
257
+ id: "1"
258
+ });
259
+ zero.mutate.fzTask.update({
260
+ id: "2"
261
+ });
262
+ expect(insertSpy).toHaveBeenCalledWith({
263
+ id: "1"
264
+ });
265
+ expect(updateSpy).toHaveBeenCalledWith({
266
+ id: "2"
267
+ });
268
+ expect(zero.userID).toBe("primary-user");
269
+ expect(zero.mutate.unknownNs).toBe(void 0);
270
+ });
271
+ test("useQuery/preload/getQuery/usePermission dispatch by namespace", function () {
272
+ var control = fakeClient("fq-control", ["fqUser"], {});
273
+ var project = fakeClient("fq-project", ["fqTask"], {});
274
+ var userQuery = makeQueryFn();
275
+ var taskQuery = makeQueryFn();
276
+ registerQuery(userQuery, "fqUser.byId");
277
+ registerQuery(taskQuery, "fqTask.byId");
278
+ var combined = combineZeroClients(control, project);
279
+ var useQuery = combined.useQuery;
280
+ var preload = combined.preload;
281
+ var getQuery = combined.getQuery;
282
+ var usePermission = combined.usePermission;
283
+ useQuery(userQuery, {
284
+ id: "1"
285
+ });
286
+ expect(control.useQueryDirect).toHaveBeenCalledWith(userQuery, {
287
+ id: "1"
288
+ });
289
+ expect(control.useQuery).not.toHaveBeenCalled();
290
+ expect(project.useQuery).not.toHaveBeenCalled();
291
+ useQuery(taskQuery, {
292
+ id: "2"
293
+ });
294
+ expect(project.useQuery).toHaveBeenCalledWith(taskQuery, {
295
+ id: "2"
296
+ });
297
+ expect(project.useQueryDirect).not.toHaveBeenCalled();
298
+ preload(taskQuery, {
299
+ id: "3"
300
+ });
301
+ expect(project.preload).toHaveBeenCalledWith(taskQuery, {
302
+ id: "3"
303
+ });
304
+ expect(control.preload).not.toHaveBeenCalled();
305
+ getQuery(userQuery, {
306
+ id: "4"
307
+ });
308
+ expect(control.getQuery).toHaveBeenCalledWith(userQuery, {
309
+ id: "4"
310
+ });
311
+ expect(project.getQuery).not.toHaveBeenCalled();
312
+ var anonymous = makeQueryFn();
313
+ useQuery(anonymous, {
314
+ id: "5"
315
+ });
316
+ expect(control.useQueryDirect).toHaveBeenCalledWith(anonymous, {
317
+ id: "5"
318
+ });
319
+ usePermission("fqTask", "row-1");
320
+ expect(project.usePermission).toHaveBeenCalledWith("fqTask", "row-1");
321
+ expect(project.usePermissionDirect).not.toHaveBeenCalled();
322
+ usePermission("fqUser", "row-2");
323
+ expect(control.usePermissionDirect).toHaveBeenCalledWith("fqUser", "row-2");
324
+ expect(control.usePermission).not.toHaveBeenCalled();
325
+ });
326
+ test("the inner option overrides which client uses the context path", function () {
327
+ var a = fakeClient("inner-a", ["innerA"], {});
328
+ var b = fakeClient("inner-b", ["innerB"], {});
329
+ var aQuery = makeQueryFn();
330
+ var bQuery = makeQueryFn();
331
+ registerQuery(aQuery, "innerA.byId");
332
+ registerQuery(bQuery, "innerB.byId");
333
+ var combined = combineZeroClients(a, b, {
334
+ inner: "inner-a"
335
+ });
336
+ var useQuery = combined.useQuery;
337
+ useQuery(aQuery, {
338
+ id: "1"
339
+ });
340
+ expect(a.useQuery).toHaveBeenCalledWith(aQuery, {
341
+ id: "1"
342
+ });
343
+ expect(a.useQueryDirect).not.toHaveBeenCalled();
344
+ useQuery(bQuery, {
345
+ id: "2"
346
+ });
347
+ expect(b.useQueryDirect).toHaveBeenCalledWith(bQuery, {
348
+ id: "2"
349
+ });
350
+ expect(b.useQuery).not.toHaveBeenCalled();
351
+ expect(function () {
352
+ return combineZeroClients(a, b, {
353
+ inner: "nope"
354
+ });
355
+ }).toThrow(/not one of the passed clients/);
356
+ });
357
+ test("combined zeroEvents relays every instance", function () {
358
+ var _a_zeroEvents_value, _b_zeroEvents_value;
359
+ var {
360
+ client: a
361
+ } = makeClient("relay-a", "relayA");
362
+ var {
363
+ client: b
364
+ } = makeClient("relay-b", "relayB");
365
+ var combined = combineZeroClients(a, b);
366
+ var seen = [];
367
+ combined.zeroEvents.listen(function (event) {
368
+ return seen.push(event);
369
+ });
370
+ a.zeroEvents.emit({
371
+ type: "error",
372
+ message: "from-a"
373
+ });
374
+ b.zeroEvents.emit({
375
+ type: "error",
376
+ message: "from-b"
377
+ });
378
+ expect(seen.map(function (event) {
379
+ return event === null || event === void 0 ? void 0 : event.message;
380
+ })).toEqual(["from-a", "from-b"]);
381
+ expect((_a_zeroEvents_value = a.zeroEvents.value) === null || _a_zeroEvents_value === void 0 ? void 0 : _a_zeroEvents_value.message).toBe("from-a");
382
+ expect((_b_zeroEvents_value = b.zeroEvents.value) === null || _b_zeroEvents_value === void 0 ? void 0 : _b_zeroEvents_value.message).toBe("from-b");
383
+ });
384
+ });
385
+ //# sourceMappingURL=multiInstance.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createSchema","string","table","createEmitter","describe","expect","test","vi","combineZeroClients","createZeroClient","getInstanceForNamespace","registerClientInstance","registerQuery","run","setRunner","userTable","columns","id","name","primaryKey","taskTable","title","schema","tables","makeQueryFn","args","makeClient","instanceName","namespace","byId","client","models","groupedQueries","fakeClient","namespaces","zeroStub","customQueries","useQuery","fn","useQueryDirect","usePermission","usePermissionDirect","zero","preload","getQuery","zeroEvents","ControlQueries","param","children","control","project","controlRunner","_len","arguments","length","_args","Array","_key","from","projectRunner","runner","ambientRunner","resolves","toEqual","not","toHaveBeenCalled","request","mock","calls","query","queryName","toBe","ambient","toHaveBeenCalledTimes","toThrow","_getInstanceForNamespace","mdlThing","mutate","insert","_a_zeroEvents_options","_b_zeroEvents_options","a","b","options","seenByB","listen","event","push","emit","type","message","value","_client_zeroEvents_options"],"sources":["../../src/multiInstance.test.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,YAAA,EAAcC,MAAA,EAAQC,KAAA,QAAa;AAC5C,SAASC,aAAA,QAAqB;AAC9B,SAASC,QAAA,EAAUC,MAAA,EAAQC,IAAA,EAAMC,EAAA,QAAU;AAE3C,SAASC,kBAAA,QAA0B;AACnC,SAASC,gBAAA,QAAwB;AACjC,SAASC,uBAAA,EAAyBC,sBAAA,QAA8B;AAChE,SAASC,aAAA,QAAqB;AAC9B,SAASC,GAAA,QAAW;AACpB,SAASC,SAAA,QAAkC;AAM3C,IAAAC,SAAM,GAAAb,KAAY,OAAM,EAAMc,OAAE;EAChCC,EAAA,EAAMhB,MAAA;EAGNiB,IAAM,EAAAjB,MAAA,CAAS;AAIf,GAAAkB,UAAM;AAKN,IAAAC,SAAS,GAAAlB,KAAW,SAAAc,OAAsB;EACxCC,EAAA,EAAAhB,MAAM;EACNoB,KAAA,EAAOpB,MAAA;AAAA,GAAAkB,UACL;AAAA,IACAG,MAAA,GAAQtB,YAAA;EAAiBuB,MACvB,GAAAR,SACA,EAASK,SACT;AACA;AACD,IACHI,WAAA,YAAAA,CAAA;EACF,iBAAAC,IAAA;IAMA,OAASA,IAAA;EACP;AAAuB;AACrB,SACAC,WAAAC,YAAA,EAAAC,SAAA;EAAA,IAAAC,IAAA,GAAAL,WAAA;EAAA,OAEA;IACDK,IAAA;IACDC,MAAO,EAAArB,gBAAA;MACLa,MAAA;MACAS,MAAA,EAAU;MACVC,cAAgB;QAChB,CAAAJ,SAAA,GAAe;UACfC;QACA;MACA;MACAF;IACA;EAAqE;AACV;AAE/D,SAAAM,WAAAf,IAAA,EAAAgB,UAAA,EAAAC,QAAA;EAEAxB,sBAAS;IACPO,IAAK;IACHgB,UAAM;IACN;IAGAE,aAAM;EACN;EACA;IACAT,YAAA,EAAAT,IAAA;IAIAmB,QAAM,EAAA9B,EAAA,CAAA+B,EAAA,aAAmB;MACzB,UAAUpB,IAAA,WAA2B;IAErC;IACAqB,cAAa,EAAAhC,EAAI,CAAA+B,EAAA,aAAgB;MACjC,OAAO,GAAApB,IAAA,iBAAmB;IAG1B;IACAsB,aAAO,EAAQjC,EAAA,CAAA+B,EAAA,CAAM,YAAW;MACjC,UAAApB,IAAA;IAED;IACEuB,mBAAiB,EAAAlC,EAAA,CAAA+B,EAAA,aAAW;MAC5B,OAAM,GAAApB,IAAU,sBAAgB;IAChC;IAEAwB,IAAA,EAAMP,QAAO;IACbQ,OAAO,EAAApC,EAAA,CAAA+B,EAAO,aAAE;MACjB,UAAApB,IAAA;IAED;IACE0B,QAAA,EAAArC,EAAW,CAAA+B,EAAA,aAAgB;MAC3B,OAAO,GAAApB,IAAM,WAAW;IACzB;IAED2B,UAAK,EAAA1C,aAAA,cAAAe,IAAA;IACH4B,cAAW,WAAAA,CAAcC,KAAA;MACzB;QAAOC;MAAM,IAAAD,KAAW;MACxB,OAAOC,QAAA;IACR;EAED;AACE;AAA2D5C,QAAK,oCAAE;EAClEE,IAAA,+DAAiB;IAAA,IACf2C,OAAA,GAAAvB,UAAA;IAAA,IACAwB,OAAA,GAAAxB,UAAA;IAAA,IACAyB,aAAA,GAAiB5C,EAAA,CAAA+B,EAAA;MACjB,SAAAc,IAAA,GAAcC,SAAA,CAAAC,MAAA,EAAAC,KAAA,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;QACfF,KAAA,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;MACD;MACA;QAAOC,IACL;MAAiB;IACf;IACA,IACAC,aAAA,GAAgBpD,EAAC,CAAA+B,EAAA;MAAA,KACjB,IAAAc,IAAA,GAAcC,SAAA,CAAAC,MAAA,EAAAC,KAAA,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;QACfF,KAAA,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;MACD;MACH;QACFC,IAAA;MAED;IACE;IACEhD,uBAAsB,UAAW,EAAAkD,MAAA,GAAUT,aAAO;IAClDzC,uBAAsB,UAAW,EAAAkD,MAAA,GAAUD,aAAO;IAElD,IAAAE,aAAS,GAAUtD,EAAE,CAAA+B,EAAI,mBAAiB;MAC1C,KAAO,IAAEc,IAAA,GAAAC,SAAW,CAAAC,MAAa,EAAEC,KAAK,OAAAC,KAAa,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;QACrDF,KAAS,CAAAE,IAAA,IAAAJ,SAAW,CAAAI,IAAS,CAAI;MAEjC;MACE;QACAC,IAAA;MAEF;IACA;IACA5C,SAAS,CAAA+C,aAAW;IACrB,MAAAxD,MAAA,CAAAQ,GAAA,CAAAoC,OAAA,CAAApB,IAAA;MAEDZ,EAAK;IACH,IAAA6C,QAAQ,CAAAC,OAAW;MACnBL,IAAA,EAAO;IACR;IAED,MAAKrD,MAAA,CAAAQ,GAAA,CAAAqC,OAAA,CAAArB,IAAA;MACHZ,EAAA,EAAM;IACN,IAAA6C,QAAQ,CAAAC,OAAU;MAGlBL,IAAA,EAAO;IAGP;IACArD,MAAA,CAAOwD,aAAa,EAAAG,GAAA,CAAAC,gBAAkB;IACvC,IAAAC,OAAA,GAAAf,aAAA,CAAAgB,IAAA,CAAAC,KAAA;IACF/D,MAAA,CAAA6D,OAAA,CAAAG,KAAA,CAAAC,SAAA,EAAAC,IAAA;EAED;EACEjE,IAAA,CAAK,sFAA6E;IAChF;MAAMuB;IAAA,IAAAH,UAAkB;IACxB,IAAA8C,OAAM,GAAAjE,EAAA,CAAA+B,EAAY,mBAAM;MACxB,KAAM,IAAAc,IAAA,GAAUC,SAAW,CAAAC,MAAA,EAAAC,KAAc,GAAC,IAAAC,KAAW,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;QACnDF,KAAA,CAAQE,IAAE,IAAAJ,SAAU,CAAAI,IAAQ;MAC5B;MACD;QACDC,IAAM;MACJ;IAAwC,EACxC;IACF5C,SAAC,CAAA0D,OAAA;IAED,MAAMnE,MAAA,CAAAQ,GAAA,CAAWgB,IAAA;MACjBZ,EAAA,EAAM;IAEN,IAAA6C,QAAY,CAAAC,OAAO;MACnBL,IAAK;IAEL;IACArD,MAAA,CAAOmE,OAAA,EAASC,qBAAE,EAAqB;EACvC;EAEAnE,IAAA,kDAA4C;IAC7CoB,UAAA;IAEDrB,MAAK;MACH,OAAMqB,UAAU,QAAW;IAC3B,GAAAgD,OAAM,kBAAqB;EAC3B;EACApE,IAAA,+EAA8B;IAC9B,IAAAqE,wBAAyB;IACzBjD,UAAA,MAAc,SAAW;IAIzBrB,MAAM,aAAW;MACjB,OAAMqB,UAAW,QAAS;IAC1B,GAAAsC,GAAM,CAAAU,OAAA,EAAU;IAChBrE,MAAM,EAAAsE,wBAAoB,GAAAjE,uBAAA,uBAAAiE,wBAAA,uBAAAA,wBAAA,CAAAzD,IAAA,EAAAqD,IAAA;EAC1B;EAEAjE,IAAA,mCAA+B;IAC/B,IAAAqE,wBAAe;IACf,IAAA5C,MAAO;MACP6C,QAAO;QAEPC,MAAS;UACTC,MAAO,iBAAAA,CAAA,EAAkB,CACzB;QAEA;MACA;IACA;IAEArE,gBAAS;MACTa,MAAO;MACPS,MAAO;MAGPC,cAAM,EAAY;MAClBL,YAAS;IACT;IAIAtB,MAAA,EAAAsE,wBAA+B,GAAAjE,uBAAA,0BAAAiE,wBAAA,uBAAAA,wBAAA,CAAAzD,IAAA,EAAAqD,IAAA;IAC/BlE,MAAA,CAAO,YAAQ;MACf,OAAOI,gBAAQ;QAEfa,MAAA;QACAS,MAAO;QACPC,cAAe;QAChBL,YAAA;MAED,CAAK;IACH,GAAA+C,OAAU,kBAAW;EACrB;AACA;AACAtE,QAAA,2BAA2B;EAC3BE,IAAA,mDAAmC;IACnC,IAAAyE,qBAAsB,EAAAC,qBAAa;IAGnC;MAAMlD,MAAA,EAAAmD;IAAA,CAAW,GAAAvD,UAAA,SAAsB,SAAK;IAC5C;MAAMI,MAAA,EAAAoD;IAAA,CAAW,GAAAxD,UAAS;IAE1BrB,MAAA,CAAA4E,CAAA,CAASpC,UAAU,EAAAmB,GAAI,CAAAO,IAAK,CAAAW,CAAA,CAAArC,UAAA;IAC5BxC,MAAA,CAAO,CAAA0E,qBAAY,GAAAE,CAAA,CAAApC,UAAqB,CAAAsC,OAAU,MAAQ,IAAC,IAAAJ,qBAAA,uBAAAA,qBAAA,CAAA7D,IAAA,EAAAqD,IAAA;IAC3DlE,MAAA,CAAO,CAAA2E,qBAAsB,GAAAE,CAAA,CAAArC,UAAA,CAAAsC,OAAiB,cAAAH,qBAAA,uBAAAA,qBAAA,CAAA9D,IAAA,EAAAqD,IAAA;IAE9C,IAAAa,OAAS;IACTF,CAAA,CAAArC,UAAS,CAAAwC,MAAA,WAAgBC,KAAA;MACzB,OAASF,OAAA,CAAQG,IAAE,CAAAD,KAAI;IAEvB;IAA0DL,CAAA,CACxDpC,UAAA,CAAA2C,IAAA;MACFC,IAAA;MACDC,OAAA;IAED;IACErF,MAAM,CAAA+E,OAAE,EAAQrB,OAAM;IACtB1D,MAAM,CAAA4E,CAAE,CAAApC,UAAU,CAAA8C,KAAI,EAAA5B,OAAW;MAEjC0B,IAAM;MACNC,OAAM;IACN;IAEArF,MAAE,CAAA6E,CAAA,CAAArC,UAAgB,CAAE8C,KAAA,CAAM,CAAApB,IAAA,KAAS;EACnC;EAEAjE,IAAA,qDAAqD,cAAU;IAE/D,IAAAsF,0BAA2B;IAC3B;MAAA9D;IAAS,IAAAJ,UAAkB,UAAS,aAAa;IAClDrB,MAAA,EAAAuF,0BAAA,GAAA9D,MAAA,CAAAe,UAAA,CAAAsC,OAAA,cAAAS,0BAAA,uBAAAA,0BAAA,CAAA1E,IAAA,EAAAqD,IAAA;EACF","ignoreList":[]}
@@ -0,0 +1,207 @@
1
+ import { createSchema, string, table } from "@rocicorp/zero";
2
+ import { act } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import { afterEach, beforeEach, expect, test } from "vitest";
5
+ import { combineZeroClients } from "./combineZeroClients.mjs";
6
+ import { createZeroClient } from "./createZeroClient.mjs";
7
+ import { zql } from "./zql.mjs";
8
+ import { jsx } from "react/jsx-runtime";
9
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
10
+ const userTable = table("user").columns({
11
+ id: string(),
12
+ name: string()
13
+ }).primaryKey("id");
14
+ const taskTable = table("task").columns({
15
+ id: string(),
16
+ title: string()
17
+ }).primaryKey("id");
18
+ const schema = createSchema({
19
+ tables: [userTable, taskTable]
20
+ });
21
+ const controlModels = {
22
+ user: {
23
+ mutate: {
24
+ seed: async (ctx, row) => {
25
+ await ctx.tx.mutate.user.upsert(row);
26
+ }
27
+ }
28
+ }
29
+ };
30
+ const ctlUserById = args => zql.user.where("id", args.id).one();
31
+ const control = createZeroClient({
32
+ schema,
33
+ models: controlModels,
34
+ groupedQueries: {
35
+ ctlUser: {
36
+ byId: ctlUserById
37
+ }
38
+ },
39
+ instanceName: "nested-control"
40
+ });
41
+ const projectModels = {
42
+ prjSeed: {
43
+ mutate: {
44
+ seedUser: async (ctx, row) => {
45
+ await ctx.tx.mutate.user.upsert(row);
46
+ }
47
+ }
48
+ }
49
+ };
50
+ const prjTaskById = args => zql.task.where("id", args.id).one();
51
+ const project = createZeroClient({
52
+ schema,
53
+ models: projectModels,
54
+ groupedQueries: {
55
+ prjTask: {
56
+ byId: prjTaskById
57
+ }
58
+ },
59
+ instanceName: "nested-project"
60
+ });
61
+ const combined = combineZeroClients(control, project);
62
+ let root;
63
+ let container;
64
+ beforeEach(() => {
65
+ resetProbe();
66
+ container = document.createElement("div");
67
+ document.body.appendChild(container);
68
+ root = createRoot(container);
69
+ });
70
+ afterEach(async () => {
71
+ await act(async () => root.unmount());
72
+ container.remove();
73
+ });
74
+ const render = ui => act(async () => root.render(ui));
75
+ async function waitFor(condition, what) {
76
+ for (let i = 0; i < 200; i++) {
77
+ if (condition()) return;
78
+ await act(async () => {
79
+ await new Promise(resolve => setTimeout(resolve, 5));
80
+ });
81
+ }
82
+ throw new Error(`timed out waiting for ${what}`);
83
+ }
84
+ const probe = {
85
+ data: void 0,
86
+ renders: 0
87
+ };
88
+ function resetProbe() {
89
+ probe.data = void 0;
90
+ probe.renders = 0;
91
+ }
92
+ function ControlUserProbe({
93
+ id
94
+ }) {
95
+ const [data] = combined.useQuery(ctlUserById, {
96
+ id
97
+ });
98
+ probe.data = data ?? void 0;
99
+ probe.renders++;
100
+ return null;
101
+ }
102
+ const seedControl = async row => {
103
+ await act(async () => {
104
+ await control.zero.mutate.user.seed(row).client;
105
+ });
106
+ };
107
+ const seedProject = async row => {
108
+ await act(async () => {
109
+ await project.zero.mutate.prjSeed.seedUser(row).client;
110
+ });
111
+ };
112
+ test("outer-instance query reads the OUTER store under nested providers", async () => {
113
+ await render(/* @__PURE__ */jsx(control.ProvideZero, {
114
+ server: null,
115
+ userID: "t1-ctl",
116
+ children: /* @__PURE__ */jsx(project.ProvideZero, {
117
+ server: null,
118
+ userID: "t1-prj",
119
+ children: /* @__PURE__ */jsx(ControlUserProbe, {
120
+ id: "u1"
121
+ })
122
+ })
123
+ }));
124
+ await waitFor(() => probe.renders > 0, "probe mount");
125
+ await seedControl({
126
+ id: "u1",
127
+ name: "from-control"
128
+ });
129
+ await seedProject({
130
+ id: "u1",
131
+ name: "from-project"
132
+ });
133
+ await waitFor(() => probe.data !== void 0, "control row visible");
134
+ expect(probe.data?.name).toBe("from-control");
135
+ });
136
+ test("inner provider unmount/remount does not break outer-instance subscriptions", async () => {
137
+ const App = ({
138
+ showInner
139
+ }) => /* @__PURE__ */jsx(control.ProvideZero, {
140
+ server: null,
141
+ userID: "t2-ctl",
142
+ children: showInner ? /* @__PURE__ */jsx(project.ProvideZero, {
143
+ server: null,
144
+ userID: "t2-prj",
145
+ children: /* @__PURE__ */jsx(ControlUserProbe, {
146
+ id: "u2"
147
+ })
148
+ }) : /* @__PURE__ */jsx(ControlUserProbe, {
149
+ id: "u2"
150
+ })
151
+ });
152
+ await render(/* @__PURE__ */jsx(App, {
153
+ showInner: true
154
+ }));
155
+ await waitFor(() => probe.renders > 0, "probe mount");
156
+ await seedControl({
157
+ id: "u2",
158
+ name: "v1"
159
+ });
160
+ await waitFor(() => probe.data?.name === "v1", "v1 visible");
161
+ await render(/* @__PURE__ */jsx(App, {
162
+ showInner: false
163
+ }));
164
+ await seedControl({
165
+ id: "u2",
166
+ name: "v2"
167
+ });
168
+ await waitFor(() => probe.data?.name === "v2", "v2 visible after inner unmount");
169
+ await render(/* @__PURE__ */jsx(App, {
170
+ showInner: true
171
+ }));
172
+ await seedControl({
173
+ id: "u2",
174
+ name: "v3"
175
+ });
176
+ await waitFor(() => probe.data?.name === "v3", "v3 visible after inner remount");
177
+ });
178
+ test("direct-path views re-materialize when the owning instance rotates", async () => {
179
+ const App = ({
180
+ userID
181
+ }) => /* @__PURE__ */jsx(control.ProvideZero, {
182
+ server: null,
183
+ userID,
184
+ children: /* @__PURE__ */jsx(ControlUserProbe, {
185
+ id: "u3"
186
+ })
187
+ });
188
+ await render(/* @__PURE__ */jsx(App, {
189
+ userID: "rot-1"
190
+ }));
191
+ await waitFor(() => probe.renders > 0, "probe mount");
192
+ await seedControl({
193
+ id: "u3",
194
+ name: "before-rotation"
195
+ });
196
+ await waitFor(() => probe.data?.name === "before-rotation", "pre-rotation row");
197
+ await render(/* @__PURE__ */jsx(App, {
198
+ userID: "rot-2"
199
+ }));
200
+ await waitFor(() => probe.data === void 0, "view reset to the new empty store");
201
+ await seedControl({
202
+ id: "u3",
203
+ name: "after-rotation"
204
+ });
205
+ await waitFor(() => probe.data?.name === "after-rotation", "post-rotation row");
206
+ });
207
+ //# sourceMappingURL=multiInstanceNested.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","combineZeroClients","createZeroClient","zql","jsx","globalThis","IS_REACT_ACT_ENVIRONMENT","userTable","columns","id","name","primaryKey","taskTable","title","schema","tables","controlModels","user","mutate","seed","ctx","row","tx","upsert","ctlUserById","args","where","one","control","models","groupedQueries","ctlUser","byId","instanceName","projectModels","prjSeed","seedUser","prjTaskById","task","project","prjTask","combined","root","container","resetProbe","document","createElement","body","appendChild","unmount","remove","render","ui","waitFor","condition","what","i","Promise","resolve","setTimeout","Error","probe","data","renders","ControlUserProbe","useQuery","seedControl","zero","client","seedProject","ProvideZero","server","userID","children","toBe","App","showInner"],"sources":["../../src/multiInstanceNested.test.tsx"],"sourcesContent":[null],"mappings":"AAOA,SAASA,YAAA,EAAcC,MAAA,EAAQC,KAAA,QAAa;AAC5C,SAASC,GAAA,QAAW;AACpB,SAASC,UAAA,QAA6B;AACtC,SAASC,SAAA,EAAWC,UAAA,EAAYC,MAAA,EAAQC,IAAA,QAAY;AAEpD,SAASC,kBAAA,QAA0B;AACnC,SAASC,gBAAA,QAAwB;AACjC,SAASC,GAAA,QAAW;AA6HZ,SAAAC,GAAA;AApHRC,UAAA,CAAWC,wBAAA,GAA2B;AAEtC,MAAMC,SAAA,GAAYb,KAAA,CAAM,MAAM,EAAEc,OAAA,CAAQ;EAAEC,EAAA,EAAIhB,MAAA,CAAO;EAAGiB,IAAA,EAAMjB,MAAA,CAAO;AAAE,CAAC,EAAEkB,UAAA,CAAW,IAAI;AACzF,MAAMC,SAAA,GAAYlB,KAAA,CAAM,MAAM,EAC3Bc,OAAA,CAAQ;EAAEC,EAAA,EAAIhB,MAAA,CAAO;EAAGoB,KAAA,EAAOpB,MAAA,CAAO;AAAE,CAAC,EACzCkB,UAAA,CAAW,IAAI;AAClB,MAAMG,MAAA,GAAStB,YAAA,CAAa;EAAEuB,MAAA,EAAQ,CAACR,SAAA,EAAWK,SAAS;AAAE,CAAC;AAM9D,MAAMI,aAAA,GAAgB;EACpBC,IAAA,EAAM;IACJC,MAAA,EAAQ;MACNC,IAAA,EAAM,MAAAA,CAAOC,GAAA,EAAqBC,GAAA,KAAkB;QAClD,MAAOD,GAAA,CAAIE,EAAA,CAAGJ,MAAA,CAAeD,IAAA,CAAKM,MAAA,CAAOF,GAAG;MAC9C;IACF;EACF;AACF;AACA,MAAMG,WAAA,GAAeC,IAAA,IAA0BtB,GAAA,CAAYc,IAAA,CAAKS,KAAA,CAAM,MAAMD,IAAA,CAAKhB,EAAE,EAAEkB,GAAA,CAAI;AAEzF,MAAMC,OAAA,GAAU1B,gBAAA,CAAiB;EAC/BY,MAAA;EACAe,MAAA,EAAQb,aAAA;EACRc,cAAA,EAAgB;IAAEC,OAAA,EAAS;MAAEC,IAAA,EAAMR;IAAY;EAAE;EACjDS,YAAA,EAAc;AAChB,CAAC;AAKD,MAAMC,aAAA,GAAgB;EACpBC,OAAA,EAAS;IACPjB,MAAA,EAAQ;MACNkB,QAAA,EAAU,MAAAA,CAAOhB,GAAA,EAAqBC,GAAA,KAAkB;QACtD,MAAOD,GAAA,CAAIE,EAAA,CAAGJ,MAAA,CAAeD,IAAA,CAAKM,MAAA,CAAOF,GAAG;MAC9C;IACF;EACF;AACF;AACA,MAAMgB,WAAA,GAAeZ,IAAA,IAA0BtB,GAAA,CAAYmC,IAAA,CAAKZ,KAAA,CAAM,MAAMD,IAAA,CAAKhB,EAAE,EAAEkB,GAAA,CAAI;AAEzF,MAAMY,OAAA,GAAUrC,gBAAA,CAAiB;EAC/BY,MAAA;EACAe,MAAA,EAAQK,aAAA;EACRJ,cAAA,EAAgB;IAAEU,OAAA,EAAS;MAAER,IAAA,EAAMK;IAAY;EAAE;EACjDJ,YAAA,EAAc;AAChB,CAAC;AAGD,MAAMQ,QAAA,GAAWxC,kBAAA,CAAmB2B,OAAA,EAASW,OAAO;AAEpD,IAAIG,IAAA;AACJ,IAAIC,SAAA;AAEJ7C,UAAA,CAAW,MAAM;EACf8C,UAAA,CAAW;EACXD,SAAA,GAAYE,QAAA,CAASC,aAAA,CAAc,KAAK;EACxCD,QAAA,CAASE,IAAA,CAAKC,WAAA,CAAYL,SAAS;EACnCD,IAAA,GAAO9C,UAAA,CAAW+C,SAAS;AAC7B,CAAC;AAED9C,SAAA,CAAU,YAAY;EACpB,MAAMF,GAAA,CAAI,YAAY+C,IAAA,CAAKO,OAAA,CAAQ,CAAC;EACpCN,SAAA,CAAUO,MAAA,CAAO;AACnB,CAAC;AAED,MAAMC,MAAA,GAAUC,EAAA,IAAkBzD,GAAA,CAAI,YAAY+C,IAAA,CAAKS,MAAA,CAAOC,EAAE,CAAC;AAEjE,eAAeC,QAAQC,SAAA,EAA0BC,IAAA,EAAc;EAC7D,SAASC,CAAA,GAAI,GAAGA,CAAA,GAAI,KAAKA,CAAA,IAAK;IAC5B,IAAIF,SAAA,CAAU,GAAG;IACjB,MAAM3D,GAAA,CAAI,YAAY;MACpB,MAAM,IAAI8D,OAAA,CAASC,OAAA,IAAYC,UAAA,CAAWD,OAAA,EAAS,CAAC,CAAC;IACvD,CAAC;EACH;EACA,MAAM,IAAIE,KAAA,CAAM,yBAAyBL,IAAI,EAAE;AACjD;AAEA,MAAMM,KAAA,GAAwD;EAC5DC,IAAA,EAAM;EACNC,OAAA,EAAS;AACX;AAIA,SAASnB,WAAA,EAAa;EACpBiB,KAAA,CAAMC,IAAA,GAAO;EACbD,KAAA,CAAME,OAAA,GAAU;AAClB;AAEA,SAASC,iBAAiB;EAAEvD;AAAG,GAAmB;EAChD,MAAM,CAACqD,IAAI,IAAKrB,QAAA,CAASwB,QAAA,CAAiBzC,WAAA,EAAa;IAAEf;EAAG,CAAC;EAC7DoD,KAAA,CAAMC,IAAA,GAAOA,IAAA,IAAQ;EACrBD,KAAA,CAAME,OAAA;EACN,OAAO;AACT;AAEA,MAAMG,WAAA,GAAc,MAAO7C,GAAA,IAAiB;EAC1C,MAAM1B,GAAA,CAAI,YAAY;IACpB,MAAOiC,OAAA,CAAQuC,IAAA,CAAKjD,MAAA,CAAeD,IAAA,CAAKE,IAAA,CAAKE,GAAG,EAAE+C,MAAA;EACpD,CAAC;AACH;AAEA,MAAMC,WAAA,GAAc,MAAOhD,GAAA,IAAiB;EAC1C,MAAM1B,GAAA,CAAI,YAAY;IACpB,MAAO4C,OAAA,CAAQ4B,IAAA,CAAKjD,MAAA,CAAeiB,OAAA,CAAQC,QAAA,CAASf,GAAG,EAAE+C,MAAA;EAC3D,CAAC;AACH;AAEApE,IAAA,CAAK,qEAAqE,YAAY;EACpF,MAAMmD,MAAA,CACJ,eAAA/C,GAAA,CAACwB,OAAA,CAAQ0C,WAAA,EAAR;IAAoBC,MAAA,EAAQ;IAAMC,MAAA,EAAO;IACxCC,QAAA,iBAAArE,GAAA,CAACmC,OAAA,CAAQ+B,WAAA,EAAR;MAAoBC,MAAA,EAAQ;MAAMC,MAAA,EAAO;MACxCC,QAAA,iBAAArE,GAAA,CAAC4D,gBAAA;QAAiBvD,EAAA,EAAG;MAAA,CAAK;IAAA,CAC5B;EAAA,CACF,CACF;EACA,MAAM4C,OAAA,CAAQ,MAAMQ,KAAA,CAAME,OAAA,GAAU,GAAG,aAAa;EAIpD,MAAMG,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAe,CAAC;EACpD,MAAM2D,WAAA,CAAY;IAAE5D,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAe,CAAC;EAEpD,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,KAAS,QAAW,qBAAqB;EACnE/D,MAAA,CAAO8D,KAAA,CAAMC,IAAA,EAAMpD,IAAI,EAAEgE,IAAA,CAAK,cAAc;AAC9C,CAAC;AAED1E,IAAA,CAAK,8EAA8E,YAAY;EAC7F,MAAM2E,GAAA,GAAMA,CAAC;IAAEC;EAAU,MACvB,eAAAxE,GAAA,CAACwB,OAAA,CAAQ0C,WAAA,EAAR;IAAoBC,MAAA,EAAQ;IAAMC,MAAA,EAAO;IACvCC,QAAA,EAAAG,SAAA,GACC,eAAAxE,GAAA,CAACmC,OAAA,CAAQ+B,WAAA,EAAR;MAAoBC,MAAA,EAAQ;MAAMC,MAAA,EAAO;MACxCC,QAAA,iBAAArE,GAAA,CAAC4D,gBAAA;QAAiBvD,EAAA,EAAG;MAAA,CAAK;IAAA,CAC5B,IAEA,eAAAL,GAAA,CAAC4D,gBAAA;MAAiBvD,EAAA,EAAG;IAAA,CAAK;EAAA,CAE9B;EAGF,MAAM0C,MAAA,CAAO,eAAA/C,GAAA,CAACuE,GAAA;IAAIC,SAAA,EAAS;EAAA,CAAC,CAAE;EAC9B,MAAMvB,OAAA,CAAQ,MAAMQ,KAAA,CAAME,OAAA,GAAU,GAAG,aAAa;EAEpD,MAAMG,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAK,CAAC;EAC1C,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,EAAMpD,IAAA,KAAS,MAAM,YAAY;EAG3D,MAAMyC,MAAA,CAAO,eAAA/C,GAAA,CAACuE,GAAA;IAAIC,SAAA,EAAW;EAAA,CAAO,CAAE;EACtC,MAAMV,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAK,CAAC;EAC1C,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,EAAMpD,IAAA,KAAS,MAAM,gCAAgC;EAG/E,MAAMyC,MAAA,CAAO,eAAA/C,GAAA,CAACuE,GAAA;IAAIC,SAAA,EAAS;EAAA,CAAC,CAAE;EAC9B,MAAMV,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAK,CAAC;EAC1C,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,EAAMpD,IAAA,KAAS,MAAM,gCAAgC;AACjF,CAAC;AAEDV,IAAA,CAAK,qEAAqE,YAAY;EACpF,MAAM2E,GAAA,GAAMA,CAAC;IAAEH;EAAO,MACpB,eAAApE,GAAA,CAACwB,OAAA,CAAQ0C,WAAA,EAAR;IAAoBC,MAAA,EAAQ;IAAMC,MAAA;IACjCC,QAAA,iBAAArE,GAAA,CAAC4D,gBAAA;MAAiBvD,EAAA,EAAG;IAAA,CAAK;EAAA,CAC5B;EAGF,MAAM0C,MAAA,CAAO,eAAA/C,GAAA,CAACuE,GAAA;IAAIH,MAAA,EAAO;EAAA,CAAQ,CAAE;EACnC,MAAMnB,OAAA,CAAQ,MAAMQ,KAAA,CAAME,OAAA,GAAU,GAAG,aAAa;EAEpD,MAAMG,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAkB,CAAC;EACvD,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,EAAMpD,IAAA,KAAS,mBAAmB,kBAAkB;EAI9E,MAAMyC,MAAA,CAAO,eAAA/C,GAAA,CAACuE,GAAA;IAAIH,MAAA,EAAO;EAAA,CAAQ,CAAE;EACnC,MAAMnB,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,KAAS,QAAW,mCAAmC;EAEjF,MAAMI,WAAA,CAAY;IAAEzD,EAAA,EAAI;IAAMC,IAAA,EAAM;EAAiB,CAAC;EACtD,MAAM2C,OAAA,CAAQ,MAAMQ,KAAA,CAAMC,IAAA,EAAMpD,IAAA,KAAS,kBAAkB,mBAAmB;AAChF,CAAC","ignoreList":[]}