@apibara/indexer 2.1.0-beta.3 → 2.1.0-beta.30

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 (46) hide show
  1. package/dist/index.cjs +70 -26
  2. package/dist/index.d.cts +1 -1
  3. package/dist/index.d.mts +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.mjs +60 -16
  6. package/dist/internal/plugins.cjs +3 -4
  7. package/dist/internal/plugins.d.cts +1 -1
  8. package/dist/internal/plugins.d.mts +1 -1
  9. package/dist/internal/plugins.d.ts +1 -1
  10. package/dist/internal/plugins.mjs +1 -2
  11. package/dist/internal/testing.cjs +24 -10
  12. package/dist/internal/testing.d.cts +5 -3
  13. package/dist/internal/testing.d.mts +5 -3
  14. package/dist/internal/testing.d.ts +5 -3
  15. package/dist/internal/testing.mjs +22 -8
  16. package/dist/plugins/index.cjs +3 -4
  17. package/dist/plugins/index.d.cts +2 -2
  18. package/dist/plugins/index.d.mts +2 -2
  19. package/dist/plugins/index.d.ts +2 -2
  20. package/dist/plugins/index.mjs +3 -4
  21. package/dist/shared/{indexer.077335f3.cjs → indexer.479ae593.cjs} +5 -0
  22. package/dist/shared/{indexer.a55ad619.mjs → indexer.75773ef1.mjs} +5 -1
  23. package/dist/shared/{indexer.fedcd831.d.cts → indexer.7668fe34.d.cts} +2 -4
  24. package/dist/shared/{indexer.fedcd831.d.mts → indexer.7668fe34.d.mts} +2 -4
  25. package/dist/shared/{indexer.fedcd831.d.ts → indexer.7668fe34.d.ts} +2 -4
  26. package/dist/shared/{indexer.ff25c953.mjs → indexer.98a921a7.mjs} +1 -2
  27. package/dist/shared/{indexer.2416906c.cjs → indexer.a09fa402.cjs} +3 -4
  28. package/dist/testing/index.cjs +9 -5
  29. package/dist/testing/index.d.cts +4 -3
  30. package/dist/testing/index.d.mts +4 -3
  31. package/dist/testing/index.d.ts +4 -3
  32. package/dist/testing/index.mjs +9 -5
  33. package/dist/vcr/index.cjs +2 -1
  34. package/dist/vcr/index.d.cts +1 -1
  35. package/dist/vcr/index.d.mts +1 -1
  36. package/dist/vcr/index.d.ts +1 -1
  37. package/dist/vcr/index.mjs +2 -1
  38. package/package.json +3 -3
  39. package/src/indexer.ts +47 -15
  40. package/src/internal/testing.ts +34 -11
  41. package/src/otel.ts +29 -2
  42. package/src/testing/index.ts +11 -0
  43. package/dist/shared/indexer.601ceab0.cjs +0 -7
  44. package/dist/shared/indexer.9b21ddd2.mjs +0 -5
  45. package/src/compose.test.ts +0 -76
  46. package/src/indexer.test.ts +0 -430
@@ -5,10 +5,9 @@ import {
5
5
  MockStream,
6
6
  type MockStreamResponse,
7
7
  } from "@apibara/protocol/testing";
8
-
9
8
  import { useIndexerContext } from "../context";
10
9
  import { type IndexerConfig, createIndexer, defineIndexer } from "../indexer";
11
- import { defineIndexerPlugin } from "../plugins";
10
+ import { defineIndexerPlugin, logger } from "../plugins";
12
11
  import { type InternalContext, internalContext } from "./plugins";
13
12
 
14
13
  export type MockMessagesOptions = {
@@ -20,6 +19,8 @@ export type MockMessagesOptions = {
20
19
  finalizeToIndex: number;
21
20
  finalizeTriggerIndex: number;
22
21
  };
22
+ uniqueKey?: boolean;
23
+ baseBlockNumber?: bigint;
23
24
  };
24
25
 
