@feasibleone/blong-chain 1.10.0 → 1.11.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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.11.0](https://github.com/feasibleone/blong/compare/blong-chain-v1.10.0...blong-chain-v1.11.0) (2026-09-26)
4
+
5
+
6
+ ### Features
7
+
8
+ * progress points in test reports ([fb73036](https://github.com/feasibleone/blong/commit/fb730360877eb371ab3d1603ae7bf35976c170dc))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * misc CI failures ([60689af](https://github.com/feasibleone/blong/commit/60689af66dc246ef8f88fef8edbd2b8a16a6c4d9))
14
+
3
15
  ## [1.10.0](https://github.com/feasibleone/blong/compare/blong-chain-v1.9.0...blong-chain-v1.10.0) (2026-09-24)
4
16
 
5
17
 
package/index.ts CHANGED
@@ -13,10 +13,12 @@
13
13
  import assert from 'node:assert';
14
14
  import {EventEmitter} from 'node:events';
15
15
  import PQueue from 'p-queue';
16
+ import {progressTree, reportProgress} from './progress.ts';
16
17
  import type {
17
18
  IDependencyEdge,
18
19
  IDependencyGraph,
19
20
  IMeta,
21
+ IProgressEntry,
20
22
  IPromiseEntry,
21
23
  ISourceLocation,
22
24
  IStepError,
@@ -651,6 +653,43 @@ export class TestExecutor extends EventEmitter {
651
653
  await Promise.all(stepPromises);
652
654
  }
653
655
 
656
+ /**
657
+ * The invocation's progress list as it stands, for a read at a step boundary (PRD R26/R27).
658
+ *
659
+ * The `$meta` object is the one every step of this run shares — the same object the steps
660
+ * destructure, and the one the handlers they call are handed.
661
+ */
662
+ private _progressList(): IProgressEntry[] | undefined {
663
+ const progress = (this.realContext.$meta as IMeta | undefined)?.progress;
664
+ return Array.isArray(progress) ? progress : undefined;
665
+ }
666
+
667
+ /**
668
+ * What was announced since `seen`, or `undefined` when nothing was (PRD R26/R27).
669
+ *
670
+ * Two shapes, and both are ordinary. A list that still holds what it held is *appended* to,
671
+ * and the difference between the two boundary reads is the step's own progress. A list that
672
+ * no longer begins with those entries was **replaced**: a step that resets it to scope its
673
+ * own assertions (`$meta.progress = []`, which is how a scenario keeps one step's
674
+ * checkpoints out of the next one's) then owns everything in the new list, including when it
675
+ * happens to end up as long as it started.
676
+ *
677
+ * Best-effort attribution, and deliberately so: steps that run in parallel share the one
678
+ * list, so a point announced while two of them were running is reported by whichever
679
+ * boundary read it. It is never lost, and a scenario whose steps are ordered by their
680
+ * dependencies — which is what a test that asserts on progress is — has one at a time.
681
+ */
682
+ private _announcedSince(seen: IProgressEntry[] | undefined): IProgressEntry[] | undefined {
683
+ const progress = this._progressList();
684
+ if (progress === undefined || progress.length === 0) {
685
+ return undefined;
686
+ }
687
+ if (!keeps(progress, seen)) {
688
+ return progress;
689
+ }
690
+ return progress.length > seen.length ? progress.slice(seen.length) : undefined;
691
+ }
692
+
654
693
  /**
655
694
  * Executes a single step function
656
695
  */
@@ -701,8 +740,6 @@ export class TestExecutor extends EventEmitter {
701
740
  // Wrap execution function for potential test context wrapping
702
741
  // When a TAP sub-test context is supplied, assert is augmented with:
703
742
  // assert.snapshot(value, 'name', opts?) — explicit snapshot
704
- // assert.snapshot({mask?: []}) — deferred: snapshot the
705
- // step's return value
706
743
  // assert.snapshot() — deferred, no extra mask
707
744
  // Deferred snapshots are taken after fn() returns, under the step name.
708
745
  // eslint-disable-next-line @typescript-eslint/no-this-alias
@@ -760,6 +797,7 @@ export class TestExecutor extends EventEmitter {
760
797
  this.graph.nodes.get(stepName)!.status = 'running';
761
798
  this.graph.nodes.get(stepName)!.startTime = latency.startedAt;
762
799
 
800
+ const progressBefore = this._progressList();
763
801
  this.emit('step:start', stepName, stepProgress);
764
802
 
765
803
  try {
@@ -821,6 +859,11 @@ export class TestExecutor extends EventEmitter {
821
859
  // Store result in real context
822
860
  this.realContext[stepName] = result;
823
861
 
862
+ // What this step announced, read at the boundary before the event so a
863
+ // listener that writes the step's result file sees it (see `step:end`).
864
+ const announced = this._announcedSince(progressBefore);
865
+ if (announced !== undefined) stepProgress.progress = announced;
866
+
824
867
  // Resolve all promises for this step
825
868
  this.promiseManager.resolveStep(stepName, result);
826
869
 
@@ -845,6 +888,24 @@ export class TestExecutor extends EventEmitter {
845
888
 
846
889
  this.progress.completedSteps++;
847
890
  this.emit('step:end', stepName, stepProgress);
891
+
892
+ // A point becomes a sub-test of the step that announced it, and a branch the
893
+ // sub-test holding the points taken inside it — a checkpoint as a *step* in
894
+ // the report, which is what "checkpoints drive test reporting" claims
895
+ // (PRD R26/R27). Rendered from the same entries `blong-allure` maps into
896
+ // Allure steps, so the two reports cannot describe different shapes.
897
+ //
898
+ // The context is checked the way the snapshot handling checks it, because
899
+ // the queue hands the task its own options where there is no test context:
900
+ // only a context that can nest a test gets progress nested in it.
901
+ if (
902
+ typeof stepTestContext?.test === 'function' &&
903
+ stepProgress.progress !== undefined
904
+ ) {
905
+ for (const node of progressTree(stepProgress.progress)) {
906
+ await reportProgress(stepTestContext, node);
907
+ }
908
+ }
848
909
  } catch (error) {
849
910
  // Handle error
850
911
  latency.completedAt = Date.now();
@@ -869,6 +930,12 @@ export class TestExecutor extends EventEmitter {
869
930
  this.graph.nodes.get(stepName)!.endTime = latency.completedAt;
870
931
  this.graph.nodes.get(stepName)!.error = error as Error;
871
932
 
933
+ // Kept even though the step failed, and especially then: what a failing step
934
+ // announced is the evidence a reader wants, and Allure renders it from here.
935
+ // The tap side leaves it out — sub-tests are not added to a step that threw.
936
+ const announcedOnFailure = this._announcedSince(progressBefore);
937
+ if (announcedOnFailure !== undefined) stepProgress.progress = announcedOnFailure;
938
+
872
939
  this.progress.failedSteps++;
873
940
  this.emit('step:error', stepName, error as Error, stepProgress);
874
941
  this.log?.error?.({err: error}, `step ${stepName} failed`);
@@ -1117,3 +1184,21 @@ export class TestExecutor extends EventEmitter {
1117
1184
 
1118
1185
  // Export all types
1119
1186
  export type * from './test-types.js';
1187
+ export {progressTree, reportProgress} from './progress.ts';
1188
+
1189
+ /**
1190
+ * Whether a progress list still holds what it held, entry for entry and by identity.
1191
+ *
1192
+ * Identity rather than equality, because the entries are objects the recorder pushed: a list
1193
+ * that kept them is one that was spread back with additions, and a list whose first entry is a
1194
+ * different object is one that was reset and announced afresh — which is the difference between
1195
+ * a step *adding* to the invocation's progress and *replacing* it.
1196
+ */
1197
+ const keeps = (
1198
+ progress: IProgressEntry[],
1199
+ seen: IProgressEntry[] | undefined,
1200
+ ): seen is IProgressEntry[] =>
1201
+ progress === seen ||
1202
+ (seen !== undefined &&
1203
+ progress.length >= seen.length &&
1204
+ seen.every((entry, at) => progress[at] === entry));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feasibleone/blong-chain",
3
- "version": "1.10.0",
3
+ "version": "1.11.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.6.0"
27
+ "@feasibleone/blong-dev": "1.7.0"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "heft build --clean",
@@ -34,6 +34,6 @@
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
36
  "test": "blong-dev test '*.test.ts';./test-examples-ci.sh",
37
- "test:examples": "node --test dist/examples/*.test.js"
37
+ "test:examples": "node --test examples/*.test.ts"
38
38
  }
39
39
  }
package/test-types.ts CHANGED
@@ -78,6 +78,15 @@ export type StepArray = (StepFunction | StepArray | SnapshotMarker)[] & {name?:
78
78
  export interface IMeta {
79
79
  /** Optional concurrency limit for parallel step execution */
80
80
  concurrency?: number;
81
+ /**
82
+ * What the invocation has announced so far, in the order it announced it (PRD R26/R27).
83
+ *
84
+ * The same array a framework dispatch keeps on its own `$meta`: the handlers a step calls
85
+ * are handed this object, so whatever they announce while it runs appears here — which is
86
+ * the only place the executor can read a step's progress from, and why it reads it at the
87
+ * step's boundaries.
88
+ */
89
+ progress?: IProgressEntry[];
81
90
  /** Additional metadata properties */
82
91
  [key: string]: unknown;
83
92
  }
@@ -89,6 +98,14 @@ export interface IMeta {
89
98
  export interface ITestFrameworkContext {
90
99
  /** Creates a nested test scope for proper indentation */
91
100
  test: (name: string, fn: (t: unknown) => void | Promise<void>) => unknown;
101
+ /**
102
+ * Writes a comment into the run's output (`# …` in TAP).
103
+ *
104
+ * What a point is reported as: a moment a step passed through is not a test,
105
+ * so it does not deserve a sub-test of its own — but it is what a reader
106
+ * wants to see beside the step, which is what a comment is.
107
+ */
108
+ comment?: (text: string) => void;
92
109
  /** Captures a snapshot of a value under the given name */
93
110
  matchSnapshot?: (value: unknown, name: string) => void;
94
111
  }
@@ -201,6 +218,71 @@ export interface IDependencyEdge {
201
218
  // Progress Tracking Types
202
219
  // ============================================================================
203
220
 
221
+ /**
222
+ * A branch as a progress entry names it (PRD R11/R26).
223
+ *
224
+ * Declared structurally here, matching the framework's own declaration in
225
+ * `core/blong/types.ts` the way {@link IMeta} does, because this package stands at the bottom
226
+ * of the dependency graph with `p-queue` as its only dependency. The names are what a report
227
+ * groups by; the position a log mints for itself is deliberately not here.
228
+ */
229
+ export interface IRegionMark {
230
+ /** What the branch was about, stable across runs. */
231
+ discriminator: string;
232
+ /** Every candidate considered, in evaluation order. */
233
+ candidates: string[];
234
+ /** The branch taken, or `none` when none of them matched. */
235
+ chosen: string;
236
+ }
237
+
238
+ /** A milestone an invocation announced (PRD R26). */
239
+ export interface IProgressPoint {
240
+ /** Which of the two shapes this entry is; one array holds both. */
241
+ kind: 'point';
242
+ /** Stable name of the moment, e.g. `total-calculated`. */
243
+ name: string;
244
+ /** What was true there; kept locally, exactly as a record keeps it. */
245
+ data?: unknown;
246
+ /** When it was announced, in epoch milliseconds. */
247
+ timestamp: number;
248
+ /** The branches it was announced *inside*, outermost first. */
249
+ regions?: IRegionMark[];
250
+ }
251
+
252
+ /** A branch the invocation took, in the same array as the points (PRD R11/R26). */
253
+ export interface IProgressRegion extends IRegionMark {
254
+ /** Which of the two shapes this entry is; one array holds both. */
255
+ kind: 'region';
256
+ /** The values the decision was made from. */
257
+ values: Record<string, unknown>;
258
+ /** The branches this one was itself taken inside, outermost first. */
259
+ regions?: IRegionMark[];
260
+ }
261
+
262
+ /** One entry of an invocation's `progress` list. */
263
+ export type IProgressEntry = IProgressPoint | IProgressRegion;
264
+
265
+ /**
266
+ * One node of the progress tree a report is drawn from (PRD R26/R27).
267
+ *
268
+ * `name` is the display name rather than the raw entry, so both renderers label a branch the
269
+ * same way: `<discriminator> = <chosen>` for a region, the point's own name for a point.
270
+ */
271
+ export interface IProgressNode {
272
+ /** What a report calls it: the point's name, or `<discriminator> = <chosen>`. */
273
+ name: string;
274
+ /** Which of the two shapes it is. */
275
+ kind: 'point' | 'region';
276
+ /**
277
+ * What the point announced, printed beside it when it is small enough to read.
278
+ *
279
+ * A branch carries none: what it has to say is its name.
280
+ */
281
+ data?: Record<string, unknown>;
282
+ /** The points and branches announced inside it, in the order they were announced. */
283
+ children: IProgressNode[];
284
+ }
285
+
204
286
  /**
205
287
  * Overall test execution progress
206
288
  */
@@ -259,6 +341,17 @@ export interface IStepProgress {
259
341
  result?: unknown;
260
342
  /** Error information if step failed */
261
343
  error?: IStepError;
344
+ /**
345
+ * What this step announced while it ran (PRD R26/R27), or absent when it announced
346
+ * nothing.
347
+ *
348
+ * Read from the invocation's own list at the step's boundaries rather than reported by the
349
+ * step: the handlers it called announced into the `$meta` every step shares, so the window
350
+ * is the only thing that attributes a point to the step that made it. A report draws these
351
+ * as the step's nested steps — a point as a step, a branch as the group of the points
352
+ * taken inside it.
353
+ */
354
+ progress?: IProgressEntry[];
262
355
  }
263
356
 
264
357
  /**
@@ -1,6 +0,0 @@
1
- /**
2
- * Demonstration of nested test context with automatic indentation
3
- * Run with: node --test demo.test.js
4
- */
5
- export {};
6
- //# sourceMappingURL=demo.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"demo.test.d.ts","sourceRoot":"","sources":["../../examples/demo.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"demo.test.js","sourceRoot":"","sources":["../../examples/demo.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Demonstration of error reporting in nested test contexts
3
- *
4
- * This file shows how errors are properly reported with indentation and tracking.
5
- * Run with: node --test error-demo.test.js
6
- *
7
- * You'll see that:
8
- * 1. Errors appear in the nested test output with proper indentation
9
- * 2. Error details (message, stack trace) are captured
10
- * 3. Progress tracking records all error information
11
- * 4. Other independent steps continue executing
12
- */
13
- export {};
14
- //# sourceMappingURL=error-demo.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-demo.test.d.ts","sourceRoot":"","sources":["../../examples/error-demo.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-demo.test.js","sourceRoot":"","sources":["../../examples/error-demo.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,87 +0,0 @@
1
- /**
2
- * Parallel Test Executor
3
- *
4
- * Implements the new parallel test execution framework with:
5
- * - Thenable proxies for automatic dependency detection
6
- * - Parallel execution with configurable concurrency
7
- * - Dependency graph tracking
8
- * - Live progress tracking
9
- * - Enhanced error reporting
10
- * - Latency metrics
11
- */
12
- import { EventEmitter } from 'node:events';
13
- import type { IDependencyGraph, IMeta, ITestEvents, ITestExecutorConfig, ITestFrameworkContext, ITestLatency, ITestProgress, StepArray } from './test-types.js';
14
- /**
15
- * Main test executor class
16
- */
17
- export declare class TestExecutor extends EventEmitter {
18
- private config;
19
- private queue;
20
- private dependencyTracker;
21
- private log?;
22
- private progress;
23
- private graph;
24
- private latencyMetrics;
25
- private realContext;
26
- private promiseManager;
27
- private testContext?;
28
- private stepNamesUsed;
29
- constructor(config?: ITestExecutorConfig);
30
- /**
31
- * Executes an array of test steps
32
- */
33
- execute(steps: StepArray, $meta: IMeta, testContext?: ITestFrameworkContext): Promise<void>;
34
- /**
35
- * Recursively executes steps, handling both functions and nested arrays
36
- */
37
- private _executeSteps;
38
- /**
39
- * Executes a single step function
40
- */
41
- private _executeStep;
42
- /**
43
- * Counts total number of steps (including nested)
44
- */
45
- private _countSteps;
46
- /**
47
- * Collects all step names (including nested)
48
- */
49
- private _collectStepNames;
50
- /**
51
- * Checks for duplicate step names and throws an error if found
52
- */
53
- private _checkForDuplicateStepName;
54
- /**
55
- * Applies the chain-level `mask` (and optional per-call `extraPaths`) to
56
- * `value`. Returns the original reference unchanged when no masking is
57
- * configured. Falls back to the deprecated `maskFn` when supplied.
58
- */
59
- private _applyMask;
60
- /**
61
- * Gets the current progress snapshot
62
- */
63
- getProgress(): ITestProgress;
64
- /**
65
- * Gets the dependency graph
66
- */
67
- getDependencyGraph(): IDependencyGraph;
68
- /**
69
- * Gets latency metrics
70
- */
71
- getLatencyReport(): ITestLatency;
72
- /**
73
- * Calculates the critical path (longest dependency chain)
74
- */
75
- private _calculateCriticalPath;
76
- /**
77
- * Identifies bottleneck steps that blocked many other steps
78
- */
79
- private _identifyBottlenecks;
80
- /**
81
- * Type-safe event emitter
82
- */
83
- on<E extends keyof ITestEvents>(event: E, handler: ITestEvents[E]): this;
84
- emit<E extends keyof ITestEvents>(event: E, ...args: Parameters<ITestEvents[E]>): boolean;
85
- }
86
- export type * from './test-types.js';
87
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAER,gBAAgB,EAChB,KAAK,EAOL,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EAEZ,aAAa,EAEb,SAAS,EAEZ,MAAM,iBAAiB,CAAC;AAsXzB;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,GAAG,CAAC,CAAc;IAG1B,OAAO,CAAC,QAAQ,CASd;IAGF,OAAO,CAAC,KAAK,CAGX;IAGF,OAAO,CAAC,cAAc,CAAmC;IAGzD,OAAO,CAAC,WAAW,CAA+B;IAGlD,OAAO,CAAC,cAAc,CAAiB;IAGvC,OAAO,CAAC,WAAW,CAAC,CAAwB;IAG5C,OAAO,CAAC,aAAa,CAAqB;gBAE9B,MAAM,GAAE,mBAAwB;IAqB5C;;OAEG;IACG,OAAO,CACT,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,EACZ,WAAW,CAAC,EAAE,qBAAqB,GACpC,OAAO,CAAC,IAAI,CAAC;IAwDhB;;OAEG;YACW,aAAa;IAoH3B;;OAEG;YACW,YAAY;IAmQ1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,WAAW,IAAI,aAAa;IAI5B;;OAEG;IACH,kBAAkB,IAAI,gBAAgB;IAItC;;OAEG;IACH,gBAAgB,IAAI,YAAY;IA4BhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA+C9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIxE,IAAI,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;CAG5F;AAGD,mBAAmB,iBAAiB,CAAC"}