on-zero 0.6.11 → 0.6.13

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 (131) hide show
  1. package/dist/cjs/createZeroSQLiteServer.cjs +319 -0
  2. package/dist/cjs/createZeroSQLiteServer.native.js +440 -0
  3. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
  4. package/dist/cjs/createZeroSQLiteServer.test.cjs +429 -0
  5. package/dist/cjs/createZeroSQLiteServer.test.native.js +466 -0
  6. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
  7. package/dist/cjs/createZeroServer.cjs +20 -234
  8. package/dist/cjs/createZeroServer.native.js +24 -250
  9. package/dist/cjs/createZeroServer.native.js.map +1 -1
  10. package/dist/cjs/createZeroServer.test.cjs +35 -1
  11. package/dist/cjs/createZeroServer.test.native.js +38 -1
  12. package/dist/cjs/createZeroServer.test.native.js.map +1 -1
  13. package/dist/cjs/createZeroServerCore.cjs +362 -0
  14. package/dist/cjs/createZeroServerCore.native.js +389 -0
  15. package/dist/cjs/createZeroServerCore.native.js.map +1 -0
  16. package/dist/cjs/generate-lite.cjs +1 -0
  17. package/dist/cjs/generate-lite.native.js +1 -0
  18. package/dist/cjs/generate-lite.native.js.map +1 -1
  19. package/dist/cjs/generate-lite.test.cjs +5 -1
  20. package/dist/cjs/generate-lite.test.native.js +5 -1
  21. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  22. package/dist/cjs/generate.cjs +20 -11
  23. package/dist/cjs/generate.native.js +29 -21
  24. package/dist/cjs/generate.native.js.map +1 -1
  25. package/dist/cjs/generate.test.cjs +110 -0
  26. package/dist/cjs/generate.test.native.js +110 -0
  27. package/dist/cjs/generate.test.native.js.map +1 -1
  28. package/dist/cjs/httpPull/transport.test.cjs +44 -0
  29. package/dist/cjs/httpPull/transport.test.native.js +53 -0
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
  31. package/dist/cjs/httpPullTransport.cjs +4 -1
  32. package/dist/cjs/httpPullTransport.native.js +5 -2
  33. package/dist/cjs/httpPullTransport.native.js.map +1 -1
  34. package/dist/cjs/server.cjs +2 -1
  35. package/dist/cjs/syncHost.cjs +164 -0
  36. package/dist/cjs/syncHost.native.js +371 -0
  37. package/dist/cjs/syncHost.native.js.map +1 -0
  38. package/dist/cjs/syncHost.test.cjs +229 -0
  39. package/dist/cjs/syncHost.test.native.js +278 -0
  40. package/dist/cjs/syncHost.test.native.js.map +1 -0
  41. package/dist/esm/createZeroSQLiteServer.mjs +293 -0
  42. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
  43. package/dist/esm/createZeroSQLiteServer.native.js +411 -0
  44. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
  45. package/dist/esm/createZeroSQLiteServer.test.mjs +430 -0
  46. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
  47. package/dist/esm/createZeroSQLiteServer.test.native.js +464 -0
  48. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
  49. package/dist/esm/createZeroServer.mjs +17 -231
  50. package/dist/esm/createZeroServer.mjs.map +1 -1
  51. package/dist/esm/createZeroServer.native.js +21 -247
  52. package/dist/esm/createZeroServer.native.js.map +1 -1
  53. package/dist/esm/createZeroServer.test.mjs +35 -1
  54. package/dist/esm/createZeroServer.test.mjs.map +1 -1
  55. package/dist/esm/createZeroServer.test.native.js +38 -1
  56. package/dist/esm/createZeroServer.test.native.js.map +1 -1
  57. package/dist/esm/createZeroServerCore.mjs +336 -0
  58. package/dist/esm/createZeroServerCore.mjs.map +1 -0
  59. package/dist/esm/createZeroServerCore.native.js +360 -0
  60. package/dist/esm/createZeroServerCore.native.js.map +1 -0
  61. package/dist/esm/generate-lite.mjs +1 -0
  62. package/dist/esm/generate-lite.mjs.map +1 -1
  63. package/dist/esm/generate-lite.native.js +1 -0
  64. package/dist/esm/generate-lite.native.js.map +1 -1
  65. package/dist/esm/generate-lite.test.mjs +5 -1
  66. package/dist/esm/generate-lite.test.mjs.map +1 -1
  67. package/dist/esm/generate-lite.test.native.js +5 -1
  68. package/dist/esm/generate-lite.test.native.js.map +1 -1
  69. package/dist/esm/generate.mjs +20 -11
  70. package/dist/esm/generate.mjs.map +1 -1
  71. package/dist/esm/generate.native.js +29 -21
  72. package/dist/esm/generate.native.js.map +1 -1
  73. package/dist/esm/generate.test.mjs +87 -1
  74. package/dist/esm/generate.test.mjs.map +1 -1
  75. package/dist/esm/generate.test.native.js +87 -1
  76. package/dist/esm/generate.test.native.js.map +1 -1
  77. package/dist/esm/httpPull/transport.test.mjs +44 -0
  78. package/dist/esm/httpPull/transport.test.mjs.map +1 -1
  79. package/dist/esm/httpPull/transport.test.native.js +53 -0
  80. package/dist/esm/httpPull/transport.test.native.js.map +1 -1
  81. package/dist/esm/httpPullTransport.mjs +4 -1
  82. package/dist/esm/httpPullTransport.mjs.map +1 -1
  83. package/dist/esm/httpPullTransport.native.js +5 -2
  84. package/dist/esm/httpPullTransport.native.js.map +1 -1
  85. package/dist/esm/server.mjs +1 -0
  86. package/dist/esm/server.mjs.map +1 -1
  87. package/dist/esm/syncHost.mjs +138 -0
  88. package/dist/esm/syncHost.mjs.map +1 -0
  89. package/dist/esm/syncHost.native.js +342 -0
  90. package/dist/esm/syncHost.native.js.map +1 -0
  91. package/dist/esm/syncHost.test.mjs +206 -0
  92. package/dist/esm/syncHost.test.mjs.map +1 -0
  93. package/dist/esm/syncHost.test.native.js +252 -0
  94. package/dist/esm/syncHost.test.native.js.map +1 -0
  95. package/package.json +19 -3
  96. package/readme.md +26 -0
  97. package/src/createZeroSQLiteServer.test.ts +461 -0
  98. package/src/createZeroSQLiteServer.ts +523 -0
  99. package/src/createZeroServer.test.ts +39 -1
  100. package/src/createZeroServer.ts +35 -428
  101. package/src/createZeroServerCore.ts +557 -0
  102. package/src/generate-lite.test.ts +4 -0
  103. package/src/generate-lite.ts +1 -0
  104. package/src/generate.test.ts +87 -1
  105. package/src/generate.ts +29 -20
  106. package/src/httpPull/transport.test.ts +47 -0
  107. package/src/httpPullTransport.ts +15 -1
  108. package/src/server.ts +1 -0
  109. package/src/syncHost.test.ts +216 -0
  110. package/src/syncHost.ts +255 -0
  111. package/test-fixtures/server-return-types.ts +50 -0
  112. package/test-fixtures/tsconfig.json +13 -0
  113. package/types/createZeroSQLiteServer.d.ts +37 -0
  114. package/types/createZeroSQLiteServer.d.ts.map +1 -0
  115. package/types/createZeroSQLiteServer.test.d.ts +2 -0
  116. package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
  117. package/types/createZeroServer.d.ts +11 -293
  118. package/types/createZeroServer.d.ts.map +1 -1
  119. package/types/createZeroServerCore.d.ts +310 -0
  120. package/types/createZeroServerCore.d.ts.map +1 -0
  121. package/types/generate-lite.d.ts.map +1 -1
  122. package/types/generate.d.ts +2 -1
  123. package/types/generate.d.ts.map +1 -1
  124. package/types/httpPullTransport.d.ts +2 -0
  125. package/types/httpPullTransport.d.ts.map +1 -1
  126. package/types/server.d.ts +1 -0
  127. package/types/server.d.ts.map +1 -1
  128. package/types/syncHost.d.ts +51 -0
  129. package/types/syncHost.d.ts.map +1 -0
  130. package/types/syncHost.test.d.ts +2 -0
  131. package/types/syncHost.test.d.ts.map +1 -0
