@ontrails/testing 1.0.0-beta.15 → 1.0.0-beta.17

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 (95) hide show
  1. package/CHANGELOG.md +70 -1
  2. package/README.md +47 -3
  3. package/package.json +16 -7
  4. package/src/all.ts +32 -7
  5. package/src/context.ts +3 -0
  6. package/src/contracts.ts +1 -16
  7. package/src/examples.ts +19 -11
  8. package/src/harness-cli.ts +16 -3
  9. package/src/harness-http.ts +263 -0
  10. package/src/harness-mcp.ts +2 -0
  11. package/src/index.ts +18 -1
  12. package/src/logger.ts +3 -1
  13. package/src/scenario.ts +3 -5
  14. package/src/signals.ts +221 -0
  15. package/src/surface-parity.ts +356 -0
  16. package/src/types.ts +136 -1
  17. package/.turbo/turbo-build.log +0 -1
  18. package/.turbo/turbo-lint.log +0 -3
  19. package/.turbo/turbo-typecheck.log +0 -1
  20. package/dist/all.d.ts +0 -36
  21. package/dist/all.d.ts.map +0 -1
  22. package/dist/all.js +0 -99
  23. package/dist/all.js.map +0 -1
  24. package/dist/assertions.d.ts +0 -72
  25. package/dist/assertions.d.ts.map +0 -1
  26. package/dist/assertions.js +0 -238
  27. package/dist/assertions.js.map +0 -1
  28. package/dist/context.d.ts +0 -76
  29. package/dist/context.d.ts.map +0 -1
  30. package/dist/context.js +0 -118
  31. package/dist/context.js.map +0 -1
  32. package/dist/contracts.d.ts +0 -17
  33. package/dist/contracts.d.ts.map +0 -1
  34. package/dist/contracts.js +0 -75
  35. package/dist/contracts.js.map +0 -1
  36. package/dist/crosses.d.ts +0 -38
  37. package/dist/crosses.d.ts.map +0 -1
  38. package/dist/crosses.js +0 -223
  39. package/dist/crosses.js.map +0 -1
  40. package/dist/detours.d.ts +0 -13
  41. package/dist/detours.d.ts.map +0 -1
  42. package/dist/detours.js +0 -109
  43. package/dist/detours.js.map +0 -1
  44. package/dist/effective-examples.d.ts +0 -30
  45. package/dist/effective-examples.d.ts.map +0 -1
  46. package/dist/effective-examples.js +0 -227
  47. package/dist/effective-examples.js.map +0 -1
  48. package/dist/examples.d.ts +0 -23
  49. package/dist/examples.d.ts.map +0 -1
  50. package/dist/examples.js +0 -240
  51. package/dist/examples.js.map +0 -1
  52. package/dist/harness-cli.d.ts +0 -21
  53. package/dist/harness-cli.d.ts.map +0 -1
  54. package/dist/harness-cli.js +0 -205
  55. package/dist/harness-cli.js.map +0 -1
  56. package/dist/harness-mcp.d.ts +0 -21
  57. package/dist/harness-mcp.d.ts.map +0 -1
  58. package/dist/harness-mcp.js +0 -54
  59. package/dist/harness-mcp.js.map +0 -1
  60. package/dist/index.d.ts +0 -18
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/index.js +0 -19
  63. package/dist/index.js.map +0 -1
  64. package/dist/logger.d.ts +0 -15
  65. package/dist/logger.d.ts.map +0 -1
  66. package/dist/logger.js +0 -87
  67. package/dist/logger.js.map +0 -1
  68. package/dist/scenario.d.ts +0 -37
  69. package/dist/scenario.d.ts.map +0 -1
  70. package/dist/scenario.js +0 -235
  71. package/dist/scenario.js.map +0 -1
  72. package/dist/trail.d.ts +0 -20
  73. package/dist/trail.d.ts.map +0 -1
  74. package/dist/trail.js +0 -80
  75. package/dist/trail.js.map +0 -1
  76. package/dist/types.d.ts +0 -113
  77. package/dist/types.d.ts.map +0 -1
  78. package/dist/types.js +0 -5
  79. package/dist/types.js.map +0 -1
  80. package/src/__tests__/all.test.ts +0 -254
  81. package/src/__tests__/context.test.ts +0 -170
  82. package/src/__tests__/contracts.test.ts +0 -239
  83. package/src/__tests__/crosses.test.ts +0 -587
  84. package/src/__tests__/detours.test.ts +0 -212
  85. package/src/__tests__/effective-examples.test.ts +0 -203
  86. package/src/__tests__/examples.test.ts +0 -636
  87. package/src/__tests__/harness-cli.test.ts +0 -90
  88. package/src/__tests__/harness-mcp.test.ts +0 -37
  89. package/src/__tests__/logger.test.ts +0 -136
  90. package/src/__tests__/partial-match.test.ts +0 -126
  91. package/src/__tests__/scenario.test.ts +0 -381
  92. package/src/__tests__/trail.test.ts +0 -99
  93. package/tsconfig.json +0 -9
  94. package/tsconfig.tests.json +0 -10
  95. package/tsconfig.tsbuildinfo +0 -1
