@feasibleone/blong-chain 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/examples/demo.test.js.map +1 -1
- package/dist/examples/error-demo.test.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +185 -20
- package/dist/index.js.map +1 -1
- package/dist/index.test.js.map +1 -1
- package/dist/package.json +4 -3
- package/dist/showcase.test.js.map +1 -1
- package/dist/snapshot-context.test.d.ts +30 -0
- package/dist/snapshot-context.test.d.ts.map +1 -0
- package/dist/snapshot-context.test.js.map +1 -0
- package/dist/test-types.d.ts +58 -3
- package/dist/test-types.d.ts.map +1 -1
- package/dist/test-types.js +0 -3
- package/dist/test-types.js.map +1 -1
- package/dist/timing-analysis.test.js.map +1 -1
- package/index.ts +56 -44
- package/package.json +4 -2
- package/test-types.ts +12 -1
- package/dist/snapshot.d.ts +0 -56
- package/dist/snapshot.d.ts.map +0 -1
- package/dist/snapshot.js +0 -70
- package/dist/snapshot.js.map +0 -1
package/dist/test-types.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import nodeAssert from 'node:assert';
|
|
2
|
+
declare module 'node:assert' {
|
|
3
|
+
function snapshot(value?: unknown, name?: string, opts?: {
|
|
4
|
+
mask?: string[];
|
|
5
|
+
}): void;
|
|
6
|
+
}
|
|
1
7
|
/**
|
|
2
8
|
* Type definitions for the Blong parallel test framework
|
|
3
9
|
*/
|
|
@@ -26,11 +32,29 @@ export interface ITestContext {
|
|
|
26
32
|
* @param context - Test context with $meta and outputs from previous steps
|
|
27
33
|
* @returns The output to be stored in context under the function's name
|
|
28
34
|
*/
|
|
29
|
-
export type StepFunction = (assert:
|
|
35
|
+
export type StepFunction = (assert: typeof nodeAssert, context: ITestContext) => unknown | Promise<unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* A snapshot checkpoint — an array of step-name strings placed inside the
|
|
38
|
+
* steps array. At runtime, when the executor encounters it the current batch
|
|
39
|
+
* is awaited and the listed step results are snapshotted into the TAP context.
|
|
40
|
+
*
|
|
41
|
+
* - `['*']` — snapshot ALL completed steps' results into one context object
|
|
42
|
+
* - `['step1', 'step2']` — snapshot only those specific steps
|
|
43
|
+
* - `[]` — sync barrier only, no snapshot (existing behaviour)
|
|
44
|
+
*
|
|
45
|
+
* The array may carry an optional `.name` to give the snapshot a stable name:
|
|
46
|
+
* ```
|
|
47
|
+
* const cp = Object.assign(['*'], {name: 'provisioning-complete'});
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export type CheckpointMarker = string[] & {
|
|
51
|
+
name?: string;
|
|
52
|
+
};
|
|
30
53
|
/**
|
|
31
|
-
* Array of test steps
|
|
54
|
+
* Array of test steps. May contain step functions, nested step groups, or
|
|
55
|
+
* checkpoint markers (string arrays).
|
|
32
56
|
*/
|
|
33
|
-
export type StepArray = (StepFunction | StepArray)[] & {
|
|
57
|
+
export type StepArray = (StepFunction | StepArray | CheckpointMarker)[] & {
|
|
34
58
|
name?: string;
|
|
35
59
|
};
|
|
36
60
|
/**
|
|
@@ -49,6 +73,8 @@ export interface IMeta {
|
|
|
49
73
|
export interface ITestFrameworkContext {
|
|
50
74
|
/** Creates a nested test scope for proper indentation */
|
|
51
75
|
test: (name: string, fn: (t: unknown) => void | Promise<void>) => unknown;
|
|
76
|
+
/** Captures a snapshot of a value under the given name */
|
|
77
|
+
matchSnapshot?: (value: unknown, name: string) => void;
|
|
52
78
|
}
|
|
53
79
|
/**
|
|
54
80
|
* A thenable proxy that acts as both a Promise and supports property access.
|
|
@@ -285,6 +311,35 @@ export interface ITestExecutorConfig {
|
|
|
285
311
|
framework?: unknown;
|
|
286
312
|
/** Logger instance for reporting step failures */
|
|
287
313
|
log?: ITestLogger;
|
|
314
|
+
/**
|
|
315
|
+
* Chain-level mask paths. Applied to ALL snapshot operations in this chain:
|
|
316
|
+
* `autoSnapshot`, `assert.snapshot()`, and checkpoint snapshots.
|
|
317
|
+
*
|
|
318
|
+
* Supports:
|
|
319
|
+
* - Simple name: `'id'` — masks the `id` field in the snapshotted value
|
|
320
|
+
* - Dot-path: `'user.id'` — masks a nested field
|
|
321
|
+
* - Wildcard prefix: `'*.id'` — masks `id` inside every direct child of the
|
|
322
|
+
* snapshotted object (useful for context-level snapshots where each child
|
|
323
|
+
* is a step result)
|
|
324
|
+
*
|
|
325
|
+
* Per-call `{mask: [...]}` options are merged on top of this chain-level mask.
|
|
326
|
+
*/
|
|
327
|
+
mask?: string[];
|
|
328
|
+
/**
|
|
329
|
+
* When `true`, automatically snapshot every step's return value under the
|
|
330
|
+
* step's function name after it completes. The chain-level `mask` is applied
|
|
331
|
+
* before snapshotting. No `assert.snapshot()` calls are needed in step
|
|
332
|
+
* functions — the framework captures everything automatically.
|
|
333
|
+
*
|
|
334
|
+
* Requires a TAP (or compatible) test context to be passed to `execute()`.
|
|
335
|
+
*/
|
|
336
|
+
autoSnapshot?: boolean;
|
|
337
|
+
/**
|
|
338
|
+
* @deprecated Use `mask` (string array) instead.
|
|
339
|
+
* Custom masking function for advanced scenarios not covered by `mask`.
|
|
340
|
+
* When both are provided, `maskFn` is used and `mask` is passed to it.
|
|
341
|
+
*/
|
|
342
|
+
maskFn?: (value: unknown, paths: string[]) => unknown;
|
|
288
343
|
/**
|
|
289
344
|
* Automatic rerun configuration for failing steps (Phase 1).
|
|
290
345
|
*
|
package/dist/test-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-types.d.ts","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,uEAAuE;AACvE,MAAM,WAAW,WAAW;IACxB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACxC;AAMD;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,0EAA0E;IAC1E,KAAK,EAAE,KAAK,CAAC;IACb,kFAAkF;IAClF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"test-types.d.ts","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,OAAO,QAAQ,aAAa,CAAC;IACzB,SAAS,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI,CAAC;CACrF;AAED;;GAEG;AAMH,uEAAuE;AACvE,MAAM,WAAW,WAAW;IACxB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACxC;AAMD;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB,0EAA0E;IAC1E,KAAK,EAAE,KAAK,CAAC;IACb,kFAAkF;IAClF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CACvB,MAAM,EAAE,OAAO,UAAU,EACzB,OAAO,EAAE,YAAY,KACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,EAAE,GAAG;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,YAAY,GAAG,SAAS,GAAG,gBAAgB,CAAC,EAAE,GAAG;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,KAAK;IAClB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC,yDAAyD;IACzD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC;IAC1E,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAMD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;IACnD,gEAAgE;IAChE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;CAC1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACtC,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,mDAAmD;IACnD,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,mDAAmD;IACnD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,mCAAmC;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,cAAc,EAAE,eAAe,CAAC;IAChC,6BAA6B;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACpC,6CAA6C;IAC7C,KAAK,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+BAA+B;IAC/B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,2BAA2B;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAClC,kCAAkC;IAClC,MAAM,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0BAA0B;IAC1B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,qCAAqC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,yBAAyB;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,UAAU,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mBAAmB;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;CAC1B;AAMD;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,WAAW,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC,CAAC;CACN;AAMD;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,YAAY,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAChD,UAAU,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAClE,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;CACnF;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IACtD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE;QACJ,6DAA6D;QAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,yBAAyB;IACzB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,oCAAoC;IACpC,WAAW,IAAI,aAAa,CAAC;IAC7B,2BAA2B;IAC3B,kBAAkB,IAAI,gBAAgB,CAAC;IACvC,0BAA0B;IAC1B,gBAAgB,IAAI,YAAY,CAAC;IACjC,8BAA8B;IAC9B,EAAE,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC5E"}
|
package/dist/test-types.js
CHANGED
package/dist/test-types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-types.js","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-types.js","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing-analysis.test.js","sourceRoot":"","sources":["../timing-analysis.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"timing-analysis.test.js","sourceRoot":"","sources":["../timing-analysis.test.ts"],"names":[],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -25,6 +25,7 @@ import type {
|
|
|
25
25
|
ITestContext,
|
|
26
26
|
ITestEvents,
|
|
27
27
|
ITestExecutorConfig,
|
|
28
|
+
ITestFrameworkContext,
|
|
28
29
|
ITestLatency,
|
|
29
30
|
ITestLogger,
|
|
30
31
|
ITestProgress,
|
|
@@ -49,16 +50,16 @@ function createThenableProxy<T = unknown>(
|
|
|
49
50
|
const promiseEntry = promiseManager.getOrCreate(path);
|
|
50
51
|
|
|
51
52
|
// Create a proxy that intercepts property access
|
|
52
|
-
const proxy = new Proxy(promiseEntry.promise
|
|
53
|
-
get(target: Promise<T>, prop: string | symbol)
|
|
53
|
+
const proxy = new Proxy(promiseEntry.promise, {
|
|
54
|
+
get(target: Promise<T> & Record<symbol, unknown>, prop: string | symbol) {
|
|
54
55
|
// Promise methods: delegate to the real promise
|
|
55
56
|
if (prop === 'then' || prop === 'catch' || prop === 'finally') {
|
|
56
|
-
return
|
|
57
|
+
return target[prop].bind(target);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
// Symbol properties (like Symbol.toStringTag)
|
|
60
61
|
if (typeof prop === 'symbol') {
|
|
61
|
-
return
|
|
62
|
+
return target[prop];
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
// Property access: return nested thenable proxy
|
|
@@ -161,12 +162,12 @@ class PromiseManager {
|
|
|
161
162
|
/**
|
|
162
163
|
* Gets nested value from an object by path
|
|
163
164
|
*/
|
|
164
|
-
private _getNestedValue(obj:
|
|
165
|
+
private _getNestedValue(obj: unknown, path: string): unknown {
|
|
165
166
|
const parts = path.split('.');
|
|
166
167
|
let current = obj;
|
|
167
168
|
for (const part of parts) {
|
|
168
169
|
if (current && typeof current === 'object') {
|
|
169
|
-
current = current[part];
|
|
170
|
+
current = (current as Record<string, unknown>)[part];
|
|
170
171
|
} else {
|
|
171
172
|
return undefined;
|
|
172
173
|
}
|
|
@@ -199,11 +200,11 @@ class PromiseManager {
|
|
|
199
200
|
/**
|
|
200
201
|
* Recursively resolves promises for nested properties
|
|
201
202
|
*/
|
|
202
|
-
private _resolveNestedProperties(basePath: string, obj:
|
|
203
|
+
private _resolveNestedProperties(basePath: string, obj: unknown, depth = 0): void {
|
|
203
204
|
// Limit recursion depth to avoid infinite loops
|
|
204
205
|
if (depth > 10) return;
|
|
205
206
|
|
|
206
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
207
|
+
for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
|
|
207
208
|
const nestedPath = `${basePath}.${key}`;
|
|
208
209
|
|
|
209
210
|
if (this.promises.has(nestedPath)) {
|
|
@@ -240,7 +241,7 @@ function createContextProxy(
|
|
|
240
241
|
dependencyTracker: DependencyTracker,
|
|
241
242
|
): ITestContext {
|
|
242
243
|
return new Proxy(realContext as ITestContext, {
|
|
243
|
-
get(target:
|
|
244
|
+
get(target: ITestContext & Record<symbol, unknown>, prop: string | symbol) {
|
|
244
245
|
// Special case: $meta is always available directly
|
|
245
246
|
if (prop === '$meta') {
|
|
246
247
|
return target.$meta;
|
|
@@ -325,7 +326,7 @@ class DependencyTracker {
|
|
|
325
326
|
/**
|
|
326
327
|
* Captures source location information for error reporting
|
|
327
328
|
*/
|
|
328
|
-
function captureSourceLocation(
|
|
329
|
+
function captureSourceLocation(): ISourceLocation {
|
|
329
330
|
try {
|
|
330
331
|
const stack = new Error().stack || '';
|
|
331
332
|
const lines = stack.split('\n');
|
|
@@ -355,7 +356,7 @@ function captureSourceLocation(fn: Function): ISourceLocation {
|
|
|
355
356
|
}
|
|
356
357
|
}
|
|
357
358
|
}
|
|
358
|
-
} catch
|
|
359
|
+
} catch {
|
|
359
360
|
// If parsing fails, return unknown location
|
|
360
361
|
}
|
|
361
362
|
|
|
@@ -442,7 +443,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
442
443
|
private promiseManager: PromiseManager;
|
|
443
444
|
|
|
444
445
|
// Test framework context for nested test output
|
|
445
|
-
private testContext?:
|
|
446
|
+
private testContext?: ITestFrameworkContext;
|
|
446
447
|
|
|
447
448
|
// Track step names to detect duplicates
|
|
448
449
|
private stepNamesUsed = new Set<string>();
|
|
@@ -474,7 +475,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
474
475
|
async execute(
|
|
475
476
|
steps: StepArray,
|
|
476
477
|
$meta: IMeta,
|
|
477
|
-
testContext?:
|
|
478
|
+
testContext?: ITestFrameworkContext,
|
|
478
479
|
): Promise<void> {
|
|
479
480
|
// Store test context for nested execution
|
|
480
481
|
this.testContext = testContext;
|
|
@@ -514,7 +515,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
514
515
|
|
|
515
516
|
try {
|
|
516
517
|
// Execute all steps
|
|
517
|
-
await this._executeSteps(steps, [], this.testContext
|
|
518
|
+
await this._executeSteps(steps, [], this.testContext);
|
|
518
519
|
|
|
519
520
|
// Mark as completed
|
|
520
521
|
this.progress.status = 'completed';
|
|
@@ -537,7 +538,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
537
538
|
private async _executeSteps(
|
|
538
539
|
steps: StepArray,
|
|
539
540
|
groupPath: string[],
|
|
540
|
-
parentTestContext?:
|
|
541
|
+
parentTestContext?: ITestFrameworkContext,
|
|
541
542
|
): Promise<void> {
|
|
542
543
|
const stepPromises: Promise<void>[] = [];
|
|
543
544
|
const namedPromises = new Map<string, Promise<void>>();
|
|
@@ -578,7 +579,8 @@ export class TestExecutor extends EventEmitter {
|
|
|
578
579
|
? `context`
|
|
579
580
|
: checkpoint.join('-'));
|
|
580
581
|
// Disambiguate when the same name is used more than once
|
|
581
|
-
const snapshotName =
|
|
582
|
+
const snapshotName =
|
|
583
|
+
checkpointIndex === 0 ? cpName : `${cpName}-${checkpointIndex}`;
|
|
582
584
|
checkpointIndex++;
|
|
583
585
|
|
|
584
586
|
const stepsToSnapshot =
|
|
@@ -591,15 +593,15 @@ export class TestExecutor extends EventEmitter {
|
|
|
591
593
|
);
|
|
592
594
|
|
|
593
595
|
const contextSnapshot = Object.fromEntries(
|
|
594
|
-
stepsToSnapshot.map(name => [
|
|
596
|
+
stepsToSnapshot.map(name => [
|
|
597
|
+
name,
|
|
598
|
+
this._applyMask(this.realContext[name]),
|
|
599
|
+
]),
|
|
595
600
|
);
|
|
596
601
|
|
|
597
602
|
const snapshotTarget = parentTestContext;
|
|
598
|
-
if (
|
|
599
|
-
snapshotTarget
|
|
600
|
-
typeof (snapshotTarget as any).matchSnapshot === 'function'
|
|
601
|
-
) {
|
|
602
|
-
(snapshotTarget as any).matchSnapshot(contextSnapshot, snapshotName);
|
|
603
|
+
if (snapshotTarget && typeof snapshotTarget.matchSnapshot === 'function') {
|
|
604
|
+
snapshotTarget.matchSnapshot(contextSnapshot, snapshotName);
|
|
603
605
|
}
|
|
604
606
|
continue;
|
|
605
607
|
}
|
|
@@ -613,18 +615,26 @@ export class TestExecutor extends EventEmitter {
|
|
|
613
615
|
// If we have a test context, use it to create nested test scope
|
|
614
616
|
if (this.testContext && parentTestContext) {
|
|
615
617
|
const nestedName = step.name || `group-${groupPath.length}`;
|
|
616
|
-
await
|
|
618
|
+
await this.testContext.test.call(
|
|
617
619
|
parentTestContext,
|
|
618
620
|
nestedName,
|
|
619
621
|
async (nestedContext: unknown) => {
|
|
620
|
-
await this._executeSteps(
|
|
622
|
+
await this._executeSteps(
|
|
623
|
+
step,
|
|
624
|
+
nestedGroupPath,
|
|
625
|
+
nestedContext as ITestFrameworkContext,
|
|
626
|
+
);
|
|
621
627
|
},
|
|
622
628
|
);
|
|
623
629
|
} else if (this.testContext && groupPath.length === 0) {
|
|
624
630
|
// Top-level nested array
|
|
625
631
|
const nestedName = step.name || `group-${groupPath.length}`;
|
|
626
632
|
await this.testContext.test(nestedName, async (nestedContext: unknown) => {
|
|
627
|
-
await this._executeSteps(
|
|
633
|
+
await this._executeSteps(
|
|
634
|
+
step,
|
|
635
|
+
nestedGroupPath,
|
|
636
|
+
nestedContext as ITestFrameworkContext,
|
|
637
|
+
);
|
|
628
638
|
});
|
|
629
639
|
} else {
|
|
630
640
|
// No test context, execute directly
|
|
@@ -657,9 +667,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
657
667
|
this._checkForDuplicateStepName(stepName);
|
|
658
668
|
|
|
659
669
|
// Capture source location if enabled
|
|
660
|
-
const sourceLocation = this.config.captureStackTraces
|
|
661
|
-
? captureSourceLocation(fn)
|
|
662
|
-
: undefined;
|
|
670
|
+
const sourceLocation = this.config.captureStackTraces ? captureSourceLocation() : undefined;
|
|
663
671
|
|
|
664
672
|
// Initialize step progress
|
|
665
673
|
const stepProgress: IStepProgress = {
|
|
@@ -699,11 +707,12 @@ export class TestExecutor extends EventEmitter {
|
|
|
699
707
|
// step's return value
|
|
700
708
|
// assert.snapshot() — deferred, no extra mask
|
|
701
709
|
// Deferred snapshots are taken after fn() returns, under the step name.
|
|
710
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
702
711
|
const self = this;
|
|
703
|
-
const executeStepFn = async (stepTestContext?:
|
|
712
|
+
const executeStepFn = async (stepTestContext?: ITestFrameworkContext) => {
|
|
704
713
|
const hasSnapshotTarget =
|
|
705
714
|
stepTestContext !== undefined &&
|
|
706
|
-
typeof
|
|
715
|
+
typeof stepTestContext.matchSnapshot === 'function';
|
|
707
716
|
|
|
708
717
|
// Tracks a deferred assert.snapshot() call made inside the step.
|
|
709
718
|
const snapshotRequest: {deferred?: {mask?: string[]}} = {};
|
|
@@ -711,8 +720,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
711
720
|
const stepAssert = hasSnapshotTarget
|
|
712
721
|
? new Proxy(assert, {
|
|
713
722
|
get(target, prop) {
|
|
714
|
-
if (prop === 'matchSnapshot')
|
|
715
|
-
return (stepTestContext as any).matchSnapshot;
|
|
723
|
+
if (prop === 'matchSnapshot') return stepTestContext?.matchSnapshot;
|
|
716
724
|
if (prop === 'snapshot')
|
|
717
725
|
return (
|
|
718
726
|
valueOrOpts?: unknown,
|
|
@@ -726,7 +734,10 @@ export class TestExecutor extends EventEmitter {
|
|
|
726
734
|
message: `snapshot "${nameOrNothing}": value is falsy`,
|
|
727
735
|
});
|
|
728
736
|
const masked = self._applyMask(valueOrOpts, opts?.mask);
|
|
729
|
-
|
|
737
|
+
stepTestContext.matchSnapshot!(
|
|
738
|
+
masked,
|
|
739
|
+
nameOrNothing as string,
|
|
740
|
+
);
|
|
730
741
|
} else {
|
|
731
742
|
// Deferred: assert.snapshot() or assert.snapshot({mask})
|
|
732
743
|
const deferOpts =
|
|
@@ -763,8 +774,9 @@ export class TestExecutor extends EventEmitter {
|
|
|
763
774
|
);
|
|
764
775
|
|
|
765
776
|
// Execute the step (with optional retry loop)
|
|
766
|
-
const maxRetries =
|
|
767
|
-
|
|
777
|
+
const maxRetries = this.config.rerun?.enabled
|
|
778
|
+
? (this.config.rerun.maxRetries ?? DEFAULT_MAX_RETRIES)
|
|
779
|
+
: 0;
|
|
768
780
|
let result: unknown;
|
|
769
781
|
let lastError: Error | undefined;
|
|
770
782
|
|
|
@@ -797,7 +809,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
797
809
|
message: `snapshot "${stepName}": step returned a falsy value`,
|
|
798
810
|
});
|
|
799
811
|
const masked = self._applyMask(result, snapshotRequest.deferred.mask);
|
|
800
|
-
|
|
812
|
+
stepTestContext.matchSnapshot!(masked, stepName);
|
|
801
813
|
} else if (self.config.autoSnapshot && hasSnapshotTarget) {
|
|
802
814
|
// Auto-snapshot: capture result automatically, no assert.snapshot() needed
|
|
803
815
|
if (!result)
|
|
@@ -805,7 +817,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
805
817
|
message: `snapshot "${stepName}": step returned a falsy value`,
|
|
806
818
|
});
|
|
807
819
|
const masked = self._applyMask(result);
|
|
808
|
-
|
|
820
|
+
stepTestContext.matchSnapshot!(masked, stepName);
|
|
809
821
|
}
|
|
810
822
|
|
|
811
823
|
// Store result in real context
|
|
@@ -874,14 +886,14 @@ export class TestExecutor extends EventEmitter {
|
|
|
874
886
|
if (this.testContext && parentTestContext) {
|
|
875
887
|
await this.queue.add(async () => {
|
|
876
888
|
try {
|
|
877
|
-
await
|
|
889
|
+
await this.testContext!.test.call(
|
|
878
890
|
parentTestContext,
|
|
879
891
|
stepName,
|
|
880
892
|
async (stepT: unknown) => {
|
|
881
|
-
await executeStepFn(stepT);
|
|
893
|
+
await executeStepFn(stepT as ITestFrameworkContext);
|
|
882
894
|
},
|
|
883
895
|
);
|
|
884
|
-
} catch
|
|
896
|
+
} catch {
|
|
885
897
|
// Error already handled in executeStepFn, don't rethrow to break the queue
|
|
886
898
|
// The test framework will report it
|
|
887
899
|
}
|
|
@@ -891,15 +903,15 @@ export class TestExecutor extends EventEmitter {
|
|
|
891
903
|
await this.queue.add(async () => {
|
|
892
904
|
try {
|
|
893
905
|
await this.testContext!.test(stepName, async (stepT: unknown) => {
|
|
894
|
-
await executeStepFn(stepT);
|
|
906
|
+
await executeStepFn(stepT as ITestFrameworkContext);
|
|
895
907
|
});
|
|
896
|
-
} catch
|
|
908
|
+
} catch {
|
|
897
909
|
// Error already handled in executeStepFn, don't rethrow to break the queue
|
|
898
910
|
}
|
|
899
911
|
});
|
|
900
912
|
} else {
|
|
901
913
|
// No test context or not at top level
|
|
902
|
-
await this.queue.add(executeStepFn);
|
|
914
|
+
await this.queue.add(executeStepFn as () => Promise<void>);
|
|
903
915
|
}
|
|
904
916
|
}
|
|
905
917
|
|
|
@@ -1097,7 +1109,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
1097
1109
|
* Type-safe event emitter
|
|
1098
1110
|
*/
|
|
1099
1111
|
on<E extends keyof ITestEvents>(event: E, handler: ITestEvents[E]): this {
|
|
1100
|
-
return super.on(event, handler
|
|
1112
|
+
return super.on(event, handler);
|
|
1101
1113
|
}
|
|
1102
1114
|
|
|
1103
1115
|
emit<E extends keyof ITestEvents>(event: E, ...args: Parameters<ITestEvents[E]>): boolean {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feasibleone/blong-chain",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Parallel testing with automatic dependencies",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"blong",
|
|
@@ -23,12 +23,14 @@
|
|
|
23
23
|
"@rushstack/heft-typescript-plugin": "^1.3.1",
|
|
24
24
|
"@types/node": "^24",
|
|
25
25
|
"tap": "^21.6.3",
|
|
26
|
-
"typescript": "^5.9.3"
|
|
26
|
+
"typescript": "^5.9.3",
|
|
27
|
+
"@feasibleone/blong-dev": "1.0.0"
|
|
27
28
|
},
|
|
28
29
|
"scripts": {
|
|
29
30
|
"build": "heft build --clean",
|
|
30
31
|
"ci-all": "npm run ci-unit && npm run ci-examples",
|
|
31
32
|
"ci-examples": "npm run test:examples",
|
|
33
|
+
"ci-lint": "blong-dev lint",
|
|
32
34
|
"ci-publish": "node ../../common/scripts/install-run-rush-pnpm.js publish --access public --provenance",
|
|
33
35
|
"ci-unit": "npm run test;./test-examples-ci.sh",
|
|
34
36
|
"test": "tap *.test.ts",
|
package/test-types.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import nodeAssert from 'node:assert';
|
|
2
|
+
|
|
3
|
+
declare module 'node:assert' {
|
|
4
|
+
function snapshot(value?: unknown, name?: string, opts?: {mask?: string[]}): void;
|
|
5
|
+
}
|
|
6
|
+
|
|
1
7
|
/**
|
|
2
8
|
* Type definitions for the Blong parallel test framework
|
|
3
9
|
*/
|
|
@@ -37,7 +43,10 @@ export interface ITestContext {
|
|
|
37
43
|
* @param context - Test context with $meta and outputs from previous steps
|
|
38
44
|
* @returns The output to be stored in context under the function's name
|
|
39
45
|
*/
|
|
40
|
-
export type StepFunction = (
|
|
46
|
+
export type StepFunction = (
|
|
47
|
+
assert: typeof nodeAssert,
|
|
48
|
+
context: ITestContext,
|
|
49
|
+
) => unknown | Promise<unknown>;
|
|
41
50
|
|
|
42
51
|
/**
|
|
43
52
|
* A snapshot checkpoint — an array of step-name strings placed inside the
|
|
@@ -78,6 +87,8 @@ export interface IMeta {
|
|
|
78
87
|
export interface ITestFrameworkContext {
|
|
79
88
|
/** Creates a nested test scope for proper indentation */
|
|
80
89
|
test: (name: string, fn: (t: unknown) => void | Promise<void>) => unknown;
|
|
90
|
+
/** Captures a snapshot of a value under the given name */
|
|
91
|
+
matchSnapshot?: (value: unknown, name: string) => void;
|
|
81
92
|
}
|
|
82
93
|
|
|
83
94
|
// ============================================================================
|
package/dist/snapshot.d.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Snapshot helper for TAP-based tests.
|
|
3
|
-
*
|
|
4
|
-
* Provides a thin wrapper around `t.matchSnapshot()` that applies flat
|
|
5
|
-
* dot-path masking before comparison, eliminating the need for manual
|
|
6
|
-
* normalisation (e.g. replacing dynamic ports or ULIDs) in every test file.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
*
|
|
10
|
-
* ```typescript
|
|
11
|
-
* import {snapshot} from '@feasibleone/blong-chain/snapshot';
|
|
12
|
-
*
|
|
13
|
-
* t.test('my test', async t => {
|
|
14
|
-
* const result = await myApiCall();
|
|
15
|
-
* snapshot(t, result, 'my-test', {mask: ['createdAt', 'user.userId']});
|
|
16
|
-
* });
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* The `mask` option accepts an array of dot-delimited paths. Each matching
|
|
20
|
-
* leaf value is replaced with the string `'<masked>'` before the snapshot is
|
|
21
|
-
* taken. Glob-style wildcards (`*.field`) are not yet supported.
|
|
22
|
-
*/
|
|
23
|
-
/** Minimal interface for a TAP test context (compatible with tap, node:test, etc.) */
|
|
24
|
-
export interface ISnapshotContext {
|
|
25
|
-
matchSnapshot(value: unknown, name?: string): void;
|
|
26
|
-
}
|
|
27
|
-
/** Options accepted by the {@link snapshot} helper */
|
|
28
|
-
export interface ISnapshotOptions {
|
|
29
|
-
/**
|
|
30
|
-
* Dot-delimited paths whose leaf values should be replaced with
|
|
31
|
-
* `'<masked>'` before comparison.
|
|
32
|
-
*
|
|
33
|
-
* Examples:
|
|
34
|
-
* - `'completedAt'` — top-level field
|
|
35
|
-
* - `'user.userId'` — nested field
|
|
36
|
-
* - `'createParty.partyId'` — step-scoped path in a chain context
|
|
37
|
-
*/
|
|
38
|
-
mask?: string[];
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Take a snapshot of `value` using the TAP test context `t`.
|
|
42
|
-
*
|
|
43
|
-
* Dynamic fields listed in `opts.mask` are replaced with `'<masked>'` so
|
|
44
|
-
* that timestamps, IDs, and other non-deterministic values do not cause false
|
|
45
|
-
* failures on subsequent runs.
|
|
46
|
-
*/
|
|
47
|
-
export declare function snapshot(t: ISnapshotContext, value: unknown, name: string, opts?: ISnapshotOptions): void;
|
|
48
|
-
/**
|
|
49
|
-
* Return a deep clone of `value` with the specified dot-path fields replaced
|
|
50
|
-
* by `'<masked>'`.
|
|
51
|
-
*
|
|
52
|
-
* Only JSON-serialisable values are supported (the clone is performed via
|
|
53
|
-
* `JSON.parse(JSON.stringify(value))`).
|
|
54
|
-
*/
|
|
55
|
-
export declare function maskPaths(value: unknown, paths: string[]): unknown;
|
|
56
|
-
//# sourceMappingURL=snapshot.d.ts.map
|
package/dist/snapshot.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC7B,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtD;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC7B;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACpB,CAAC,EAAE,gBAAgB,EACnB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,gBAAqB,GAC5B,IAAI,CAGN;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAalE"}
|