25
26
  export function generateMockMessages(
@@ -30,33 +31,50 @@ export function generateMockMessages(
30
31
  const finalizeAt = options?.finalize;
31
32
  const messages: MockStreamResponse[] = [];
32
33
 
34
+ const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5_000_000);
35
+
33
36
  for (let i = 0; i < count; i++) {
37
+ const currentBlockNumber = baseBlockNumber + BigInt(i);
38
+ const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);
34
39
  if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {
40
+ const invalidateToBlock =
41
+ baseBlockNumber + BigInt(invalidateAt.invalidateFromIndex);
35
42
  messages.push({
36
43
  _tag: "invalidate",
37
44
  invalidate: {
38
45
  cursor: {
39
- orderKey: BigInt(5_000_000 + invalidateAt.invalidateFromIndex),
46
+ orderKey: invalidateToBlock,
47
+ uniqueKey: options?.uniqueKey
48
+ ? uniqueKeyFromOrderKey(invalidateToBlock)
49
+ : undefined,
40
50
  },
41
- },
42
- } as Invalidate);
51
+ } as Invalidate,
52
+ });
43
53
  } else if (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {
54
+ const fianlizedToBlock =
55
+ baseBlockNumber + BigInt(finalizeAt.finalizeToIndex);
44
56
  messages.push({
45
57
  _tag: "finalize",
46
58
  finalize: {
47
59
  cursor: {
48
- orderKey: BigInt(5_000_000 + finalizeAt.finalizeToIndex),
60
+ orderKey: fianlizedToBlock,
61
+ uniqueKey: options?.uniqueKey
62
+ ? uniqueKeyFromOrderKey(fianlizedToBlock)
63
+ : undefined,
49
64
  },
50
- },
51
- } as Finalize);
65
+ } as Finalize,
66
+ });
52
67
  } else {
53
68
  messages.push({
54
69
  _tag: "data",
55
70
  data: {
56
- cursor: { orderKey: BigInt(5_000_000 + i - 1) },
71
+ cursor: { orderKey: currentBlockNumber - 1n },
57
72
  finality: "accepted",
58
- data: [{ data: `${5_000_000 + i}` }],
59
- endCursor: { orderKey: BigInt(5_000_000 + i) },
73
+ data: [{ data: `${baseBlockNumber + BigInt(i)}` }],
74
+ endCursor: {
75
+ orderKey: currentBlockNumber,
76
+ uniqueKey: options?.uniqueKey ? uniqueKey : undefined,
77
+ },
60
78
  production: "backfill",
61
79
  },
62
80
  });
@@ -66,6 +84,10 @@ export function generateMockMessages(
66
84
  return messages;
67
85
  }
68
86
 
87
+ function uniqueKeyFromOrderKey(orderKey: bigint): `0x${string}` {
88
+ return `0xff00${orderKey.toString()}`;
89
+ }
90
+
69
91
  type MockIndexerParams = {
70
92
  internalContext?: InternalContext;
71
93
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
@@ -82,6 +104,7 @@ export function getMockIndexer(params?: MockIndexerParams) {
82
104
  filter: {},
83
105
  async transform() {},
84
106
  plugins: [
107
+ logger(),
85
108
  internalContext(
86
109
  contextParams ??
87
110
  ({
package/src/otel.ts CHANGED
@@ -1,3 +1,30 @@
1
- import { trace } from "@opentelemetry/api";
1
+ import { metrics, trace } from "@opentelemetry/api";
2
2
 
3
- export const tracer = trace.getTracer("@apibara/indexer");
3
+ export function createTracer() {
4
+ return trace.getTracer("@apibara/indexer");
5
+ }
6
+
7
+ export function createIndexerMetrics() {
8
+ const meter = metrics.getMeter("@apibara/indexer");
9
+
10
+ const currentBlockGauge = meter.createGauge("current_block", {
11
+ description: "Current block number being processed",
12
+ unit: "{block}",
13
+ });
14
+
15
+ const processedBlockCounter = meter.createCounter("processed_blocks", {
16
+ description: "Number of blocks processed",
17
+ unit: "{blocks}",
18
+ });
19
+
20
+ const reorgCounter = meter.createCounter("reorgs", {
21
+ description: "Number of reorgs (invalidate messages) received",
22
+ unit: "{reorgs}",
23
+ });
24
+
25
+ return {
26
+ currentBlockGauge,
27
+ processedBlockCounter,
28
+ reorgCounter,
29
+ };
30
+ }
@@ -1,5 +1,6 @@
1
1
  import { createClient } from "@apibara/protocol";
2
2
  import ci from "ci-info";
3
+ import { useIndexerContext } from "../context";
3
4
  import { type IndexerWithStreamConfig, createIndexer } from "../indexer";
4
5
  import { type InternalContext, internalContext } from "../plugins/context";
5
6
  import { logger } from "../plugins/logger";
@@ -8,7 +9,11 @@ import { isCassetteAvailable } from "../vcr/helper";
8
9
  import { record } from "../vcr/record";
9
10
  import { replay } from "../vcr/replay";
10
11
 
12
+ export type VcrResult = Record<string, unknown>;
13
+
11
14
  export function createVcr() {
15
+ let result: VcrResult;
16
+
12
17
  return {
13
18
  async run<TFilter, TBlock>(
14
19
  cassetteName: string,
@@ -40,6 +45,10 @@ export function createVcr() {
40
45
 
41
46
  const indexer = createIndexer(indexerConfig);
42
47
 
48
+ indexer.hooks.hook("run:after", () => {
49
+ result = useIndexerContext();
50
+ });
51
+
43
52
  if (!isCassetteAvailable(vcrConfig, cassetteName)) {
44
53
  if (ci.isCI) {
45
54
  throw new Error("Cannot record cassette in CI");
@@ -53,6 +62,8 @@ export function createVcr() {
53
62
  } else {
54
63
  await replay(vcrConfig, indexer, cassetteName);
55
64
  }
65
+
66
+ return result;
56
67
  },
57
68
  };
58
69
  }
@@ -1,7 +0,0 @@
1
- 'use strict';
2
-
3
- function defineIndexerPlugin(def) {
4
- return def;
5
- }
6
-
7
- exports.defineIndexerPlugin = defineIndexerPlugin;
@@ -1,5 +0,0 @@
1
- function defineIndexerPlugin(def) {
2
- return def;
3
- }
4
-
5
- export { defineIndexerPlugin as d };
@@ -1,76 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { type MiddlewareFunction, type NextFunction, compose } from "./compose";
3
-
4
- type C = {
5
- bag: Record<string, unknown>;
6
- finalized: boolean;
7
- };
8
-
9
- type MiddlewareTuple = MiddlewareFunction<C>;
10
-
11
- describe("compose", () => {
12
- async function a(context: C, next: NextFunction) {
13
- context.bag.log = "log";
14
- await next();
15
- }
16
-
17
- async function b(context: C, next: NextFunction) {
18
- await next();
19
- context.bag.headers = "custom-header";
20
- }
21
-
22
- async function c(context: C, next: NextFunction) {
23
- context.bag.xxx = "yyy";
24
- await next();
25
- context.bag.zzz = context.bag.xxx;
26
- }
27
-
28
- async function handler(context: C, next: NextFunction) {
29
- context.bag.log = `${context.bag.log} message`;
30
- await next();
31
- context.bag.message = "new response";
32
- }
33
-
34
- const middleware: MiddlewareTuple[] = [];
35
-
36
- middleware.push(a);
37
- middleware.push(b);
38
- middleware.push(c);
39
- middleware.push(handler);
40
-
41
- it("composes", async () => {
42
- const context: C = {
43
- bag: {},
44
- finalized: false,
45
- };
46
-
47
- const composed = compose<C>(middleware);
48
- await composed(context);
49
-
50
- expect(context.bag.log).toBeDefined();
51
- expect(context.bag.log).toBe("log message");
52
- expect(context.bag.headers).toBe("custom-header");
53
- expect(context.bag.xxx).toBe("yyy");
54
- expect(context.bag.zzz).toBe("yyy");
55
- expect(context.finalized).toBe(false);
56
- });
57
-
58
- it("accepts a next function", async () => {
59
- const context: C = {
60
- bag: {},
61
- finalized: false,
62
- };
63
-
64
- const composed = compose<C>(middleware);
65
- await composed(context, async () => {
66
- context.finalized = true;
67
- });
68
-
69
- expect(context.bag.log).toBeDefined();
70
- expect(context.bag.log).toBe("log message");
71
- expect(context.bag.headers).toBe("custom-header");
72
- expect(context.bag.xxx).toBe("yyy");
73
- expect(context.bag.zzz).toBe("yyy");
74
- expect(context.finalized).toBe(true);
75
- });
76
- });
@@ -1,430 +0,0 @@
1
- import type { Cursor, DataFinality } from "@apibara/protocol";
2
- import {
3
- type MockBlock,
4
- MockClient,
5
- type MockFilter,
6
- } from "@apibara/protocol/testing";
7
- import { describe, expect, it } from "vitest";
8
- import { type IndexerContext, useMessageMetadataContext } from "./context";
9
- import { run } from "./indexer";
10
- import {
11
- generateMockMessages,
12
- getMockIndexer,
13
- mockSink,
14
- useMockSink,
15
- } from "./internal/testing";
16
-
17
- async function transform<TData>({
18
- block: { data },
19
- }: {
20
- block: { data?: TData };
21
- cursor?: Cursor;
22
- endCursor?: Cursor;
23
- finality?: DataFinality;
24
- context: IndexerContext;
25
- }) {
26
- const { cursor, endCursor, finality } = useMessageMetadataContext();
27
- const { output } = useMockSink();
28
- output.push({
29
- data,
30
- cursor: cursor?.orderKey,
31
- endCursor: endCursor?.orderKey,
32
- finality,
33
- });
34
- }
35
-
36
- describe("Run Test", () => {
37
- it("should stream messages", async () => {
38
- const client = new MockClient<MockFilter, MockBlock>((request, options) => {
39
- return generateMockMessages();
40
- });
41
-
42
- const output: unknown[] = [];
43
-
44
- const indexer = getMockIndexer({
45
- override: {
46
- plugins: [mockSink({ output })],
47
- transform,
48
- },
49
- });
50
-
51
- await run(client, indexer);
52
-
53
- expect(output).toMatchInlineSnapshot(`
54
- [
55
- {
56
- "cursor": 4999999n,
57
- "data": "5000000",
58
- "endCursor": 5000000n,
59
- "finality": "accepted",
60
- },
61
- {
62
- "cursor": 5000000n,
63
- "data": "5000001",
64
- "endCursor": 5000001n,
65
- "finality": "accepted",
66
- },
67
- {
68
- "cursor": 5000001n,
69
- "data": "5000002",
70
- "endCursor": 5000002n,
71
- "finality": "accepted",
72
- },
73
- {
74
- "cursor": 5000002n,
75
- "data": "5000003",
76
- "endCursor": 5000003n,
77
- "finality": "accepted",
78
- },
79
- {
80
- "cursor": 5000003n,
81
- "data": "5000004",
82
- "endCursor": 5000004n,
83
- "finality": "accepted",
84
- },
85
- {
86
- "cursor": 5000004n,
87
- "data": "5000005",
88
- "endCursor": 5000005n,
89
- "finality": "accepted",
90
- },
91
- {
92
- "cursor": 5000005n,
93
- "data": "5000006",
94
- "endCursor": 5000006n,
95
- "finality": "accepted",
96
- },
97
- {
98
- "cursor": 5000006n,
99
- "data": "5000007",
100
- "endCursor": 5000007n,
101
- "finality": "accepted",
102
- },
103
- {
104
- "cursor": 5000007n,
105
- "data": "5000008",
106
- "endCursor": 5000008n,
107
- "finality": "accepted",
108
- },
109
- {
110
- "cursor": 5000008n,
111
- "data": "5000009",
112
- "endCursor": 5000009n,
113
- "finality": "accepted",
114
- },
115
- ]
116
- `);
117
- });
118
-
119
- it("factory mode: indexer should merge filters and restart when needed", async () => {
120
- const client = new MockClient<MockFilter, MockBlock>((request, options) => {
121
- const [_factoryFilter, mainFilter] = request.filter;
122
-
123
- if (Object.keys(mainFilter).length === 0) {
124
- expect(request.startingCursor?.orderKey).toEqual(100n);
125
-
126
- return [
127
- {
128
- _tag: "data",
129
- data: {
130
- finality: "accepted",
131
- cursor: { orderKey: 100n },
132
- endCursor: { orderKey: 101n },
133
- data: [null, null],
134
- production: "backfill",
135
- },
136
- },
137
- {
138
- _tag: "data",
139
- data: {
140
- finality: "accepted",
141
- cursor: { orderKey: 101n },
142
- endCursor: { orderKey: 102n },
143
- data: [null, null],
144
- production: "backfill",
145
- },
146
- },
147
- {
148
- _tag: "data",
149
- data: {
150
- finality: "accepted",
151
- cursor: { orderKey: 102n },
152
- endCursor: { orderKey: 103n },
153
- data: [{ data: "B" }, null],
154
- production: "backfill",
155
- },
156
- },
157
- ];
158
- }
159
-
160
- if (mainFilter.filter === "B") {
161
- expect(request.startingCursor?.orderKey).toEqual(102n);
162
-
163
- return [
164
- {
165
- _tag: "data",
166
- data: {
167
- finality: "accepted",
168
- cursor: { orderKey: 102n },
169
- endCursor: { orderKey: 103n },
170
- data: [{ data: "B" }, { data: "103B" }],
171
- production: "backfill",
172
- },
173
- },
174
- {
175
- _tag: "data",
176
- data: {
177
- finality: "accepted",
178
- cursor: { orderKey: 103n },
179
- endCursor: { orderKey: 104n },
180
- data: [null, { data: "104B" }],
181
- production: "backfill",
182
- },
183
- },
184
- {
185
- _tag: "data",
186
- data: {
187
- finality: "accepted",
188
- cursor: { orderKey: 104n },
189
- endCursor: { orderKey: 105n },
190
- data: [null, { data: "105B" }],
191
- production: "backfill",
192
- },
193
- },
194
- {
195
- _tag: "data",
196
- data: {
197
- finality: "accepted",
198
- cursor: { orderKey: 105n },
199
- endCursor: { orderKey: 106n },
200
- data: [{ data: "C" }, { data: "106B" }],
201
- production: "backfill",
202
- },
203
- },
204
- ];
205
- }
206
-
207
- if (mainFilter.filter === "BC") {
208
- expect(request.startingCursor?.orderKey).toEqual(105n);
209
-
210
- return [
211
- {
212
- _tag: "data",
213
- data: {
214
- finality: "accepted",
215
- cursor: { orderKey: 105n },
216
- endCursor: { orderKey: 106n },
217
- data: [{ data: "C" }, { data: "106BC" }],
218
- production: "backfill",
219
- },
220
- },
221
- {
222
- _tag: "data",
223
- data: {
224
- finality: "accepted",
225
- cursor: { orderKey: 106n },
226
- endCursor: { orderKey: 107n },
227
- data: [null, { data: "107BC" }],
228
- production: "backfill",
229
- },
230
- },
231
- {
232
- _tag: "data",
233
- data: {
234
- finality: "accepted",
235
- cursor: { orderKey: 107n },
236
- endCursor: { orderKey: 108n },
237
- data: [null, { data: "108BC" }],
238
- production: "backfill",
239
- },
240
- },
241
- ];
242
- }
243
-
244
- return [];
245
- });
246
-
247
- const output: unknown[] = [];
248
- const metadata: Record<string, unknown> = {};
249
-
250
- const indexer = getMockIndexer({
251
- override: {
252
- plugins: [mockSink({ output, metadata })],
253
- startingCursor: { orderKey: 100n },
254
- factory: async ({ block }) => {
255
- if (block.data === "B") {
256
- return { filter: { filter: "B" } };
257
- }
258
-
259
- if (block.data === "C") {
260
- return { filter: { filter: "C" } };
261
- }
262
-
263
- return {};
264
- },
265
- transform,
266
- },
267
- });
268
-
269
- await run(client, indexer);
270
-
271
- expect((metadata.lastCursor as Cursor).orderKey).toEqual(108n);
272
- expect((metadata.lastFilter as { filter: unknown }).filter).toEqual("BC");
273
-
274
- expect(output).toMatchInlineSnapshot(`
275
- [
276
- {
277
- "cursor": 102n,
278
- "data": "103B",
279
- "endCursor": 103n,
280
- "finality": "accepted",
281
- },
282
- {
283
- "cursor": 103n,
284
- "data": "104B",
285
- "endCursor": 104n,
286
- "finality": "accepted",
287
- },
288
- {
289
- "cursor": 104n,
290
- "data": "105B",
291
- "endCursor": 105n,
292
- "finality": "accepted",
293
- },
294
- {
295
- "cursor": 105n,
296
- "data": "106BC",
297
- "endCursor": 106n,
298
- "finality": "accepted",
299
- },
300
- {
301
- "cursor": 106n,
302
- "data": "107BC",
303
- "endCursor": 107n,
304
- "finality": "accepted",
305
- },
306
- {
307
- "cursor": 107n,
308
- "data": "108BC",
309
- "endCursor": 108n,
310
- "finality": "accepted",
311
- },
312
- ]
313
- `);
314
- });
315
-
316
- it("factory mode: last cursor should persist when error is thrown in indexer", async () => {
317
- const client = new MockClient<MockFilter, MockBlock>((request, options) => {
318
- const [_factoryFilter, mainFilter] = request.filter;
319
-
320
- if (Object.keys(mainFilter).length === 0) {
321
- expect(request.startingCursor?.orderKey).toEqual(100n);
322
-
323
- return [
324
- {
325
- _tag: "data",
326
- data: {
327
- finality: "accepted",
328
- cursor: { orderKey: 100n },
329
- endCursor: { orderKey: 101n },
330
- data: [null, null],
331
- production: "backfill",
332
- },
333
- },
334
- {
335
- _tag: "data",
336
- data: {
337
- finality: "accepted",
338
- cursor: { orderKey: 101n },
339
- endCursor: { orderKey: 102n },
340
- data: [null, null],
341
- production: "backfill",
342
- },
343
- },
344
- {
345
- _tag: "data",
346
- data: {
347
- finality: "accepted",
348
- cursor: { orderKey: 102n },
349
- endCursor: { orderKey: 103n },
350
- data: [{ data: "B" }, null],
351
- production: "backfill",
352
- },
353
- },
354
- Error("this error should not occurr!"),
355
- ];
356
- }
357
-
358
- if (mainFilter.filter === "B") {
359
- expect(request.startingCursor?.orderKey).toEqual(102n);
360
-
361
- return [
362
- Error("this error should occurr!"),
363
- {
364
- _tag: "data",
365
- data: {
366
- finality: "accepted",
367
- cursor: { orderKey: 103n },
368
- endCursor: { orderKey: 104n },
369
- data: [null, { data: "104B" }],
370
- production: "backfill",
371
- },
372
- },
373
- {
374
- _tag: "data",
375
- data: {
376
- finality: "accepted",
377
- cursor: { orderKey: 104n },
378
- endCursor: { orderKey: 105n },
379
- data: [null, { data: "105B" }],
380
- production: "backfill",
381
- },
382
- },
383
- {
384
- _tag: "data",
385
- data: {
386
- finality: "accepted",
387
- cursor: { orderKey: 105n },
388
- endCursor: { orderKey: 106n },
389
- data: [{ data: "C" }, { data: "106B" }],
390
- production: "backfill",
391
- },
392
- },
393
- ];
394
- }
395
-
396
- return [];
397
- });
398
-
399
- const output: unknown[] = [];
400
- const metadata: Record<string, unknown> = {};
401
-
402
- const indexer = getMockIndexer({
403
- override: {
404
- plugins: [mockSink({ output, metadata })],
405
- startingCursor: { orderKey: 100n },
406
- factory: async ({ block }) => {
407
- if (block.data === "B") {
408
- return { filter: { filter: "B" } };
409
- }
410
-
411
- if (block.data === "C") {
412
- return { filter: { filter: "C" } };
413
- }
414
-
415
- return {};
416
- },
417
- transform,
418
- },
419
- });
420
-
421
- await expect(() => run(client, indexer)).rejects.toThrowError(
422
- "this error should occurr!",
423
- );
424
-
425
- expect((metadata.lastCursor as Cursor).orderKey).toEqual(103n);
426
- expect((metadata.lastFilter as { filter: unknown }).filter).toEqual("B");
427
-
428
- expect(output).toMatchInlineSnapshot("[]");
429
- });
430
- });