@@ -1,205 +0,0 @@
1
- /**
2
- * CLI integration test harness.
3
- *
4
- * Builds CLI commands from a graph, executes them in-process,
5
- * and captures stdout/stderr.
6
- */
7
- import { deriveCliCommands } from '@ontrails/cli';
8
- import { mergeTestContext } from './context.js';
9
- // ---------------------------------------------------------------------------
10
- // Tokenizer
11
- // ---------------------------------------------------------------------------
12
- /** Parse a command string into tokens (simple split, no quoting support). */
13
- const parseCommandString = (input) => input
14
- .trim()
15
- .split(/\s+/)
16
- .filter((s) => s.length > 0);
17
- // ---------------------------------------------------------------------------
18
- // Command resolution
19
- // ---------------------------------------------------------------------------
20
- const matchesPath = (path, tokens) => path.length <= tokens.length &&
21
- path.every((segment, index) => tokens[index] === segment);
22
- /** Resolve a command from tokens using the longest matching command path. */
23
- const resolveCommand = (commands, tokens) => {
24
- if (tokens.length === 0) {
25
- return undefined;
26
- }
27
- const [match] = commands
28
- .filter((command) => matchesPath(command.path, tokens))
29
- .toSorted((a, b) => b.path.length - a.path.length);
30
- if (match === undefined) {
31
- return undefined;
32
- }
33
- return { command: match, flagTokens: tokens.slice(match.path.length) };
34
- };
35
- // ---------------------------------------------------------------------------
36
- // Flag parsing
37
- // ---------------------------------------------------------------------------
38
- /** Parse a value flag (--key value) and return new index. */
39
- const parseValueFlag = (key, next, flags) => {
40
- const num = Number(next);
41
- flags[key] = Number.isNaN(num) ? next : num;
42
- };
43
- /** Parse a single flag token and advance the index. */
44
- const parseSingleFlag = (tokens, i, flags) => {
45
- const token = tokens[i];
46
- if (token === undefined || !token.startsWith('--')) {
47
- return i + 1;
48
- }
49
- const key = token.slice(2);
50
- const next = tokens[i + 1];
51
- if (next !== undefined && !next.startsWith('-')) {
52
- parseValueFlag(key, next, flags);
53
- return i + 2;
54
- }
55
- flags[key] = true;
56
- return i + 1;
57
- };
58
- /** Parse flag tokens into a record. */
59
- const parseFlagTokens = (tokens) => {
60
- const flags = {};
61
- let i = 0;
62
- while (i < tokens.length) {
63
- i = parseSingleFlag(tokens, i, flags);
64
- }
65
- return flags;
66
- };
67
- /** Create interceptors for stdout/stderr capture. */
68
- const captureStreams = () => {
69
- let stdout = '';
70
- let stderr = '';
71
- const origStdoutWrite = process.stdout.write;
72
- const origStderrWrite = process.stderr.write;
73
- process.stdout.write = ((chunk) => {
74
- stdout +=
75
- typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk);
76
- return true;
77
- });
78
- process.stderr.write = ((chunk) => {
79
- stderr +=
80
- typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk);
81
- return true;
82
- });
83
- return {
84
- getStderr: () => stderr,
85
- getStdout: () => stdout,
86
- restore: () => {
87
- process.stdout.write = origStdoutWrite;
88
- process.stderr.write = origStderrWrite;
89
- },
90
- writeStdout: (text) => {
91
- stdout += text;
92
- },
93
- };
94
- };
95
- // ---------------------------------------------------------------------------
96
- // Output formatting
97
- // ---------------------------------------------------------------------------
98
- /** Try to parse a string as JSON, returning undefined on failure. */
99
- const tryParseJson = (text) => {
100
- try {
101
- return JSON.parse(text);
102
- }
103
- catch {
104
- return undefined;
105
- }
106
- };
107
- /** Format result value into stdout and build the CLI result. */
108
- const formatSuccessResult = (value, flags, streams) => {
109
- const outputMode = flags['output'] ?? (flags['json'] === true ? 'json' : 'text');
110
- if (outputMode === 'json') {
111
- const jsonStr = `${JSON.stringify(value, null, 2)}\n`;
112
- streams.writeStdout(jsonStr);
113
- return {
114
- exitCode: 0,
115
- json: tryParseJson(jsonStr),
116
- stderr: streams.getStderr(),
117
- stdout: streams.getStdout(),
118
- };
119
- }
120
- const formatted = typeof value === 'string'
121
- ? `${value}\n`
122
- : `${JSON.stringify(value, null, 2)}\n`;
123
- streams.writeStdout(formatted);
124
- return {
125
- exitCode: 0,
126
- json: tryParseJson(streams.getStdout().trim()),
127
- stderr: streams.getStderr(),
128
- stdout: streams.getStdout(),
129
- };
130
- };
131
- // ---------------------------------------------------------------------------
132
- // Execute command
133
- // ---------------------------------------------------------------------------
134
- /** Build an error result from a caught exception. */
135
- const buildErrorResult = (error, streams) => {
136
- streams.restore();
137
- const message = error instanceof Error ? error.message : String(error);
138
- return {
139
- exitCode: 1,
140
- stderr: streams.getStderr() || message,
141
- stdout: streams.getStdout(),
142
- };
143
- };
144
- /** Execute a resolved command and return the result. */
145
- const executeCommand = async (command, flags, streams, ctxOverrides) => {
146
- const ctx = mergeTestContext(ctxOverrides);
147
- const result = await command.execute({}, flags, ctx);
148
- streams.restore();
149
- if (result.isErr()) {
150
- return {
151
- exitCode: 1,
152
- stderr: streams.getStderr() || result.error.message,
153
- stdout: streams.getStdout(),
154
- };
155
- }
156
- return formatSuccessResult(result.value, flags, streams);
157
- };
158
- /** Run the full command pipeline: resolve, parse, execute. */
159
- const runCommand = async (commands, commandString, ctxOverrides) => {
160
- const parts = parseCommandString(commandString);
161
- const resolved = resolveCommand(commands, parts);
162
- if (resolved === undefined) {
163
- return {
164
- exitCode: 1,
165
- stderr: `Unknown command: ${commandString}`,
166
- stdout: '',
167
- };
168
- }
169
- const { command, flagTokens } = resolved;
170
- const flags = parseFlagTokens(flagTokens);
171
- const streams = captureStreams();
172
- try {
173
- return await executeCommand(command, flags, streams, ctxOverrides);
174
- }
175
- catch (error) {
176
- return buildErrorResult(error, streams);
177
- }
178
- };
179
- // ---------------------------------------------------------------------------
180
- // createCliHarness
181
- // ---------------------------------------------------------------------------
182
- /**
183
- * Create a CLI harness for integration testing.
184
- *
185
- * Builds commands from the graph's topo and provides a `run()` method
186
- * that parses command strings and executes them in-process.
187
- *
188
- * ```ts
189
- * const harness = createCliHarness({ graph });
190
- * const result = await harness.run("entity show --name Alpha --output json");
191
- * expect(result.exitCode).toBe(0);
192
- * ```
193
- */
194
- export const createCliHarness = (options) => {
195
- const { ctx, graph, ...deriveOptions } = options;
196
- const commandsResult = deriveCliCommands(graph, deriveOptions);
197
- if (commandsResult.isErr()) {
198
- throw commandsResult.error;
199
- }
200
- const commands = commandsResult.value;
201
- return {
202
- run: (commandString) => runCommand(commands, commandString, ctx),
203
- };
204
- };
205
- //# sourceMappingURL=harness-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness-cli.js","sourceRoot":"","sources":["../src/harness-cli.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * MCP integration test harness.
3
- *
4
- * Builds MCP tools from a graph, invokes them directly (no transport),
5
- * and returns the MCP tool response.
6
- */
7
- import type { McpHarness, McpHarnessOptions } from './types.js';
8
- /**
9
- * Create an MCP harness for integration testing.
10
- *
11
- * Builds MCP tools from the graph's topo and provides a `callTool()` method
12
- * that invokes tools directly without any transport boundary.
13
- *
14
- * ```ts
15
- * const harness = createMcpHarness({ graph });
16
- * const result = await harness.callTool("myapp_entity_show", { name: "Alpha" });
17
- * expect(result.isError).toBe(false);
18
- * ```
19
- */
20
- export declare const createMcpHarness: (options: McpHarnessOptions) => McpHarness;
21
- //# sourceMappingURL=harness-mcp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness-mcp.d.ts","sourceRoot":"","sources":["../src/harness-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,UAoC7D,CAAC"}
@@ -1,54 +0,0 @@
1
- /**
2
- * MCP integration test harness.
3
- *
4
- * Builds MCP tools from a graph, invokes them directly (no transport),
5
- * and returns the MCP tool response.
6
- */
7
- import { deriveMcpTools } from '@ontrails/mcp';
8
- // ---------------------------------------------------------------------------
9
- // createMcpHarness
10
- // ---------------------------------------------------------------------------
11
- /**
12
- * Create an MCP harness for integration testing.
13
- *
14
- * Builds MCP tools from the graph's topo and provides a `callTool()` method
15
- * that invokes tools directly without any transport boundary.
16
- *
17
- * ```ts
18
- * const harness = createMcpHarness({ graph });
19
- * const result = await harness.callTool("myapp_entity_show", { name: "Alpha" });
20
- * expect(result.isError).toBe(false);
21
- * ```
22
- */
23
- export const createMcpHarness = (options) => {
24
- const { extra, graph, ...deriveOptions } = options;
25
- const toolsResult = deriveMcpTools(graph, deriveOptions);
26
- if (toolsResult.isErr()) {
27
- throw toolsResult.error;
28
- }
29
- const toolMap = new Map();
30
- for (const tool of toolsResult.value) {
31
- toolMap.set(tool.name, tool);
32
- }
33
- return {
34
- async callTool(name, args) {
35
- const tool = toolMap.get(name);
36
- if (tool === undefined) {
37
- return {
38
- content: [{ text: `Unknown tool: ${name}`, type: 'text' }],
39
- isError: true,
40
- };
41
- }
42
- const result = await tool.handler(args, {
43
- abortSignal: extra?.abortSignal,
44
- progressToken: extra?.progressToken,
45
- sendProgress: extra?.sendProgress,
46
- });
47
- return {
48
- content: result.content,
49
- isError: result.isError ?? false,
50
- };
51
- },
52
- };
53
- };
54
- //# sourceMappingURL=harness-mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"harness-mcp.js","sourceRoot":"","sources":["../src/harness-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAS/C,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAA0B,EAAc,EAAE;IACzE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IACnD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACzD,IAAI,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,WAAW,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,IAA6B;YAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC1D,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACtC,WAAW,EAAE,KAAK,EAAE,WAAW;gBAC/B,aAAa,EAAE,KAAK,EAAE,aAAa;gBACnC,YAAY,EAAE,KAAK,EAAE,YAAY;aAClC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;aACjC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,18 +0,0 @@
1
- export { testAll } from './all.js';
2
- export { testAllEstablished } from './all.js';
3
- export { testExamples } from './examples.js';
4
- export { testCrosses } from './crosses.js';
5
- export { testTrail } from './trail.js';
6
- export { testContracts } from './contracts.js';
7
- export { testDetours } from './detours.js';
8
- export { assertErrorMatch, assertFullMatch, assertPartialMatch, assertSchemaMatch, errResultMatch, expectErr, expectOk, okResultMatch, } from './assertions.js';
9
- export { executeScenarioSteps, ref, scenario } from './scenario.js';
10
- export { createCrossContext, createTestContext, defaultCreatePermit, } from './context.js';
11
- export { createTestLogger } from './logger.js';
12
- export { createCliHarness } from './harness-cli.js';
13
- export { createMcpHarness } from './harness-mcp.js';
14
- export type { CreateCrossContextOptions } from './context.js';
15
- export type { PermittedTrail, MinimalPermit, TestExecutionOptions, } from './context.js';
16
- export type { TestCrossOptions } from './crosses.js';
17
- export type { CrossScenario, RefToken, ScenarioStep, TestAllEstablishedOptions, TestScenario, TestLogger, TestTrailContextOptions, CliHarness, CliHarnessOptions, CliHarnessResult, McpHarness, McpHarnessOptions, McpHarnessResult, } from './types.js';
18
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,YAAY,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EACV,cAAc,EACd,aAAa,EACb,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,YAAY,EACV,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,yBAAyB,EACzB,YAAY,EACZ,UAAU,EACV,uBAAuB,EACvB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js DELETED
@@ -1,19 +0,0 @@
1
- // Contract-driven testing
2
- export { testAll } from './all.js';
3
- export { testAllEstablished } from './all.js';
4
- export { testExamples } from './examples.js';
5
- export { testCrosses } from './crosses.js';
6
- export { testTrail } from './trail.js';
7
- export { testContracts } from './contracts.js';
8
- export { testDetours } from './detours.js';
9
- // Assertions
10
- export { assertErrorMatch, assertFullMatch, assertPartialMatch, assertSchemaMatch, errResultMatch, expectErr, expectOk, okResultMatch, } from './assertions.js';
11
- // Scenario testing
12
- export { executeScenarioSteps, ref, scenario } from './scenario.js';
13
- // Mock factories
14
- export { createCrossContext, createTestContext, defaultCreatePermit, } from './context.js';
15
- export { createTestLogger } from './logger.js';
16
- // Trailhead harnesses
17
- export { createCliHarness } from './harness-cli.js';
18
- export { createMcpHarness } from './harness-mcp.js';
19
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEpE,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/logger.d.ts DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * Test logger that captures log records for assertion.
3
- */
4
- import type { LogLevel } from '@ontrails/logging';
5
- import type { TestLogger } from './types.js';
6
- /**
7
- * Create a test logger that captures all log records in an array.
8
- *
9
- * Records are not printed. Use `entries`, `find()`, and `assertLogged()`
10
- * to inspect what was logged during a test.
11
- */
12
- export declare const createTestLogger: (options?: {
13
- level?: LogLevel;
14
- }) => TestLogger;
15
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,mBAAmB,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+G7C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU;IAAE,KAAK,CAAC,EAAE,QAAQ,CAAA;CAAE,KAAG,UACG,CAAC"}
package/dist/logger.js DELETED
@@ -1,87 +0,0 @@
1
- /**
2
- * Test logger that captures log records for assertion.
3
- */
4
- // ---------------------------------------------------------------------------
5
- // Level ordering for filtering
6
- // ---------------------------------------------------------------------------
7
- const LEVEL_ORDER = {
8
- debug: 1,
9
- error: 4,
10
- fatal: 5,
11
- info: 2,
12
- silent: 6,
13
- trace: 0,
14
- warn: 3,
15
- };
16
- // ---------------------------------------------------------------------------
17
- // Internal factory (shared between root and child loggers)
18
- // ---------------------------------------------------------------------------
19
- const createTestLoggerInternal = (name, minLevel, sharedEntries, baseMetadata) => {
20
- const minOrder = LEVEL_ORDER[minLevel] ?? 0;
21
- const shouldLog = (level) => (LEVEL_ORDER[level] ?? 0) >= minOrder;
22
- const log = (level, message, metadata) => {
23
- if (!shouldLog(level)) {
24
- return;
25
- }
26
- const record = {
27
- category: name,
28
- level,
29
- message,
30
- metadata: { ...baseMetadata, ...metadata },
31
- timestamp: new Date(),
32
- };
33
- sharedEntries.push(record);
34
- };
35
- return {
36
- assertLogged(level, messageSubstring) {
37
- const match = sharedEntries.find((r) => r.level === level && r.message.includes(messageSubstring));
38
- if (match === undefined) {
39
- throw new Error(`Expected a log entry with level="${level}" containing "${messageSubstring}", but none was found. ` +
40
- `Entries: ${JSON.stringify(sharedEntries.map((r) => ({ level: r.level, message: r.message })))}`);
41
- }
42
- },
43
- child(metadata) {
44
- const merged = { ...baseMetadata, ...metadata };
45
- return createTestLoggerInternal(name, minLevel, sharedEntries, merged);
46
- },
47
- clear() {
48
- sharedEntries.length = 0;
49
- },
50
- debug(message, metadata) {
51
- log('debug', message, metadata);
52
- },
53
- get entries() {
54
- return sharedEntries;
55
- },
56
- error(message, metadata) {
57
- log('error', message, metadata);
58
- },
59
- fatal(message, metadata) {
60
- log('fatal', message, metadata);
61
- },
62
- find(predicate) {
63
- return sharedEntries.filter(predicate);
64
- },
65
- info(message, metadata) {
66
- log('info', message, metadata);
67
- },
68
- name,
69
- trace(message, metadata) {
70
- log('trace', message, metadata);
71
- },
72
- warn(message, metadata) {
73
- log('warn', message, metadata);
74
- },
75
- };
76
- };
77
- // ---------------------------------------------------------------------------
78
- // createTestLogger
79
- // ---------------------------------------------------------------------------
80
- /**
81
- * Create a test logger that captures all log records in an array.
82
- *
83
- * Records are not printed. Use `entries`, `find()`, and `assertLogged()`
84
- * to inspect what was logged during a test.
85
- */
86
- export const createTestLogger = (options) => createTestLoggerInternal('test', options?.level ?? 'trace', [], {});
87
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- /**
2
- * Multi-step scenario runner for composition testing.
3
- *
4
- * Scenarios express multi-trail flows as structured data — arrays of steps
5
- * with cross-step references via `ref()`. Each step invokes a trail through
6
- * the normal execution pipeline (validation, layers, blaze, Result).
7
- */
8
- import type { Topo } from '@ontrails/core';
9
- import type { RefToken, ScenarioStep } from './types.js';
10
- /**
11
- * Create a reference marker for cross-step data in scenario inputs.
12
- *
13
- * `ref('create.id')` resolves to the `id` field of the step aliased as
14
- * `create`. Dot-paths are supported for nested access.
15
- *
16
- * @example
17
- * ```typescript
18
- * scenario('Fork flow', app, [
19
- * { cross: createGist, input: { name: 'Hello' }, as: 'original' },
20
- * { cross: forkGist, input: { id: ref('original.id') } },
21
- * ]);
22
- * ```
23
- */
24
- export declare const ref: (path: string) => RefToken;
25
- /**
26
- * Recursively walk a value, replacing RefToken instances with resolved values.
27
- */
28
- export declare const deriveRefs: (value: unknown, outputs: Map<string, unknown>) => unknown;
29
- /**
30
- * Execute scenario steps sequentially, resolving mock resources once upfront.
31
- *
32
- * Exported for direct use in tests that need to assert on step execution
33
- * without the describe/test wrapper that `scenario()` provides.
34
- */
35
- export declare const executeScenarioSteps: (app: Topo, steps: readonly ScenarioStep[]) => Promise<void>;
36
- export declare const scenario: (name: string, app: Topo, steps: readonly ScenarioStep[]) => void;
37
- //# sourceMappingURL=scenario.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../src/scenario.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAMV,IAAI,EACL,MAAM,gBAAgB,CAAC;AAexB,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AASzD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,KAAG,QAAmC,CAAC;AA6DvE;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,OAAO,EACd,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,OAkBF,CAAC;AAyMF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,KAAK,IAAI,EACT,OAAO,SAAS,YAAY,EAAE,KAC7B,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,EACZ,KAAK,IAAI,EACT,OAAO,SAAS,YAAY,EAAE,KAC7B,IAMF,CAAC"}