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,387 @@
1
+ "use strict";
2
+
3
+ var import_zero = require("@rocicorp/zero");
4
+ var import_helpers = require("@take-out/helpers");
5
+ var import_vitest = require("vitest");
6
+ var import_combineZeroClients = require("./combineZeroClients.native.js");
7
+ var import_createZeroClient = require("./createZeroClient.native.js");
8
+ var import_instanceRegistry = require("./instanceRegistry.native.js");
9
+ var import_queryRegistry = require("./queryRegistry.native.js");
10
+ var import_run = require("./run.native.js");
11
+ var import_zeroRunner = require("./zeroRunner.native.js");
12
+ var userTable = (0, import_zero.table)("user").columns({
13
+ id: (0, import_zero.string)(),
14
+ name: (0, import_zero.string)()
15
+ }).primaryKey("id");
16
+ var taskTable = (0, import_zero.table)("task").columns({
17
+ id: (0, import_zero.string)(),
18
+ title: (0, import_zero.string)()
19
+ }).primaryKey("id");
20
+ var schema = (0, import_zero.createSchema)({
21
+ tables: [userTable, taskTable]
22
+ });
23
+ var makeQueryFn = function () {
24
+ return function (args) {
25
+ return args;
26
+ };
27
+ };
28
+ function makeClient(instanceName, namespace) {
29
+ var byId = makeQueryFn();
30
+ return {
31
+ byId,
32
+ client: (0, import_createZeroClient.createZeroClient)({
33
+ schema,
34
+ models: {},
35
+ groupedQueries: {
36
+ [namespace]: {
37
+ byId
38
+ }
39
+ },
40
+ instanceName
41
+ })
42
+ };
43
+ }
44
+ function fakeClient(name, namespaces, zeroStub) {
45
+ (0, import_instanceRegistry.registerClientInstance)({
46
+ name,
47
+ namespaces,
48
+ // boundary stub: dispatch tests never resolve queries through it
49
+ customQueries: {}
50
+ });
51
+ return {
52
+ instanceName: name,
53
+ useQuery: import_vitest.vi.fn(function () {
54
+ return `${name}-useQuery`;
55
+ }),
56
+ useQueryDirect: import_vitest.vi.fn(function () {
57
+ return `${name}-useQueryDirect`;
58
+ }),
59
+ usePermission: import_vitest.vi.fn(function () {
60
+ return `${name}-usePermission`;
61
+ }),
62
+ usePermissionDirect: import_vitest.vi.fn(function () {
63
+ return `${name}-usePermissionDirect`;
64
+ }),
65
+ zero: zeroStub,
66
+ preload: import_vitest.vi.fn(function () {
67
+ return `${name}-preload`;
68
+ }),
69
+ getQuery: import_vitest.vi.fn(function () {
70
+ return `${name}-getQuery`;
71
+ }),
72
+ zeroEvents: (0, import_helpers.createEmitter)(`zero:test-${name}`, null),
73
+ ControlQueries: function (param) {
74
+ var {
75
+ children
76
+ } = param;
77
+ return children;
78
+ }
79
+ };
80
+ }
81
+ (0, import_vitest.describe)("multi-instance namespace dispatch", function () {
82
+ (0, import_vitest.test)("run() dispatches named queries to the owning instance runner", async function () {
83
+ var control = makeClient("run-control", "runUser");
84
+ var project = makeClient("run-project", "runTask");
85
+ var controlRunner = import_vitest.vi.fn(async function () {
86
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
87
+ _args[_key] = arguments[_key];
88
+ }
89
+ return {
90
+ from: "control"
91
+ };
92
+ });
93
+ var projectRunner = import_vitest.vi.fn(async function () {
94
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
95
+ _args[_key] = arguments[_key];
96
+ }
97
+ return {
98
+ from: "project"
99
+ };
100
+ });
101
+ (0, import_instanceRegistry.getInstanceForNamespace)("runUser").runner = controlRunner;
102
+ (0, import_instanceRegistry.getInstanceForNamespace)("runTask").runner = projectRunner;
103
+ var ambientRunner = import_vitest.vi.fn(async function () {
104
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
105
+ _args[_key] = arguments[_key];
106
+ }
107
+ return {
108
+ from: "ambient"
109
+ };
110
+ });
111
+ (0, import_zeroRunner.setRunner)(ambientRunner);
112
+ await (0, import_vitest.expect)((0, import_run.run)(control.byId, {
113
+ id: "1"
114
+ })).resolves.toEqual({
115
+ from: "control"
116
+ });
117
+ await (0, import_vitest.expect)((0, import_run.run)(project.byId, {
118
+ id: "2"
119
+ })).resolves.toEqual({
120
+ from: "project"
121
+ });
122
+ (0, import_vitest.expect)(ambientRunner).not.toHaveBeenCalled();
123
+ var request = controlRunner.mock.calls[0][0];
124
+ (0, import_vitest.expect)(request.query.queryName).toBe("runUser.byId");
125
+ });
126
+ (0, import_vitest.test)("a claimed namespace with an unmounted instance uses the ambient runner (server path)", async function () {
127
+ var {
128
+ byId
129
+ } = makeClient("srv-instance", "srvThing");
130
+ var ambient = import_vitest.vi.fn(async function () {
131
+ for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
132
+ _args[_key] = arguments[_key];
133
+ }
134
+ return {
135
+ from: "ambient"
136
+ };
137
+ });
138
+ (0, import_zeroRunner.setRunner)(ambient);
139
+ await (0, import_vitest.expect)((0, import_run.run)(byId, {
140
+ id: "1"
141
+ })).resolves.toEqual({
142
+ from: "ambient"
143
+ });
144
+ (0, import_vitest.expect)(ambient).toHaveBeenCalledTimes(1);
145
+ });
146
+ (0, import_vitest.test)("duplicate namespace claim throws at create time", function () {
147
+ makeClient("dup-a", "dupNs");
148
+ (0, import_vitest.expect)(function () {
149
+ return makeClient("dup-b", "dupNs");
150
+ }).toThrow(/already claimed/);
151
+ });
152
+ (0, import_vitest.test)("re-creating an instance under the same name re-claims without throwing (hmr)", function () {
153
+ var _getInstanceForNamespace;
154
+ makeClient("hmr", "hmrNs");
155
+ (0, import_vitest.expect)(function () {
156
+ return makeClient("hmr", "hmrNs");
157
+ }).not.toThrow();
158
+ (0, import_vitest.expect)((_getInstanceForNamespace = (0, import_instanceRegistry.getInstanceForNamespace)("hmrNs")) === null || _getInstanceForNamespace === void 0 ? void 0 : _getInstanceForNamespace.name).toBe("hmr");
159
+ });
160
+ (0, import_vitest.test)("model namespaces are claimed too", function () {
161
+ var _getInstanceForNamespace;
162
+ var models = {
163
+ mdlThing: {
164
+ mutate: {
165
+ insert: async function () {}
166
+ }
167
+ }
168
+ };
169
+ (0, import_createZeroClient.createZeroClient)({
170
+ schema,
171
+ models,
172
+ groupedQueries: {},
173
+ instanceName: "mdl-a"
174
+ });
175
+ (0, import_vitest.expect)((_getInstanceForNamespace = (0, import_instanceRegistry.getInstanceForNamespace)("mdlThing")) === null || _getInstanceForNamespace === void 0 ? void 0 : _getInstanceForNamespace.name).toBe("mdl-a");
176
+ (0, import_vitest.expect)(function () {
177
+ return (0, import_createZeroClient.createZeroClient)({
178
+ schema,
179
+ models,
180
+ groupedQueries: {},
181
+ instanceName: "mdl-b"
182
+ });
183
+ }).toThrow(/already claimed/);
184
+ });
185
+ });
186
+ (0, import_vitest.describe)("multi-instance isolation", function () {
187
+ (0, import_vitest.test)("each instance has an isolated zeroEvents emitter", function () {
188
+ var _a_zeroEvents_options, _b_zeroEvents_options;
189
+ var {
190
+ client: a
191
+ } = makeClient("emit-a", "emitA");
192
+ var {
193
+ client: b
194
+ } = makeClient("emit-b", "emitB");
195
+ (0, import_vitest.expect)(a.zeroEvents).not.toBe(b.zeroEvents);
196
+ (0, import_vitest.expect)((_a_zeroEvents_options = a.zeroEvents.options) === null || _a_zeroEvents_options === void 0 ? void 0 : _a_zeroEvents_options.name).toBe("zero:emit-a");
197
+ (0, import_vitest.expect)((_b_zeroEvents_options = b.zeroEvents.options) === null || _b_zeroEvents_options === void 0 ? void 0 : _b_zeroEvents_options.name).toBe("zero:emit-b");
198
+ var seenByB = [];
199
+ b.zeroEvents.listen(function (event) {
200
+ return seenByB.push(event);
201
+ });
202
+ a.zeroEvents.emit({
203
+ type: "error",
204
+ message: "a-only"
205
+ });
206
+ (0, import_vitest.expect)(seenByB).toEqual([]);
207
+ (0, import_vitest.expect)(a.zeroEvents.value).toEqual({
208
+ type: "error",
209
+ message: "a-only"
210
+ });
211
+ (0, import_vitest.expect)(b.zeroEvents.value).toBe(null);
212
+ });
213
+ (0, import_vitest.test)("the default instance keeps the legacy emitter name", function () {
214
+ var _client_zeroEvents_options;
215
+ var {
216
+ client
217
+ } = makeClient("default", "defaultNs");
218
+ (0, import_vitest.expect)((_client_zeroEvents_options = client.zeroEvents.options) === null || _client_zeroEvents_options === void 0 ? void 0 : _client_zeroEvents_options.name).toBe("zero");
219
+ });
220
+ (0, import_vitest.test)("each instance has its own unmounted zero proxy", function () {
221
+ var {
222
+ client: a
223
+ } = makeClient("proxy-a", "proxyA");
224
+ var {
225
+ client: b
226
+ } = makeClient("proxy-b", "proxyB");
227
+ (0, import_vitest.expect)(a.zero === b.zero).toBe(false);
228
+ (0, import_vitest.expect)(function () {
229
+ return a.zero.clientID;
230
+ }).toThrow(/not initialized/);
231
+ (0, import_vitest.expect)(function () {
232
+ return b.zero.clientID;
233
+ }).toThrow(/not initialized/);
234
+ });
235
+ });
236
+ (0, import_vitest.describe)("combineZeroClients facade", function () {
237
+ (0, import_vitest.test)("zero.mutate dispatches by model namespace, rest forwards to primary", function () {
238
+ var insertSpy = import_vitest.vi.fn();
239
+ var updateSpy = import_vitest.vi.fn();
240
+ var control = fakeClient("fz-control", ["fzUser"], {
241
+ mutate: {
242
+ fzUser: {
243
+ insert: insertSpy
244
+ }
245
+ },
246
+ userID: "primary-user"
247
+ });
248
+ var project = fakeClient("fz-project", ["fzTask"], {
249
+ mutate: {
250
+ fzTask: {
251
+ update: updateSpy
252
+ }
253
+ },
254
+ userID: "project-user"
255
+ });
256
+ var combined = (0, import_combineZeroClients.combineZeroClients)(control, project);
257
+ var zero = combined.zero;
258
+ zero.mutate.fzUser.insert({
259
+ id: "1"
260
+ });
261
+ zero.mutate.fzTask.update({
262
+ id: "2"
263
+ });
264
+ (0, import_vitest.expect)(insertSpy).toHaveBeenCalledWith({
265
+ id: "1"
266
+ });
267
+ (0, import_vitest.expect)(updateSpy).toHaveBeenCalledWith({
268
+ id: "2"
269
+ });
270
+ (0, import_vitest.expect)(zero.userID).toBe("primary-user");
271
+ (0, import_vitest.expect)(zero.mutate.unknownNs).toBe(void 0);
272
+ });
273
+ (0, import_vitest.test)("useQuery/preload/getQuery/usePermission dispatch by namespace", function () {
274
+ var control = fakeClient("fq-control", ["fqUser"], {});
275
+ var project = fakeClient("fq-project", ["fqTask"], {});
276
+ var userQuery = makeQueryFn();
277
+ var taskQuery = makeQueryFn();
278
+ (0, import_queryRegistry.registerQuery)(userQuery, "fqUser.byId");
279
+ (0, import_queryRegistry.registerQuery)(taskQuery, "fqTask.byId");
280
+ var combined = (0, import_combineZeroClients.combineZeroClients)(control, project);
281
+ var useQuery = combined.useQuery;
282
+ var preload = combined.preload;
283
+ var getQuery = combined.getQuery;
284
+ var usePermission = combined.usePermission;
285
+ useQuery(userQuery, {
286
+ id: "1"
287
+ });
288
+ (0, import_vitest.expect)(control.useQueryDirect).toHaveBeenCalledWith(userQuery, {
289
+ id: "1"
290
+ });
291
+ (0, import_vitest.expect)(control.useQuery).not.toHaveBeenCalled();
292
+ (0, import_vitest.expect)(project.useQuery).not.toHaveBeenCalled();
293
+ useQuery(taskQuery, {
294
+ id: "2"
295
+ });
296
+ (0, import_vitest.expect)(project.useQuery).toHaveBeenCalledWith(taskQuery, {
297
+ id: "2"
298
+ });
299
+ (0, import_vitest.expect)(project.useQueryDirect).not.toHaveBeenCalled();
300
+ preload(taskQuery, {
301
+ id: "3"
302
+ });
303
+ (0, import_vitest.expect)(project.preload).toHaveBeenCalledWith(taskQuery, {
304
+ id: "3"
305
+ });
306
+ (0, import_vitest.expect)(control.preload).not.toHaveBeenCalled();
307
+ getQuery(userQuery, {
308
+ id: "4"
309
+ });
310
+ (0, import_vitest.expect)(control.getQuery).toHaveBeenCalledWith(userQuery, {
311
+ id: "4"
312
+ });
313
+ (0, import_vitest.expect)(project.getQuery).not.toHaveBeenCalled();
314
+ var anonymous = makeQueryFn();
315
+ useQuery(anonymous, {
316
+ id: "5"
317
+ });
318
+ (0, import_vitest.expect)(control.useQueryDirect).toHaveBeenCalledWith(anonymous, {
319
+ id: "5"
320
+ });
321
+ usePermission("fqTask", "row-1");
322
+ (0, import_vitest.expect)(project.usePermission).toHaveBeenCalledWith("fqTask", "row-1");
323
+ (0, import_vitest.expect)(project.usePermissionDirect).not.toHaveBeenCalled();
324
+ usePermission("fqUser", "row-2");
325
+ (0, import_vitest.expect)(control.usePermissionDirect).toHaveBeenCalledWith("fqUser", "row-2");
326
+ (0, import_vitest.expect)(control.usePermission).not.toHaveBeenCalled();
327
+ });
328
+ (0, import_vitest.test)("the inner option overrides which client uses the context path", function () {
329
+ var a = fakeClient("inner-a", ["innerA"], {});
330
+ var b = fakeClient("inner-b", ["innerB"], {});
331
+ var aQuery = makeQueryFn();
332
+ var bQuery = makeQueryFn();
333
+ (0, import_queryRegistry.registerQuery)(aQuery, "innerA.byId");
334
+ (0, import_queryRegistry.registerQuery)(bQuery, "innerB.byId");
335
+ var combined = (0, import_combineZeroClients.combineZeroClients)(a, b, {
336
+ inner: "inner-a"
337
+ });
338
+ var useQuery = combined.useQuery;
339
+ useQuery(aQuery, {
340
+ id: "1"
341
+ });
342
+ (0, import_vitest.expect)(a.useQuery).toHaveBeenCalledWith(aQuery, {
343
+ id: "1"
344
+ });
345
+ (0, import_vitest.expect)(a.useQueryDirect).not.toHaveBeenCalled();
346
+ useQuery(bQuery, {
347
+ id: "2"
348
+ });
349
+ (0, import_vitest.expect)(b.useQueryDirect).toHaveBeenCalledWith(bQuery, {
350
+ id: "2"
351
+ });
352
+ (0, import_vitest.expect)(b.useQuery).not.toHaveBeenCalled();
353
+ (0, import_vitest.expect)(function () {
354
+ return (0, import_combineZeroClients.combineZeroClients)(a, b, {
355
+ inner: "nope"
356
+ });
357
+ }).toThrow(/not one of the passed clients/);
358
+ });
359
+ (0, import_vitest.test)("combined zeroEvents relays every instance", function () {
360
+ var _a_zeroEvents_value, _b_zeroEvents_value;
361
+ var {
362
+ client: a
363
+ } = makeClient("relay-a", "relayA");
364
+ var {
365
+ client: b
366
+ } = makeClient("relay-b", "relayB");
367
+ var combined = (0, import_combineZeroClients.combineZeroClients)(a, b);
368
+ var seen = [];
369
+ combined.zeroEvents.listen(function (event) {
370
+ return seen.push(event);
371
+ });
372
+ a.zeroEvents.emit({
373
+ type: "error",
374
+ message: "from-a"
375
+ });
376
+ b.zeroEvents.emit({
377
+ type: "error",
378
+ message: "from-b"
379
+ });
380
+ (0, import_vitest.expect)(seen.map(function (event) {
381
+ return event === null || event === void 0 ? void 0 : event.message;
382
+ })).toEqual(["from-a", "from-b"]);
383
+ (0, import_vitest.expect)((_a_zeroEvents_value = a.zeroEvents.value) === null || _a_zeroEvents_value === void 0 ? void 0 : _a_zeroEvents_value.message).toBe("from-a");
384
+ (0, import_vitest.expect)((_b_zeroEvents_value = b.zeroEvents.value) === null || _b_zeroEvents_value === void 0 ? void 0 : _b_zeroEvents_value.message).toBe("from-b");
385
+ });
386
+ });
387
+ //# sourceMappingURL=multiInstance.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["import_zero","require","import_helpers","import_vitest","import_combineZeroClients","import_createZeroClient","import_instanceRegistry","import_queryRegistry","import_run","import_zeroRunner","userTable","table","columns","id","string","name","primaryKey","taskTable","title","schema","createSchema","tables","makeQueryFn","args","makeClient","instanceName","namespace","byId","client","createZeroClient","models","groupedQueries","fakeClient","namespaces","zeroStub","registerClientInstance","customQueries","useQuery","vi","fn","useQueryDirect","usePermission","usePermissionDirect","zero","preload","getQuery","zeroEvents","createEmitter","ControlQueries","param","children","describe","test","control","project","controlRunner","_len","arguments","length","_args","Array","_key","from","projectRunner","getInstanceForNamespace","runner","ambientRunner","setRunner","expect","run","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":"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","ignoreList":[]}
@@ -0,0 +1,206 @@
1
+ var import_zero = require("@rocicorp/zero");
2
+ var import_react = require("react");
3
+ var import_client = require("react-dom/client");
4
+ var import_vitest = require("vitest");
5
+ var import_combineZeroClients = require("./combineZeroClients.cjs");
6
+ var import_createZeroClient = require("./createZeroClient.cjs");
7
+ var import_zql = require("./zql.cjs");
8
+ var import_jsx_runtime = require("react/jsx-runtime");
9
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
10
+ const userTable = (0, import_zero.table)("user").columns({
11
+ id: (0, import_zero.string)(),
12
+ name: (0, import_zero.string)()
13
+ }).primaryKey("id");
14
+ const taskTable = (0, import_zero.table)("task").columns({
15
+ id: (0, import_zero.string)(),
16
+ title: (0, import_zero.string)()
17
+ }).primaryKey("id");
18
+ const schema = (0, import_zero.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 => import_zql.zql.user.where("id", args.id).one();
31
+ const control = (0, import_createZeroClient.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 => import_zql.zql.task.where("id", args.id).one();
51
+ const project = (0, import_createZeroClient.createZeroClient)({
52
+ schema,
53
+ models: projectModels,
54
+ groupedQueries: {
55
+ prjTask: {
56
+ byId: prjTaskById
57
+ }
58
+ },
59
+ instanceName: "nested-project"
60
+ });
61
+ const combined = (0, import_combineZeroClients.combineZeroClients)(control, project);
62
+ let root;
63
+ let container;
64
+ (0, import_vitest.beforeEach)(() => {
65
+ resetProbe();
66
+ container = document.createElement("div");
67
+ document.body.appendChild(container);
68
+ root = (0, import_client.createRoot)(container);
69
+ });
70
+ (0, import_vitest.afterEach)(async () => {
71
+ await (0, import_react.act)(async () => root.unmount());
72
+ container.remove();
73
+ });
74
+ const render = ui => (0, import_react.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 (0, import_react.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 (0, import_react.act)(async () => {
104
+ await control.zero.mutate.user.seed(row).client;
105
+ });
106
+ };
107
+ const seedProject = async row => {
108
+ await (0, import_react.act)(async () => {
109
+ await project.zero.mutate.prjSeed.seedUser(row).client;
110
+ });
111
+ };
112
+ (0, import_vitest.test)("outer-instance query reads the OUTER store under nested providers", async () => {
113
+ await render(/* @__PURE__ */(0, import_jsx_runtime.jsx)(control.ProvideZero, {
114
+ server: null,
115
+ userID: "t1-ctl",
116
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(project.ProvideZero, {
117
+ server: null,
118
+ userID: "t1-prj",
119
+ children: /* @__PURE__ */(0, import_jsx_runtime.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
+ (0, import_vitest.expect)(probe.data?.name).toBe("from-control");
135
+ });
136
+ (0, import_vitest.test)("inner provider unmount/remount does not break outer-instance subscriptions", async () => {
137
+ const App = ({
138
+ showInner
139
+ }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(control.ProvideZero, {
140
+ server: null,
141
+ userID: "t2-ctl",
142
+ children: showInner ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(project.ProvideZero, {
143
+ server: null,
144
+ userID: "t2-prj",
145
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(ControlUserProbe, {
146
+ id: "u2"
147
+ })
148
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(ControlUserProbe, {
149
+ id: "u2"
150
+ })
151
+ });
152
+ await render(/* @__PURE__ */(0, import_jsx_runtime.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__ */(0, import_jsx_runtime.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__ */(0, import_jsx_runtime.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
+ (0, import_vitest.test)("direct-path views re-materialize when the owning instance rotates", async () => {
179
+ const App = ({
180
+ userID
181
+ }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(control.ProvideZero, {
182
+ server: null,
183
+ userID,
184
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(ControlUserProbe, {
185
+ id: "u3"
186
+ })
187
+ });
188
+ await render(/* @__PURE__ */(0, import_jsx_runtime.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__ */(0, import_jsx_runtime.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
+ });