@@ -0,0 +1,429 @@
1
+ var import_node_sqlite = require("node:sqlite");
2
+ var import_zero = require("@rocicorp/zero");
3
+ var import_bindings = require("@rocicorp/zero/bindings");
4
+ var import_vitest = require("vitest");
5
+ var import_createZeroSQLiteServer = require("./createZeroSQLiteServer.cjs");
6
+ var import_fixtureSchema = require("./httpPull/fixtureSchema.cjs");
7
+ const note = (0, import_zero.table)("note").from("note_records").columns({
8
+ id: (0, import_zero.string)().from("note_id"),
9
+ done: (0, import_zero.boolean)(),
10
+ data: (0, import_zero.json)().optional()
11
+ }).primaryKey("id");
12
+ const sqliteTypesSchema = (0, import_zero.createSchema)({
13
+ tables: [note],
14
+ relationships: [],
15
+ enableLegacyQueries: true
16
+ });
17
+ const person = (0, import_zero.table)("person").columns({
18
+ id: (0, import_zero.string)()
19
+ }).primaryKey("id");
20
+ const membership = (0, import_zero.table)("membership").columns({
21
+ personId: (0, import_zero.string)(),
22
+ teamId: (0, import_zero.string)()
23
+ }).primaryKey("personId", "teamId");
24
+ const team = (0, import_zero.table)("team").from("team_records").columns({
25
+ id: (0, import_zero.string)().from("team_id"),
26
+ active: (0, import_zero.boolean)().from("is_active"),
27
+ metadata: (0, import_zero.json)().from("metadata_json")
28
+ }).primaryKey("id");
29
+ const twoHopSchema = (0, import_zero.createSchema)({
30
+ tables: [person, membership, team],
31
+ relationships: [(0, import_zero.relationships)(person, ({
32
+ many
33
+ }) => ({
34
+ teams: many({
35
+ sourceField: ["id"],
36
+ destSchema: membership,
37
+ destField: ["personId"]
38
+ }, {
39
+ sourceField: ["teamId"],
40
+ destSchema: team,
41
+ destField: ["id"]
42
+ })
43
+ }))]
44
+ });
45
+ function pushRequest(id, name, args) {
46
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
47
+ method: "POST",
48
+ headers: {
49
+ "content-type": "application/json"
50
+ },
51
+ body: JSON.stringify({
52
+ clientGroupID: "cg1",
53
+ mutations: [{
54
+ type: "custom",
55
+ id,
56
+ clientID: "client-a",
57
+ name,
58
+ args: [args],
59
+ timestamp: 1
60
+ }],
61
+ pushVersion: 1,
62
+ timestamp: 1,
63
+ requestID: "req-" + id
64
+ })
65
+ });
66
+ }
67
+ function cleanupRequest() {
68
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
69
+ method: "POST",
70
+ headers: {
71
+ "content-type": "application/json"
72
+ },
73
+ body: JSON.stringify({
74
+ clientGroupID: "cg1",
75
+ mutations: [{
76
+ type: "custom",
77
+ id: 2,
78
+ clientID: "client-a",
79
+ name: "_zero_cleanupResults",
80
+ args: [{
81
+ clientGroupID: "cg1",
82
+ clientID: "client-a",
83
+ upToMutationID: 1
84
+ }],
85
+ timestamp: 1
86
+ }],
87
+ pushVersion: 1,
88
+ timestamp: 1,
89
+ requestID: "cleanup"
90
+ })
91
+ });
92
+ }
93
+ (0, import_vitest.describe)("createZeroSQLiteServer", () => {
94
+ let db;
95
+ let retryNextTransaction;
96
+ let transactionProvider;
97
+ (0, import_vitest.beforeEach)(() => {
98
+ db = new import_node_sqlite.DatabaseSync(":memory:");
99
+ db.exec(["CREATE TABLE project (id TEXT PRIMARY KEY, ownerId TEXT NOT NULL, name TEXT NOT NULL);", "CREATE TABLE note_records (note_id TEXT PRIMARY KEY, done INTEGER NOT NULL, data TEXT);"].join("\n"));
100
+ retryNextTransaction = false;
101
+ const executor = {
102
+ async exec(sql, params = []) {
103
+ db.prepare(sql).run(...params);
104
+ },
105
+ async query(sql, params = []) {
106
+ return db.prepare(sql).all(...params);
107
+ },
108
+ async queryAst(ast, format) {
109
+ let rows;
110
+ if (ast.table === "project") {
111
+ rows = db.prepare("SELECT * FROM project ORDER BY id").all();
112
+ } else if (ast.table === "note") {
113
+ rows = db.prepare("SELECT note_id, done, data FROM note_records ORDER BY note_id").all().map(row => ({
114
+ id: row.note_id,
115
+ done: row.done !== 0,
116
+ data: typeof row.data === "string" ? JSON.parse(row.data) : row.data
117
+ }));
118
+ } else if (ast.table === "person") {
119
+ rows = [{
120
+ id: "p1",
121
+ teams: [{
122
+ id: "t1",
123
+ active: true,
124
+ metadata: {
125
+ label: "core"
126
+ }
127
+ }]
128
+ }];
129
+ } else {
130
+ throw new Error("unexpected table " + ast.table);
131
+ }
132
+ return format.singular ? rows[0] : rows;
133
+ }
134
+ };
135
+ const run = async callback => {
136
+ db.exec("BEGIN");
137
+ try {
138
+ const value = await callback(executor);
139
+ db.exec("COMMIT");
140
+ return value;
141
+ } catch (error) {
142
+ db.exec("ROLLBACK");
143
+ throw error;
144
+ }
145
+ };
146
+ transactionProvider = async callback => {
147
+ if (retryNextTransaction) {
148
+ retryNextTransaction = false;
149
+ db.exec("BEGIN");
150
+ await callback(executor);
151
+ db.exec("ROLLBACK");
152
+ }
153
+ return run(callback);
154
+ };
155
+ });
156
+ (0, import_vitest.afterEach)(() => {
157
+ db.close();
158
+ });
159
+ (0, import_vitest.test)("commits CRUD, the mutation ledger, and one retry-safe async task", async () => {
160
+ let effectRuns = 0;
161
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
162
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
163
+ models: {
164
+ project: {
165
+ mutate: {
166
+ create: async ({
167
+ tx,
168
+ server: server2
169
+ }, value) => {
170
+ await tx.mutate.project.insert(value);
171
+ server2?.asyncTasks.push(async () => {});
172
+ (0, import_vitest.expect)(server2?.asyncTasks).toHaveLength(1);
173
+ server2?.asyncTasks.splice(0, 1, async () => {});
174
+ server2.asyncTasks[0] = async () => {
175
+ effectRuns++;
176
+ };
177
+ }
178
+ }
179
+ }
180
+ },
181
+ createServerActions: () => ({}),
182
+ transactionProvider
183
+ });
184
+ retryNextTransaction = true;
185
+ const result = await server.handleMutationRequest({
186
+ authData: null,
187
+ request: pushRequest(1, "project.create", {
188
+ id: "p1",
189
+ ownerId: "u1",
190
+ name: "first"
191
+ }),
192
+ skipAsyncTasks: true
193
+ });
194
+ (0, import_vitest.expect)(result.response.mutations[0].result).toEqual({});
195
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM project").all()).toEqual([{
196
+ id: "p1",
197
+ ownerId: "u1",
198
+ name: "first"
199
+ }]);
200
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM zero_0_clients").all()).toEqual([{
201
+ clientGroupID: "cg1",
202
+ clientID: "client-a",
203
+ lastMutationID: 1
204
+ }]);
205
+ (0, import_vitest.expect)(result.asyncTasks).toHaveLength(1);
206
+ await result.asyncTasks[0]();
207
+ (0, import_vitest.expect)(effectRuns).toBe(1);
208
+ });
209
+ (0, import_vitest.test)("rolls back row writes and persists an application error with its LMID", async () => {
210
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
211
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
212
+ models: {
213
+ project: {
214
+ mutate: {
215
+ fail: async ({
216
+ tx
217
+ }, value) => {
218
+ await tx.mutate.project.insert(value);
219
+ throw new Error("rejected");
220
+ }
221
+ }
222
+ }
223
+ },
224
+ createServerActions: () => ({}),
225
+ transactionProvider
226
+ });
227
+ const result = await server.handleMutationRequest({
228
+ authData: null,
229
+ request: pushRequest(1, "project.fail", {
230
+ id: "p1",
231
+ ownerId: "u1",
232
+ name: "first"
233
+ })
234
+ });
235
+ (0, import_vitest.expect)(result.response.mutations[0].result).toMatchObject({
236
+ error: "app",
237
+ message: "rejected"
238
+ });
239
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM project").all()).toEqual([]);
240
+ (0, import_vitest.expect)(db.prepare("SELECT lastMutationID FROM zero_0_clients").get()).toEqual({
241
+ lastMutationID: 1
242
+ });
243
+ const stored = db.prepare("SELECT result FROM zero_0_mutations").get();
244
+ (0, import_vitest.expect)(JSON.parse(stored.result)).toMatchObject({
245
+ error: "app",
246
+ message: "rejected"
247
+ });
248
+ });
249
+ (0, import_vitest.test)("recovers duplicate results and deletes them through the cleanup mutation", async () => {
250
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
251
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
252
+ models: {
253
+ project: {
254
+ mutate: {
255
+ create: async ({
256
+ tx
257
+ }, value2) => {
258
+ await tx.mutate.project.insert(value2);
259
+ }
260
+ }
261
+ }
262
+ },
263
+ createServerActions: () => ({}),
264
+ transactionProvider
265
+ });
266
+ const value = {
267
+ id: "p1",
268
+ ownerId: "u1",
269
+ name: "first"
270
+ };
271
+ await server.handleMutationRequest({
272
+ authData: null,
273
+ request: pushRequest(1, "project.create", value)
274
+ });
275
+ const duplicate = await server.handleMutationRequest({
276
+ authData: null,
277
+ request: pushRequest(1, "project.create", value)
278
+ });
279
+ (0, import_vitest.expect)(duplicate.response.mutations[0].result).toMatchObject({
280
+ error: "alreadyProcessed"
281
+ });
282
+ (0, import_vitest.expect)(db.prepare("SELECT lastMutationID FROM zero_0_clients").get()).toEqual({
283
+ lastMutationID: 1
284
+ });
285
+ (0, import_vitest.expect)(db.prepare("SELECT COUNT(*) AS count FROM zero_0_mutations").get()).toEqual({
286
+ count: 1
287
+ });
288
+ await server.handleMutationRequest({
289
+ authData: null,
290
+ request: cleanupRequest()
291
+ });
292
+ (0, import_vitest.expect)(db.prepare("SELECT COUNT(*) AS count FROM zero_0_mutations").get()).toEqual({
293
+ count: 0
294
+ });
295
+ });
296
+ (0, import_vitest.test)("supports direct CRUD, server names, value codecs, and query AST execution", async () => {
297
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
298
+ schema: sqliteTypesSchema,
299
+ models: {
300
+ note: {
301
+ mutate: {
302
+ insert: async ({
303
+ tx
304
+ }, value) => {
305
+ await tx.mutate.note.insert(value);
306
+ },
307
+ upsert: async ({
308
+ tx
309
+ }, value) => {
310
+ await tx.mutate.note.upsert(value);
311
+ },
312
+ update: async ({
313
+ tx
314
+ }, value) => {
315
+ await tx.mutate.note.update(value);
316
+ },
317
+ delete: async ({
318
+ tx
319
+ }, value) => {
320
+ await tx.mutate.note.delete(value);
321
+ }
322
+ }
323
+ }
324
+ },
325
+ createServerActions: () => ({}),
326
+ transactionProvider
327
+ });
328
+ await server.mutate.note.insert({
329
+ id: "n1",
330
+ done: false,
331
+ data: {
332
+ label: "first"
333
+ }
334
+ });
335
+ await server.mutate.note.upsert({
336
+ id: "n1",
337
+ done: true,
338
+ data: {
339
+ label: "second"
340
+ }
341
+ });
342
+ await server.mutate.note.update({
343
+ id: "n1",
344
+ done: false
345
+ });
346
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM note_records").get()).toEqual({
347
+ note_id: "n1",
348
+ done: 0,
349
+ data: JSON.stringify({
350
+ label: "second"
351
+ })
352
+ });
353
+ await (0, import_vitest.expect)(server.query(q => q.note)).resolves.toEqual([{
354
+ id: "n1",
355
+ done: false,
356
+ data: {
357
+ label: "second"
358
+ }
359
+ }]);
360
+ await server.transaction(async tx => {
361
+ if (tx.location !== "server") throw new Error("expected server transaction");
362
+ await (0, import_vitest.expect)(tx.query.note.one().run()).resolves.toEqual({
363
+ id: "n1",
364
+ done: false,
365
+ data: {
366
+ label: "second"
367
+ }
368
+ });
369
+ await (0, import_vitest.expect)(tx.dbTransaction.query("SELECT * FROM note_records", [])).resolves.toEqual([{
370
+ note_id: "n1",
371
+ done: 0,
372
+ data: JSON.stringify({
373
+ label: "second"
374
+ })
375
+ }]);
376
+ });
377
+ await server.mutate.note.delete({
378
+ id: "n1"
379
+ });
380
+ (0, import_vitest.expect)(db.prepare("SELECT * FROM note_records").all()).toEqual([]);
381
+ });
382
+ (0, import_vitest.test)("decodes destination rows through a hidden two-hop junction", async () => {
383
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
384
+ schema: twoHopSchema,
385
+ models: {},
386
+ createServerActions: () => ({}),
387
+ transactionProvider
388
+ });
389
+ await (0, import_vitest.expect)(server.query(q => q.person.related("teams"))).resolves.toEqual([{
390
+ id: "p1",
391
+ teams: [{
392
+ id: "t1",
393
+ active: true,
394
+ metadata: {
395
+ label: "core"
396
+ }
397
+ }]
398
+ }]);
399
+ });
400
+ (0, import_vitest.test)("accepts a hydrated singular query result from the transaction executor", async () => {
401
+ const hydrated = {
402
+ id: "n1",
403
+ done: false,
404
+ data: {
405
+ label: "already decoded"
406
+ }
407
+ };
408
+ let receivedQueryName;
409
+ const hydratedExecutor = {
410
+ async exec() {},
411
+ async query() {
412
+ return [];
413
+ },
414
+ async queryAst(_ast, _format, queryName) {
415
+ receivedQueryName = queryName;
416
+ return hydrated;
417
+ }
418
+ };
419
+ const hydratedProvider = async callback => callback(hydratedExecutor);
420
+ const server = (0, import_createZeroSQLiteServer.createZeroSQLiteServer)({
421
+ schema: sqliteTypesSchema,
422
+ models: {},
423
+ createServerActions: () => ({}),
424
+ transactionProvider: hydratedProvider
425
+ });
426
+ await (0, import_vitest.expect)(server.query(q => (0, import_bindings.asQueryInternals)(q.note.one()).nameAndArgs("noteByID", ["n1"]))).resolves.toEqual(hydrated);
427
+ (0, import_vitest.expect)(receivedQueryName).toBe("noteByID");
428
+ });
429
+ });