@feasibleone/blong-chain 1.9.0 → 1.10.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 +7 -0
- package/README.md +67 -47
- package/dist/examples/demo.test.d.ts +6 -0
- package/dist/examples/demo.test.d.ts.map +1 -0
- package/dist/examples/demo.test.js.map +1 -0
- package/dist/examples/error-demo.test.d.ts +14 -0
- package/dist/examples/error-demo.test.d.ts.map +1 -0
- package/dist/examples/error-demo.test.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +915 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +14 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js.map +1 -0
- package/dist/package.json +39 -0
- package/dist/showcase.test.d.ts +19 -0
- package/dist/showcase.test.d.ts.map +1 -0
- package/dist/showcase.test.js.map +1 -0
- 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 +379 -0
- package/dist/test-types.d.ts.map +1 -0
- package/dist/test-types.js +2 -0
- package/dist/test-types.js.map +1 -0
- package/dist/timing-analysis.test.d.ts +2 -0
- package/dist/timing-analysis.test.d.ts.map +1 -0
- package/dist/timing-analysis.test.js.map +1 -0
- package/index.ts +14 -16
- package/package.json +3 -3
- package/test-types.ts +11 -9
|
@@ -0,0 +1,379 @@
|
|
|
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
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Type definitions for the Blong parallel test framework
|
|
9
|
+
*/
|
|
10
|
+
/** Minimal logger interface compatible with the framework's ILogger */
|
|
11
|
+
export interface ITestLogger {
|
|
12
|
+
trace?: (...args: unknown[]) => void;
|
|
13
|
+
debug?: (...args: unknown[]) => void;
|
|
14
|
+
info?: (...args: unknown[]) => void;
|
|
15
|
+
warn?: (...args: unknown[]) => void;
|
|
16
|
+
error?: (...args: unknown[]) => void;
|
|
17
|
+
fatal?: (...args: unknown[]) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Context object passed to test step functions.
|
|
21
|
+
* All properties except $meta are thenable proxies that must be awaited.
|
|
22
|
+
*/
|
|
23
|
+
export interface ITestContext {
|
|
24
|
+
/** Meta information - always available directly (not a thenable proxy) */
|
|
25
|
+
$meta: IMeta;
|
|
26
|
+
/** Dynamic properties added by completed steps - accessed via thenable proxies */
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A single test step function
|
|
31
|
+
* @param assert - Assertion functions from node:assert or tap
|
|
32
|
+
* @param context - Test context with $meta and outputs from previous steps
|
|
33
|
+
* @returns The output to be stored in context under the function's name
|
|
34
|
+
*/
|
|
35
|
+
export type StepFunction = (assert: typeof nodeAssert, context: ITestContext) => unknown | Promise<unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* A snapshot marker — an array of step-name strings placed inside the
|
|
38
|
+
* steps array. At runtime, when the executor encounters it the relevant steps
|
|
39
|
+
* are awaited and their results 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 (the empty array is the spelling;
|
|
44
|
+
* there is no symbol for it, because inventing one would touch every
|
|
45
|
+
* call site for no gain)
|
|
46
|
+
*
|
|
47
|
+
* The array may carry an optional `.name` to give the snapshot a stable name:
|
|
48
|
+
* ```
|
|
49
|
+
* const marker = Object.assign(['*'], {name: 'provisioning-complete'});
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export type SnapshotMarker = string[] & {
|
|
53
|
+
name?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Array of test steps. May contain step functions, nested step groups, or
|
|
57
|
+
* snapshot markers (string arrays; `[]` being a sync barrier).
|
|
58
|
+
*/
|
|
59
|
+
export type StepArray = (StepFunction | StepArray | SnapshotMarker)[] & {
|
|
60
|
+
name?: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Meta information passed through test execution
|
|
64
|
+
*/
|
|
65
|
+
export interface IMeta {
|
|
66
|
+
/** Optional concurrency limit for parallel step execution */
|
|
67
|
+
concurrency?: number;
|
|
68
|
+
/** Additional metadata properties */
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Test framework context (e.g., from node:test or tap)
|
|
73
|
+
* Enables nested test output with automatic indentation
|
|
74
|
+
*/
|
|
75
|
+
export interface ITestFrameworkContext {
|
|
76
|
+
/** Creates a nested test scope for proper indentation */
|
|
77
|
+
test: (name: string, fn: (t: unknown) => void | Promise<void>) => unknown;
|
|
78
|
+
/** Captures a snapshot of a value under the given name */
|
|
79
|
+
matchSnapshot?: (value: unknown, name: string) => void;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A thenable proxy that acts as both a Promise and supports property access.
|
|
83
|
+
* Used for automatic dependency detection in test steps.
|
|
84
|
+
*
|
|
85
|
+
* Note: This is a conceptual type. The actual implementation uses Proxy objects
|
|
86
|
+
* that intercept property access. TypeScript cannot perfectly represent this pattern.
|
|
87
|
+
*/
|
|
88
|
+
export type IThenableProxy<T = unknown> = Promise<T> & {
|
|
89
|
+
/** Access nested properties, returning more thenable proxies */
|
|
90
|
+
[key: string]: IThenableProxy<unknown>;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Promise resolution tracking for a specific context path
|
|
94
|
+
*/
|
|
95
|
+
export interface IPromiseEntry<T = unknown> {
|
|
96
|
+
/** The actual promise that resolves when the step completes */
|
|
97
|
+
promise: Promise<T>;
|
|
98
|
+
/** Function to resolve the promise with a value */
|
|
99
|
+
resolve: (value: T) => void;
|
|
100
|
+
/** Function to reject the promise with an error */
|
|
101
|
+
reject: (error: Error) => void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Complete definition of a test step including metadata
|
|
105
|
+
*/
|
|
106
|
+
export interface IStepDefinition {
|
|
107
|
+
/** The step function to execute */
|
|
108
|
+
fn: StepFunction;
|
|
109
|
+
/** The step's display name (function name or custom name) */
|
|
110
|
+
name: string;
|
|
111
|
+
/** Source code location where this step was defined */
|
|
112
|
+
sourceLocation: ISourceLocation;
|
|
113
|
+
/** Parent group hierarchy */
|
|
114
|
+
groupPath: string[];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Source code location information
|
|
118
|
+
*/
|
|
119
|
+
export interface ISourceLocation {
|
|
120
|
+
/** Absolute file path */
|
|
121
|
+
file: string;
|
|
122
|
+
/** Line number (1-indexed) */
|
|
123
|
+
line: number;
|
|
124
|
+
/** Column number (1-indexed) */
|
|
125
|
+
column: number;
|
|
126
|
+
/** Optional code snippet for context */
|
|
127
|
+
snippet?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Graph structure tracking dependencies between test steps
|
|
131
|
+
*/
|
|
132
|
+
export interface IDependencyGraph {
|
|
133
|
+
/** All steps in the test as graph nodes */
|
|
134
|
+
nodes: Map<string, IDependencyNode>;
|
|
135
|
+
/** Dependency relationships between steps */
|
|
136
|
+
edges: IDependencyEdge[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* A single node in the dependency graph
|
|
140
|
+
*/
|
|
141
|
+
export interface IDependencyNode {
|
|
142
|
+
/** Step name (unique identifier) */
|
|
143
|
+
stepName: string;
|
|
144
|
+
/** Hierarchy of group names this step belongs to */
|
|
145
|
+
groupPath: string[];
|
|
146
|
+
/** When step execution started (timestamp) */
|
|
147
|
+
startTime?: number;
|
|
148
|
+
/** When step execution finished (timestamp) */
|
|
149
|
+
endTime?: number;
|
|
150
|
+
/** Current execution status */
|
|
151
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
152
|
+
/** Error if step failed */
|
|
153
|
+
error?: Error;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* An edge representing a dependency relationship
|
|
157
|
+
*/
|
|
158
|
+
export interface IDependencyEdge {
|
|
159
|
+
/** Step that depends on another step */
|
|
160
|
+
from: string;
|
|
161
|
+
/** Step being depended on */
|
|
162
|
+
to: string;
|
|
163
|
+
/** Which context property/path was accessed */
|
|
164
|
+
property: string;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Overall test execution progress
|
|
168
|
+
*/
|
|
169
|
+
export interface ITestProgress {
|
|
170
|
+
/** Test name */
|
|
171
|
+
testName: string;
|
|
172
|
+
/** Test start time */
|
|
173
|
+
startTime: number;
|
|
174
|
+
/** Test end time (when all steps complete) */
|
|
175
|
+
endTime?: number;
|
|
176
|
+
/** Overall test status */
|
|
177
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
178
|
+
/** Total number of steps in the test */
|
|
179
|
+
totalSteps: number;
|
|
180
|
+
/** Number of completed steps */
|
|
181
|
+
completedSteps: number;
|
|
182
|
+
/** Number of failed steps */
|
|
183
|
+
failedSteps: number;
|
|
184
|
+
/** Progress details for each step */
|
|
185
|
+
steps: Map<string, IStepProgress>;
|
|
186
|
+
/** Group hierarchy information */
|
|
187
|
+
groups: IGroupProgress[];
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Progress information for a single step
|
|
191
|
+
*/
|
|
192
|
+
export interface IStepProgress {
|
|
193
|
+
/** Step name */
|
|
194
|
+
stepName: string;
|
|
195
|
+
/** Display name (may differ from stepName for reused tests) */
|
|
196
|
+
displayName: string;
|
|
197
|
+
/** Group hierarchy path */
|
|
198
|
+
groupPath: string[];
|
|
199
|
+
/** Current step status */
|
|
200
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
201
|
+
/** When step started executing */
|
|
202
|
+
startTime?: number;
|
|
203
|
+
/** When step finished executing */
|
|
204
|
+
endTime?: number;
|
|
205
|
+
/** Total duration (end - start) */
|
|
206
|
+
duration?: number;
|
|
207
|
+
/** Time spent waiting in queue before execution */
|
|
208
|
+
queueTime?: number;
|
|
209
|
+
/** Time spent actually executing the step function */
|
|
210
|
+
executionTime?: number;
|
|
211
|
+
/** Time spent waiting for dependencies to resolve */
|
|
212
|
+
waitTime?: number;
|
|
213
|
+
/** Steps this step depends on */
|
|
214
|
+
dependencies: string[];
|
|
215
|
+
/** Steps that depend on this step */
|
|
216
|
+
dependents: string[];
|
|
217
|
+
/** Source code location */
|
|
218
|
+
sourceLocation?: ISourceLocation;
|
|
219
|
+
/** Step output/result */
|
|
220
|
+
result?: unknown;
|
|
221
|
+
/** Error information if step failed */
|
|
222
|
+
error?: IStepError;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Error information with enhanced context
|
|
226
|
+
*/
|
|
227
|
+
export interface IStepError {
|
|
228
|
+
/** Error message */
|
|
229
|
+
message: string;
|
|
230
|
+
/** Stack trace */
|
|
231
|
+
stack: string;
|
|
232
|
+
/** Context snapshot at time of failure */
|
|
233
|
+
context: Record<string, unknown>;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Progress information for a group of steps
|
|
237
|
+
*/
|
|
238
|
+
export interface IGroupProgress {
|
|
239
|
+
/** Group name */
|
|
240
|
+
groupName: string;
|
|
241
|
+
/** Hierarchy path */
|
|
242
|
+
path: string[];
|
|
243
|
+
/** Group status */
|
|
244
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
245
|
+
/** Step names in this group */
|
|
246
|
+
steps: string[];
|
|
247
|
+
/** Total steps in group */
|
|
248
|
+
totalSteps: number;
|
|
249
|
+
/** Completed steps in group */
|
|
250
|
+
completedSteps: number;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Detailed timing information for a step
|
|
254
|
+
*/
|
|
255
|
+
export interface IStepLatency {
|
|
256
|
+
/** Step name */
|
|
257
|
+
stepName: string;
|
|
258
|
+
/** When step was added to queue */
|
|
259
|
+
queuedAt: number;
|
|
260
|
+
/** When step execution started */
|
|
261
|
+
startedAt?: number;
|
|
262
|
+
/** When step execution completed */
|
|
263
|
+
completedAt?: number;
|
|
264
|
+
/** Time from queue entry to execution start */
|
|
265
|
+
queueTime: number;
|
|
266
|
+
/** Time spent waiting for dependencies */
|
|
267
|
+
waitTime: number;
|
|
268
|
+
/** Actual execution time (excludes wait time) */
|
|
269
|
+
executionTime: number;
|
|
270
|
+
/** Total time from queue to completion */
|
|
271
|
+
totalTime: number;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Aggregate latency metrics for entire test
|
|
275
|
+
*/
|
|
276
|
+
export interface ITestLatency {
|
|
277
|
+
/** Test name */
|
|
278
|
+
testName: string;
|
|
279
|
+
/** Total wall-clock duration */
|
|
280
|
+
totalDuration: number;
|
|
281
|
+
/** Latency details for each step */
|
|
282
|
+
steps: Map<string, IStepLatency>;
|
|
283
|
+
/** Steps on the critical path (longest dependency chain) */
|
|
284
|
+
criticalPath: string[];
|
|
285
|
+
/** Ratio of parallel efficiency (total step time / wall clock time) */
|
|
286
|
+
parallelEfficiency: number;
|
|
287
|
+
/** Steps that blocked the most other steps */
|
|
288
|
+
bottlenecks: Array<{
|
|
289
|
+
stepName: string;
|
|
290
|
+
executionTime: number;
|
|
291
|
+
blockedSteps: string[];
|
|
292
|
+
}>;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Event emitter interface for progress notifications
|
|
296
|
+
*/
|
|
297
|
+
export interface ITestEvents {
|
|
298
|
+
'test:start': (progress: ITestProgress) => void;
|
|
299
|
+
'test:end': (progress: ITestProgress) => void;
|
|
300
|
+
'step:start': (stepName: string, progress: IStepProgress) => void;
|
|
301
|
+
'step:end': (stepName: string, progress: IStepProgress) => void;
|
|
302
|
+
'step:error': (stepName: string, error: Error, progress: IStepProgress) => void;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Configuration for the parallel test executor
|
|
306
|
+
*/
|
|
307
|
+
export interface ITestExecutorConfig {
|
|
308
|
+
/** Maximum number of steps to run in parallel */
|
|
309
|
+
concurrency?: number;
|
|
310
|
+
/** Whether to capture stack traces (performance impact) */
|
|
311
|
+
captureStackTraces?: boolean;
|
|
312
|
+
/** Test framework to use (tap, node:test, etc.) */
|
|
313
|
+
framework?: unknown;
|
|
314
|
+
/** Logger instance for reporting step failures */
|
|
315
|
+
log?: ITestLogger;
|
|
316
|
+
/**
|
|
317
|
+
* Chain-level mask paths. Applied to ALL snapshot operations in this chain:
|
|
318
|
+
* `autoSnapshot`, `assert.snapshot()`, and snapshot markers.
|
|
319
|
+
*
|
|
320
|
+
* Supports:
|
|
321
|
+
* - Simple name: `'id'` — masks the `id` field in the snapshotted value
|
|
322
|
+
* - Dot-path: `'user.id'` — masks a nested field
|
|
323
|
+
* - Wildcard prefix: `'*.id'` — masks `id` inside every direct child of the
|
|
324
|
+
* snapshotted object (useful for context-level snapshots where each child
|
|
325
|
+
* is a step result)
|
|
326
|
+
*
|
|
327
|
+
* Per-call `{mask: [...]}` options are merged on top of this chain-level mask.
|
|
328
|
+
*/
|
|
329
|
+
mask?: string[];
|
|
330
|
+
/**
|
|
331
|
+
* When `true`, automatically snapshot every step's return value under the
|
|
332
|
+
* step's function name after it completes. The chain-level `mask` is applied
|
|
333
|
+
* before snapshotting. No `assert.snapshot()` calls are needed in step
|
|
334
|
+
* functions — the framework captures everything automatically.
|
|
335
|
+
*
|
|
336
|
+
* Requires a TAP (or compatible) test context to be passed to `execute()`.
|
|
337
|
+
*/
|
|
338
|
+
autoSnapshot?: boolean;
|
|
339
|
+
/**
|
|
340
|
+
* @deprecated Use `mask` (string array) instead.
|
|
341
|
+
* Custom masking function for advanced scenarios not covered by `mask`.
|
|
342
|
+
* When both are provided, `maskFn` is used and `mask` is passed to it.
|
|
343
|
+
*/
|
|
344
|
+
maskFn?: (value: unknown, paths: string[]) => unknown;
|
|
345
|
+
/**
|
|
346
|
+
* Automatic rerun configuration for failing steps (Phase 1).
|
|
347
|
+
*
|
|
348
|
+
* When enabled, a step that throws an error is retried up to `maxRetries`
|
|
349
|
+
* times before being reported as failed. This is useful for flaky tests
|
|
350
|
+
* caused by race conditions or transient network issues.
|
|
351
|
+
*
|
|
352
|
+
* Phase 2 (diagnostic attachment) is not yet implemented.
|
|
353
|
+
*/
|
|
354
|
+
rerun?: {
|
|
355
|
+
/** Whether to enable the retry mechanism (default: false) */
|
|
356
|
+
enabled?: boolean;
|
|
357
|
+
/**
|
|
358
|
+
* Maximum number of retry attempts per failing step (default: 1).
|
|
359
|
+
* Set to 0 to detect failures without retrying.
|
|
360
|
+
*/
|
|
361
|
+
maxRetries?: number;
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Test executor interface
|
|
366
|
+
*/
|
|
367
|
+
export interface ITestExecutor {
|
|
368
|
+
/** Execute test steps */
|
|
369
|
+
execute(steps: StepArray, $meta: IMeta, testContext?: ITestFrameworkContext): Promise<void>;
|
|
370
|
+
/** Get current progress snapshot */
|
|
371
|
+
getProgress(): ITestProgress;
|
|
372
|
+
/** Get dependency graph */
|
|
373
|
+
getDependencyGraph(): IDependencyGraph;
|
|
374
|
+
/** Get latency metrics */
|
|
375
|
+
getLatencyReport(): ITestLatency;
|
|
376
|
+
/** Register event listener */
|
|
377
|
+
on<E extends keyof ITestEvents>(event: E, handler: ITestEvents[E]): void;
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=test-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-types.d.ts","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-types.js","sourceRoot":"","sources":["../test-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-analysis.test.d.ts","sourceRoot":"","sources":["../timing-analysis.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing-analysis.test.js","sourceRoot":"","sources":["../timing-analysis.test.ts"],"names":[],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -371,7 +371,7 @@ function captureSourceLocation(): ISourceLocation {
|
|
|
371
371
|
const DEFAULT_MAX_RETRIES = 1;
|
|
372
372
|
|
|
373
373
|
// ============================================================================
|
|
374
|
-
// Masking helpers (also used by assert.snapshot and
|
|
374
|
+
// Masking helpers (also used by assert.snapshot and snapshot markers)
|
|
375
375
|
// ============================================================================
|
|
376
376
|
|
|
377
377
|
/**
|
|
@@ -542,13 +542,13 @@ export class TestExecutor extends EventEmitter {
|
|
|
542
542
|
): Promise<void> {
|
|
543
543
|
const stepPromises: Promise<void>[] = [];
|
|
544
544
|
const namedPromises = new Map<string, Promise<void>>();
|
|
545
|
-
let
|
|
545
|
+
let snapshotIndex = 0;
|
|
546
546
|
|
|
547
547
|
for (const step of steps) {
|
|
548
548
|
if (Array.isArray(step)) {
|
|
549
549
|
// Distinguish by element type:
|
|
550
550
|
// [] empty array → sync barrier (existing behaviour)
|
|
551
|
-
// ['*'] / ['s1','s2'] → snapshot
|
|
551
|
+
// ['*'] / ['s1','s2'] → snapshot marker
|
|
552
552
|
// [fn, ...] nested → nested step group (existing behaviour)
|
|
553
553
|
if (step.length === 0) {
|
|
554
554
|
// Sync barrier — wait for all parallel steps in this batch
|
|
@@ -558,37 +558,35 @@ export class TestExecutor extends EventEmitter {
|
|
|
558
558
|
}
|
|
559
559
|
|
|
560
560
|
if (step.every(s => typeof s === 'string')) {
|
|
561
|
-
// Snapshot
|
|
562
|
-
const
|
|
561
|
+
// Snapshot marker: await the relevant steps, then snapshot
|
|
562
|
+
const marker = step as unknown as string[];
|
|
563
563
|
|
|
564
|
-
if (
|
|
564
|
+
if (marker.length === 1 && marker[0] === '*') {
|
|
565
565
|
// ['*'] — wait for entire current batch
|
|
566
566
|
await Promise.all(stepPromises);
|
|
567
567
|
stepPromises.length = 0;
|
|
568
568
|
} else {
|
|
569
569
|
// ['step1','step2'] — wait only for the named steps
|
|
570
|
-
const namedToWait =
|
|
570
|
+
const namedToWait = marker
|
|
571
571
|
.map(name => namedPromises.get(name))
|
|
572
572
|
.filter((p): p is Promise<void> => p !== undefined);
|
|
573
573
|
await Promise.all(namedToWait);
|
|
574
574
|
// stepPromises is NOT cleared — other steps keep running
|
|
575
575
|
}
|
|
576
576
|
const cpName =
|
|
577
|
-
(
|
|
578
|
-
(
|
|
579
|
-
? `context`
|
|
580
|
-
: checkpoint.join('-'));
|
|
577
|
+
(marker as {name?: string}).name ??
|
|
578
|
+
(marker.length === 1 && marker[0] === '*' ? `context` : marker.join('-'));
|
|
581
579
|
// Disambiguate when the same name is used more than once
|
|
582
580
|
const snapshotName =
|
|
583
|
-
|
|
584
|
-
|
|
581
|
+
snapshotIndex === 0 ? cpName : `${cpName}-${snapshotIndex}`;
|
|
582
|
+
snapshotIndex++;
|
|
585
583
|
|
|
586
584
|
const stepsToSnapshot =
|
|
587
|
-
|
|
585
|
+
marker.length === 1 && marker[0] === '*'
|
|
588
586
|
? [...this.progress.steps.entries()]
|
|
589
587
|
.filter(([, s]) => s.status === 'completed')
|
|
590
588
|
.map(([name]) => name)
|
|
591
|
-
:
|
|
589
|
+
: marker.filter(name =>
|
|
592
590
|
Object.prototype.hasOwnProperty.call(this.realContext, name),
|
|
593
591
|
);
|
|
594
592
|
|
|
@@ -940,7 +938,7 @@ export class TestExecutor extends EventEmitter {
|
|
|
940
938
|
|
|
941
939
|
for (const step of steps) {
|
|
942
940
|
if (Array.isArray(step)) {
|
|
943
|
-
// Skip
|
|
941
|
+
// Skip snapshot markers (string-only arrays) — they are not steps
|
|
944
942
|
if (step.every(s => typeof s === 'string')) continue;
|
|
945
943
|
// Recursively collect from nested step groups
|
|
946
944
|
const nested = this._collectStepNames(step as StepArray);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feasibleone/blong-chain",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "Parallel testing with automatic dependencies",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"blong",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@types/node": "^24",
|
|
25
25
|
"tap": "^21.6.3",
|
|
26
26
|
"typescript": "^6.0.3",
|
|
27
|
-
"@feasibleone/blong-dev": "1.
|
|
27
|
+
"@feasibleone/blong-dev": "1.6.0"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "heft build --clean",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"ci-lint": "blong-dev lint",
|
|
34
34
|
"ci-publish": "node ../../common/scripts/install-run-rush-pnpm.js publish --access public --provenance",
|
|
35
35
|
"ci-test": "blong-dev test '*.test.ts';./test-examples-ci.sh",
|
|
36
|
-
"test": "
|
|
36
|
+
"test": "blong-dev test '*.test.ts';./test-examples-ci.sh",
|
|
37
37
|
"test:examples": "node --test dist/examples/*.test.js"
|
|
38
38
|
}
|
|
39
39
|
}
|
package/test-types.ts
CHANGED
|
@@ -49,26 +49,28 @@ export type StepFunction = (
|
|
|
49
49
|
) => unknown | Promise<unknown>;
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
|
-
* A snapshot
|
|
53
|
-
* steps array. At runtime, when the executor encounters it the
|
|
54
|
-
*
|
|
52
|
+
* A snapshot marker — an array of step-name strings placed inside the
|
|
53
|
+
* steps array. At runtime, when the executor encounters it the relevant steps
|
|
54
|
+
* are awaited and their results snapshotted into the TAP context.
|
|
55
55
|
*
|
|
56
56
|
* - `['*']` — snapshot ALL completed steps' results into one context object
|
|
57
57
|
* - `['step1', 'step2']` — snapshot only those specific steps
|
|
58
|
-
* - `[]` — sync barrier only, no snapshot (
|
|
58
|
+
* - `[]` — sync barrier only, no snapshot (the empty array is the spelling;
|
|
59
|
+
* there is no symbol for it, because inventing one would touch every
|
|
60
|
+
* call site for no gain)
|
|
59
61
|
*
|
|
60
62
|
* The array may carry an optional `.name` to give the snapshot a stable name:
|
|
61
63
|
* ```
|
|
62
|
-
* const
|
|
64
|
+
* const marker = Object.assign(['*'], {name: 'provisioning-complete'});
|
|
63
65
|
* ```
|
|
64
66
|
*/
|
|
65
|
-
export type
|
|
67
|
+
export type SnapshotMarker = string[] & {name?: string};
|
|
66
68
|
|
|
67
69
|
/**
|
|
68
70
|
* Array of test steps. May contain step functions, nested step groups, or
|
|
69
|
-
*
|
|
71
|
+
* snapshot markers (string arrays; `[]` being a sync barrier).
|
|
70
72
|
*/
|
|
71
|
-
export type StepArray = (StepFunction | StepArray |
|
|
73
|
+
export type StepArray = (StepFunction | StepArray | SnapshotMarker)[] & {name?: string};
|
|
72
74
|
|
|
73
75
|
/**
|
|
74
76
|
* Meta information passed through test execution
|
|
@@ -370,7 +372,7 @@ export interface ITestExecutorConfig {
|
|
|
370
372
|
log?: ITestLogger;
|
|
371
373
|
/**
|
|
372
374
|
* Chain-level mask paths. Applied to ALL snapshot operations in this chain:
|
|
373
|
-
* `autoSnapshot`, `assert.snapshot()`, and
|
|
375
|
+
* `autoSnapshot`, `assert.snapshot()`, and snapshot markers.
|
|
374
376
|
*
|
|
375
377
|
* Supports:
|
|
376
378
|
* - Simple name: `'id'` — masks the `id` field in the snapshotted value
|