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

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 (83) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/README.md +11 -11
  4. package/dist/all.d.ts +10 -5
  5. package/dist/all.d.ts.map +1 -1
  6. package/dist/all.js +78 -26
  7. package/dist/all.js.map +1 -1
  8. package/dist/assertions.d.ts +23 -0
  9. package/dist/assertions.d.ts.map +1 -1
  10. package/dist/assertions.js +154 -0
  11. package/dist/assertions.js.map +1 -1
  12. package/dist/context.d.ts +17 -16
  13. package/dist/context.d.ts.map +1 -1
  14. package/dist/context.js +31 -20
  15. package/dist/context.js.map +1 -1
  16. package/dist/contracts.d.ts.map +1 -1
  17. package/dist/contracts.js +9 -5
  18. package/dist/contracts.js.map +1 -1
  19. package/dist/crosses.d.ts +4 -4
  20. package/dist/crosses.d.ts.map +1 -1
  21. package/dist/crosses.js +49 -39
  22. package/dist/crosses.js.map +1 -1
  23. package/dist/detours.d.ts +5 -4
  24. package/dist/detours.d.ts.map +1 -1
  25. package/dist/detours.js +93 -14
  26. package/dist/detours.js.map +1 -1
  27. package/dist/effective-examples.d.ts +30 -0
  28. package/dist/effective-examples.d.ts.map +1 -0
  29. package/dist/effective-examples.js +227 -0
  30. package/dist/effective-examples.js.map +1 -0
  31. package/dist/examples.d.ts +1 -1
  32. package/dist/examples.d.ts.map +1 -1
  33. package/dist/examples.js +79 -41
  34. package/dist/examples.js.map +1 -1
  35. package/dist/harness-cli.d.ts +3 -3
  36. package/dist/harness-cli.d.ts.map +1 -1
  37. package/dist/harness-cli.js +25 -33
  38. package/dist/harness-cli.js.map +1 -1
  39. package/dist/harness-mcp.d.ts +3 -3
  40. package/dist/harness-mcp.d.ts.map +1 -1
  41. package/dist/harness-mcp.js +9 -8
  42. package/dist/harness-mcp.js.map +1 -1
  43. package/dist/index.d.ts +6 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +5 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/scenario.d.ts +37 -0
  48. package/dist/scenario.d.ts.map +1 -0
  49. package/dist/scenario.js +235 -0
  50. package/dist/scenario.js.map +1 -0
  51. package/dist/types.d.ts +38 -5
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +9 -5
  54. package/src/__tests__/all.test.ts +217 -29
  55. package/src/__tests__/context.test.ts +32 -12
  56. package/src/__tests__/contracts.test.ts +72 -18
  57. package/src/__tests__/crosses.test.ts +78 -78
  58. package/src/__tests__/detours.test.ts +176 -19
  59. package/src/__tests__/effective-examples.test.ts +203 -0
  60. package/src/__tests__/examples.test.ts +152 -50
  61. package/src/__tests__/harness-cli.test.ts +90 -0
  62. package/src/__tests__/harness-mcp.test.ts +37 -0
  63. package/src/__tests__/partial-match.test.ts +126 -0
  64. package/src/__tests__/scenario.test.ts +381 -0
  65. package/src/all.ts +149 -12
  66. package/src/assertions.ts +253 -0
  67. package/src/context.ts +64 -38
  68. package/src/contracts.ts +14 -8
  69. package/src/crosses.ts +93 -51
  70. package/src/detours.ts +155 -18
  71. package/src/effective-examples.ts +350 -0
  72. package/src/examples.ts +127 -59
  73. package/src/harness-cli.ts +33 -49
  74. package/src/harness-mcp.ts +9 -8
  75. package/src/index.ts +13 -3
  76. package/src/scenario.ts +370 -0
  77. package/src/types.ts +63 -5
  78. package/tsconfig.tests.json +10 -0
  79. package/tsconfig.tsbuildinfo +1 -1
  80. package/dist/follows.d.ts +0 -38
  81. package/dist/follows.d.ts.map +0 -1
  82. package/dist/follows.js +0 -212
  83. package/dist/follows.js.map +0 -1
@@ -1,3 +1,3 @@
1
1
  $ oxlint ./src
2
2
  Found 0 warnings and 0 errors.
3
- Finished in 55ms on 21 files with 93 rules using 24 threads.
3
+ Finished in 81ms on 28 files with 93 rules using 24 threads.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @ontrails/testing
2
2
 
3
+ ## 1.0.0-beta.15
4
+
5
+ ### Minor Changes
6
+
7
+ - f511a3a: Rename `app` field to `graph` in `CliHarnessOptions` and `McpHarnessOptions`
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [4ad6b25]
12
+ - @ontrails/core@1.0.0-beta.15
13
+ - @ontrails/cli@1.0.0-beta.15
14
+ - @ontrails/logging@1.0.0-beta.15
15
+ - @ontrails/mcp@1.0.0-beta.15
16
+
17
+ ## 1.0.0-beta.14
18
+
19
+ ### Minor Changes
20
+
21
+ - 69057e9: Add hierarchical CLI command trees and structured input, enforce established-only topo exports across trailheads, move developer topo and tracker state onto shared `trails.db` with pins and maintenance flows, and ship schema-derived stores through `@ontrails/store` and its Drizzle runtime.
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [69057e9]
26
+ - @ontrails/cli@1.0.0-beta.14
27
+ - @ontrails/core@1.0.0-beta.14
28
+ - @ontrails/logging@1.0.0-beta.14
29
+ - @ontrails/mcp@1.0.0-beta.14
30
+
3
31
  ## 1.0.0-beta.13
4
32
 
5
33
  ### Minor Changes
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # @ontrails/testing
2
2
 
3
- Contract-driven testing for Trails. Add examples to your trails, then `testAll(app)` runs them as assertions, validates output schemas, checks composition graphs, and verifies structural integrity. One line of test code, full governance.
3
+ Contract-driven testing for Trails. Add examples to your trails, then `testAll(graph)` runs them as assertions, validates output schemas, checks composition graphs, and verifies structural integrity. One line of test code, full governance.
4
4
 
5
5
  ## Usage
6
6
 
7
7
  ```typescript
8
8
  import { testAll } from '@ontrails/testing';
9
- import { app } from '../app';
9
+ import { graph } from '../app';
10
10
 
11
- testAll(app);
11
+ testAll(graph);
12
12
  ```
13
13
 
14
14
  That single call covers example execution, contract validation, detour checks, and topo validation. For most apps, this is all you need.
@@ -18,9 +18,9 @@ If you want finer control:
18
18
  ```typescript
19
19
  import { testExamples, testContracts, testDetours } from '@ontrails/testing';
20
20
 
21
- testExamples(app); // Run every trail's examples as tests
22
- testContracts(app); // Validate outputs against declared schemas
23
- testDetours(app); // Verify detour targets exist
21
+ testExamples(graph); // Run every trail's examples as tests
22
+ testContracts(graph); // Validate outputs against declared schemas
23
+ testDetours(graph); // Validate detour constructor, recover, and ordering semantics
24
24
  ```
25
25
 
26
26
  ## API
@@ -31,7 +31,7 @@ testDetours(app); // Verify detour targets exist
31
31
  | `testExamples(topo, ctx?)` | Run trail examples as `describe`/`test` blocks |
32
32
  | `testTrail(trail, scenarios)` | Custom scenarios for edge cases, error paths, and cross chains |
33
33
  | `testContracts(topo, ctx?)` | Validate output against declared schemas |
34
- | `testDetours(topo)` | Verify every detour target exists in the topo |
34
+ | `testDetours(topo)` | Validate detour constructor, recover, and shadowing semantics |
35
35
  | `createCrossContext(options?)` | Mock `CrossFn` for testing composite trails; returns preconfigured `Result` values keyed by trail ID |
36
36
  | `createTestContext(options?)` | `TrailContext` with sensible test defaults |
37
37
  | `createTestLogger()` | Logger that captures entries in memory for assertions |
@@ -81,23 +81,23 @@ const cross = createCrossContext({
81
81
  },
82
82
  });
83
83
  const ctx = { ...createTestContext(), cross };
84
- const result = await onboardTrail.run({ name: 'Delta', type: 'tool' }, ctx);
84
+ const result = await onboardTrail.blaze({ name: 'Delta', type: 'tool' }, ctx);
85
85
  ```
86
86
 
87
87
  Calls to unregistered trail IDs return `Result.err` with a descriptive message, so missing stubs fail loudly.
88
88
 
89
- ## Trailhead harnesses
89
+ ## Surface Harnesses
90
90
 
91
91
  ```typescript
92
92
  import { createCliHarness, createMcpHarness } from '@ontrails/testing';
93
93
 
94
94
  // CLI
95
- const cli = createCliHarness({ app });
95
+ const cli = createCliHarness({ graph });
96
96
  const result = await cli.run('entity show --name Alpha --output json');
97
97
  expect(result.exitCode).toBe(0);
98
98
 
99
99
  // MCP
100
- const mcp = createMcpHarness({ app });
100
+ const mcp = createMcpHarness({ graph });
101
101
  const tool = await mcp.callTool('myapp_entity_show', { name: 'Alpha' });
102
102
  expect(tool.isError).toBe(false);
103
103
  ```
package/dist/all.d.ts CHANGED
@@ -2,10 +2,11 @@
2
2
  * testAll — single-line governance suite for any Topo.
3
3
  *
4
4
  * Wraps topo validation, example execution, contract checks, and detour
5
- * verification into one describe block.
5
+ * contract validation into one describe block.
6
6
  */
7
7
  import type { Topo, TrailContext } from '@ontrails/core';
8
8
  import type { TestExecutionOptions } from './context.js';
9
+ import type { TestAllEstablishedOptions } from './types.js';
9
10
  /**
10
11
  * Run the full governance test suite for a Topo.
11
12
  *
@@ -13,7 +14,7 @@ import type { TestExecutionOptions } from './context.js';
13
14
  * - Structural validation via `validateTopo`
14
15
  * - Example execution via `testExamples`
15
16
  * - Output contract checks via `testContracts`
16
- * - Detour target verification via `testDetours`
17
+ * - Detour contract validation via `testDetours`
17
18
  *
18
19
  * Accepts either a static context or a factory function that produces a
19
20
  * fresh context per test (useful when the context contains mutable state
@@ -22,10 +23,14 @@ import type { TestExecutionOptions } from './context.js';
22
23
  * @example
23
24
  * ```ts
24
25
  * import { testAll } from '@ontrails/testing';
25
- * import { app } from '../src/app.js';
26
+ * import { graph } from '../src/app.js';
26
27
  *
27
- * testAll(app);
28
+ * testAll(graph);
28
29
  * ```
29
30
  */
30
- export declare const testAll: (topo: Topo, ctxOrFactory?: Partial<TrailContext> | TestExecutionOptions | (() => Partial<TrailContext> | TestExecutionOptions)) => void;
31
+ type TestAllInput = Partial<TrailContext> | TestExecutionOptions | (() => Partial<TrailContext> | TestExecutionOptions);
32
+ export declare const testAll: (topo: Topo, ctxOrFactory?: TestAllInput) => void;
33
+ type EstablishedInput = Partial<TrailContext> | TestAllEstablishedOptions | (() => Partial<TrailContext> | TestAllEstablishedOptions);
34
+ export declare const testAllEstablished: (topo: Topo, optionsOrFactory?: EstablishedInput) => void;
35
+ export {};
31
36
  //# sourceMappingURL=all.d.ts.map
package/dist/all.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO,GAClB,MAAM,IAAI,EACV,eACI,OAAO,CAAC,YAAY,CAAC,GACrB,oBAAoB,GACpB,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,KACvD,IAcF,CAAC"}
1
+ {"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,KAAK,YAAY,GACb,OAAO,CAAC,YAAY,CAAC,GACrB,oBAAoB,GACpB,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,CAAC;AAkDzD,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI,EAAE,eAAe,YAAY,KAAG,IAEjE,CAAC;AAEF,KAAK,gBAAgB,GACjB,OAAO,CAAC,YAAY,CAAC,GACrB,yBAAyB,GACzB,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,yBAAyB,CAAC,CAAC;AA+E9D,eAAO,MAAM,kBAAkB,GAC7B,MAAM,IAAI,EACV,mBAAmB,gBAAgB,KAClC,IAYF,CAAC"}
package/dist/all.js CHANGED
@@ -2,39 +2,37 @@
2
2
  * testAll — single-line governance suite for any Topo.
3
3
  *
4
4
  * Wraps topo validation, example execution, contract checks, and detour
5
- * verification into one describe block.
5
+ * contract validation into one describe block.
6
6
  */
7
7
  import { describe, expect, test } from 'bun:test';
8
- import { validateTopo } from '@ontrails/core';
8
+ import { validateEstablishedTopo, validateTopo } from '@ontrails/core';
9
+ import { createCliHarness } from './harness-cli.js';
10
+ import { createMcpHarness } from './harness-mcp.js';
9
11
  import { testContracts } from './contracts.js';
10
12
  import { testDetours } from './detours.js';
11
13
  import { testExamples } from './examples.js';
12
- /**
13
- * Run the full governance test suite for a Topo.
14
- *
15
- * Generates a `governance` describe block containing:
16
- * - Structural validation via `validateTopo`
17
- * - Example execution via `testExamples`
18
- * - Output contract checks via `testContracts`
19
- * - Detour target verification via `testDetours`
20
- *
21
- * Accepts either a static context or a factory function that produces a
22
- * fresh context per test (useful when the context contains mutable state
23
- * like an in-memory store).
24
- *
25
- * @example
26
- * ```ts
27
- * import { testAll } from '@ontrails/testing';
28
- * import { app } from '../src/app.js';
29
- *
30
- * testAll(app);
31
- * ```
32
- */
33
- export const testAll = (topo, ctxOrFactory) => {
14
+ const formatValidationFailure = (error) => {
15
+ const issues = error.context?.issues;
16
+ if (issues === undefined || issues.length === 0) {
17
+ return error.message;
18
+ }
19
+ const details = issues.map((issue) => {
20
+ const id = typeof issue['id'] === 'string' ? issue['id'] : undefined;
21
+ const message = typeof issue['message'] === 'string' ? issue['message'] : undefined;
22
+ const rule = typeof issue['rule'] === 'string' ? issue['rule'] : undefined;
23
+ return [rule, id, message].filter(Boolean).join(': ');
24
+ });
25
+ return [error.message, ...details].join('\n');
26
+ };
27
+ const assertValidTopo = (result) => {
28
+ if (result.isErr()) {
29
+ throw new Error(formatValidationFailure(result.error));
30
+ }
31
+ };
32
+ const registerGovernanceSuite = (topo, ctxOrFactory, validate) => {
34
33
  describe('governance', () => {
35
34
  test('topo validates', () => {
36
- const result = validateTopo(topo);
37
- expect(result.isOk()).toBe(true);
35
+ expect(() => assertValidTopo(validate(topo))).not.toThrow();
38
36
  });
39
37
  // oxlint-disable-next-line jest/require-hook -- these generate describe/test blocks, not setup code
40
38
  testExamples(topo, ctxOrFactory);
@@ -44,4 +42,58 @@ export const testAll = (topo, ctxOrFactory) => {
44
42
  testDetours(topo);
45
43
  });
46
44
  };
45
+ export const testAll = (topo, ctxOrFactory) => {
46
+ registerGovernanceSuite(topo, ctxOrFactory, validateTopo);
47
+ };
48
+ const isEstablishedOptions = (input) => input !== undefined &&
49
+ (Object.hasOwn(input, 'cli') ||
50
+ Object.hasOwn(input, 'createPermit') ||
51
+ Object.hasOwn(input, 'ctx') ||
52
+ Object.hasOwn(input, 'mcp') ||
53
+ Object.hasOwn(input, 'resources') ||
54
+ Object.hasOwn(input, 'strictPermits'));
55
+ const normalizeEstablishedOptions = (input) => isEstablishedOptions(input) ? input : { ctx: input };
56
+ const toExecutionOptions = (options) => ({
57
+ ...(options.createPermit === undefined
58
+ ? {}
59
+ : { createPermit: options.createPermit }),
60
+ ...(options.ctx === undefined ? {} : { ctx: options.ctx }),
61
+ ...(options.resources === undefined ? {} : { resources: options.resources }),
62
+ ...(options.strictPermits === undefined
63
+ ? {}
64
+ : { strictPermits: options.strictPermits }),
65
+ });
66
+ const toCliHarnessOptions = (topo, options) => {
67
+ const cliOptions = {
68
+ graph: topo,
69
+ ...options.cli,
70
+ };
71
+ if (options.ctx !== undefined) {
72
+ cliOptions.ctx = options.ctx;
73
+ }
74
+ return cliOptions;
75
+ };
76
+ const toMcpHarnessOptions = (topo, options) => ({
77
+ graph: topo,
78
+ ...options.mcp,
79
+ });
80
+ const registerEstablishedSurfaceSuite = (topo, resolveInput) => {
81
+ describe('surfaces', () => {
82
+ test('CLI projection validates established topo', () => {
83
+ const options = normalizeEstablishedOptions(resolveInput());
84
+ expect(() => createCliHarness(toCliHarnessOptions(topo, options))).not.toThrow();
85
+ });
86
+ test('MCP projection validates established topo', () => {
87
+ const options = normalizeEstablishedOptions(resolveInput());
88
+ expect(() => createMcpHarness(toMcpHarnessOptions(topo, options))).not.toThrow();
89
+ });
90
+ });
91
+ };
92
+ export const testAllEstablished = (topo, optionsOrFactory) => {
93
+ const resolveInput = typeof optionsOrFactory === 'function'
94
+ ? optionsOrFactory
95
+ : () => optionsOrFactory;
96
+ registerGovernanceSuite(topo, () => toExecutionOptions(normalizeEstablishedOptions(resolveInput())), validateEstablishedTopo);
97
+ registerEstablishedSurfaceSuite(topo, resolveInput);
98
+ };
47
99
  //# sourceMappingURL=all.js.map
package/dist/all.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.js","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,IAAU,EACV,YAGwD,EAClD,EAAE;IACR,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,oGAAoG;QACpG,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACjC,oGAAoG;QACpG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAClC,oGAAoG;QACpG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"all.js","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,24 @@ export declare const expectOk: <T, E>(result: Result<T, E>) => T;
32
32
  * ```
33
33
  */
34
34
  export declare const expectErr: <T, E>(result: Result<T, E>) => E;
35
+ export interface OkResultMatch {
36
+ readonly __resultMatch: 'ok';
37
+ readonly value?: unknown | undefined;
38
+ }
39
+ export interface ErrResultMatch {
40
+ readonly __resultMatch: 'err';
41
+ readonly error?: unknown | undefined;
42
+ }
43
+ /**
44
+ * Create a partial-match token for `Result.ok(...)` values nested inside
45
+ * arrays or objects, such as the `Result[]` returned by batch `ctx.cross()`.
46
+ */
47
+ export declare const okResultMatch: (value?: unknown) => OkResultMatch;
48
+ /**
49
+ * Create a partial-match token for `Result.err(...)` values nested inside
50
+ * arrays or objects, such as mixed-success batch `ctx.cross()`.
51
+ */
52
+ export declare const errResultMatch: (error?: unknown) => ErrResultMatch;
35
53
  /**
36
54
  * Assert that the result is ok and its value deep-equals the expected output.
37
55
  */
@@ -41,6 +59,11 @@ export declare const assertFullMatch: (result: Result<unknown, Error>, expected:
41
59
  * the value parses against it.
42
60
  */
43
61
  export declare const assertSchemaMatch: (result: Result<unknown, Error>, outputSchema: z.ZodType | undefined) => void;
62
+ /**
63
+ * Assert that the result is ok and its value is a superset of the expected
64
+ * partial output. Declared fields must match; extra fields are ignored.
65
+ */
66
+ export declare const assertPartialMatch: (result: Result<unknown, Error>, expectedMatch: unknown) => void;
44
67
  /**
45
68
  * Assert that the result is an error of the specified type, with optional
46
69
  * message substring matching.
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAGrD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAGtD,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,UAAU,OAAO,KAChB,IAGF,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,cAAc,CAAC,CAAC,OAAO,GAAG,SAAS,KAClC,IAUF,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,eAAe,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,EAC9C,kBAAkB,MAAM,KACvB,IAMF,CAAC"}
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAGrD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAGtD,CAAC;AAMF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAID;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,OAAO,KAAG,aAG9C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,OAAO,KAAG,cAG/C,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,UAAU,OAAO,KAChB,IAGF,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,cAAc,CAAC,CAAC,OAAO,GAAG,SAAS,KAClC,IAUF,CAAC;AAiNF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,eAAe,OAAO,KACrB,IAGF,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAC9B,eAAe,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,EAC9C,kBAAkB,MAAM,KACvB,IAMF,CAAC"}
@@ -41,6 +41,22 @@ export const expectErr = (result) => {
41
41
  expect(result.isErr()).toBe(true);
42
42
  return result.error;
43
43
  };
44
+ /**
45
+ * Create a partial-match token for `Result.ok(...)` values nested inside
46
+ * arrays or objects, such as the `Result[]` returned by batch `ctx.cross()`.
47
+ */
48
+ export const okResultMatch = (value) => ({
49
+ __resultMatch: 'ok',
50
+ value,
51
+ });
52
+ /**
53
+ * Create a partial-match token for `Result.err(...)` values nested inside
54
+ * arrays or objects, such as mixed-success batch `ctx.cross()`.
55
+ */
56
+ export const errResultMatch = (error) => ({
57
+ __resultMatch: 'err',
58
+ error,
59
+ });
44
60
  // ---------------------------------------------------------------------------
45
61
  // Full Match
46
62
  // ---------------------------------------------------------------------------
@@ -68,6 +84,144 @@ export const assertSchemaMatch = (result, outputSchema) => {
68
84
  }
69
85
  };
70
86
  // ---------------------------------------------------------------------------
87
+ // Partial Match
88
+ // ---------------------------------------------------------------------------
89
+ /** Format a path for error messages. */
90
+ const formatLoc = (path) => path.length > 0 ? path.join('.') : 'root';
91
+ const isResultMatchToken = (value) => typeof value === 'object' &&
92
+ value !== null &&
93
+ '__resultMatch' in value &&
94
+ (value['__resultMatch'] === 'ok' ||
95
+ value['__resultMatch'] === 'err');
96
+ const isResultLike = (value) => typeof value === 'object' &&
97
+ value !== null &&
98
+ 'isOk' in value &&
99
+ typeof value['isOk'] === 'function' &&
100
+ 'isErr' in value &&
101
+ typeof value['isErr'] === 'function';
102
+ /** Find an unconsumed actual element that deep-matches the expected object. */
103
+ const findObjectMatch = (actual, elem, consumed, path, index) => actual.findIndex((a, idx) => {
104
+ if (consumed.has(idx)) {
105
+ return false;
106
+ }
107
+ try {
108
+ // oxlint-disable-next-line no-use-before-define -- mutual recursion with assertSubset
109
+ assertSubset(a, elem, [...path, `[${String(index)}]`]);
110
+ return true;
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ });
116
+ /**
117
+ * Assert that every element in `expected` exists in `actual` (order-independent).
118
+ *
119
+ * Tracks consumed indices so that duplicate expected elements each require a
120
+ * distinct actual element — `['a', 'a']` does not match `['a']`.
121
+ */
122
+ const assertArraySubset = (actual, expected, path, loc) => {
123
+ const consumed = new Set();
124
+ for (let i = 0; i < expected.length; i += 1) {
125
+ const elem = expected[i];
126
+ const matchIndex = typeof elem === 'object' && elem !== null
127
+ ? findObjectMatch(actual, elem, consumed, path, i)
128
+ : actual.findIndex((a, idx) => !consumed.has(idx) && a === elem);
129
+ if (matchIndex === -1) {
130
+ throw new Error(`at ${loc}[${String(i)}]: expected array to contain ${JSON.stringify(elem)}`);
131
+ }
132
+ consumed.add(matchIndex);
133
+ }
134
+ };
135
+ /** Assert that every key in `expected` exists in `actual` with a matching value. */
136
+ const assertObjectSubset = (actual, expected, path) => {
137
+ for (const key of Object.keys(expected)) {
138
+ if (!(key in actual)) {
139
+ throw new Error(`at ${[...path, key].join('.')}: key not found in actual`);
140
+ }
141
+ // oxlint-disable-next-line no-use-before-define -- mutual recursion with assertSubset
142
+ assertSubset(actual[key], expected[key], [...path, key]);
143
+ }
144
+ };
145
+ /**
146
+ * Recursively assert that `actual` is a superset of `expected`.
147
+ *
148
+ * - **Scalars:** strict equality.
149
+ * - **Objects:** every key in `expected` must exist in `actual` with a matching
150
+ * value. Extra keys in `actual` are ignored.
151
+ * - **Arrays:** every element in `expected` must exist in `actual`
152
+ * (order-independent subset check).
153
+ * - **Nested objects:** recursive subset matching.
154
+ */
155
+ // oxlint-disable-next-line max-statements -- recursive dispatch across four type branches
156
+ const assertSubset = (actual, expected, path) => {
157
+ const loc = formatLoc(path);
158
+ if (expected === null || expected === undefined) {
159
+ if (actual !== expected) {
160
+ throw new Error(`at ${loc}: expected ${String(expected)}, got ${String(actual)}`);
161
+ }
162
+ return;
163
+ }
164
+ if (isResultMatchToken(expected)) {
165
+ // oxlint-disable-next-line no-use-before-define -- result token matching delegates back into assertSubset
166
+ assertResultTokenMatch(actual, expected, path);
167
+ return;
168
+ }
169
+ if (Array.isArray(expected)) {
170
+ if (!Array.isArray(actual)) {
171
+ throw new TypeError(`at ${loc}: expected an array, got ${typeof actual}`);
172
+ }
173
+ assertArraySubset(actual, expected, path, loc);
174
+ return;
175
+ }
176
+ if (typeof expected === 'object') {
177
+ if (typeof actual !== 'object' ||
178
+ actual === null ||
179
+ Array.isArray(actual)) {
180
+ throw new Error(`at ${loc}: expected an object, got ${typeof actual}`);
181
+ }
182
+ assertObjectSubset(actual, expected, path);
183
+ return;
184
+ }
185
+ if (actual !== expected) {
186
+ throw new Error(`at ${loc}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
187
+ }
188
+ };
189
+ const assertOkResultTokenMatch = (actual, expected, loc, path) => {
190
+ if (!actual.isOk()) {
191
+ throw new Error(`at ${loc}: expected Result.ok(...), got Result.err(...)`);
192
+ }
193
+ if (expected.value !== undefined) {
194
+ assertSubset(actual.value, expected.value, [...path, 'value']);
195
+ }
196
+ };
197
+ const assertErrResultTokenMatch = (actual, expected, loc, path) => {
198
+ if (!actual.isErr()) {
199
+ throw new Error(`at ${loc}: expected Result.err(...), got Result.ok(...)`);
200
+ }
201
+ if (expected.error !== undefined) {
202
+ assertSubset(actual.error, expected.error, [...path, 'error']);
203
+ }
204
+ };
205
+ const assertResultTokenMatch = (actual, expected, path) => {
206
+ const loc = formatLoc(path);
207
+ if (!isResultLike(actual)) {
208
+ throw new TypeError(`at ${loc}: expected a Result-like value`);
209
+ }
210
+ if (expected.__resultMatch === 'ok') {
211
+ assertOkResultTokenMatch(actual, expected, loc, path);
212
+ return;
213
+ }
214
+ assertErrResultTokenMatch(actual, expected, loc, path);
215
+ };
216
+ /**
217
+ * Assert that the result is ok and its value is a superset of the expected
218
+ * partial output. Declared fields must match; extra fields are ignored.
219
+ */
220
+ export const assertPartialMatch = (result, expectedMatch) => {
221
+ const value = expectOk(result);
222
+ assertSubset(value, expectedMatch, []);
223
+ };
224
+ // ---------------------------------------------------------------------------
71
225
  // Error Match
72
226
  // ---------------------------------------------------------------------------
73
227
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAO,MAAoB,EAAK,EAAE;IACxD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,OAAQ,MAAkC,CAAC,KAAK,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAO,MAAoB,EAAK,EAAE;IACzD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,OAAQ,MAAkC,CAAC,KAAK,CAAC;AACnD,CAAC,CAAC;AAEF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAA8B,EAC9B,QAAiB,EACX,EAAE;IACR,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAA8B,EAC9B,YAAmC,EAC7B,EAAE;IACR,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,iCAAiC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAA8B,EAC9B,aAA8C,EAC9C,eAAwB,EAClB,EAAE;IACR,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Test context factory for creating TrailContext instances suitable for testing.
3
3
  */
4
- import type { CrossFn, ProvisionOverrideMap, Topo, TrailContext } from '@ontrails/core';
5
- import { Result } from '@ontrails/core';
4
+ import type { CrossFn, ResourceOverrideMap, Topo, TrailContext } from '@ontrails/core';
5
+ import { Result, buildCrossValidationSchema } from '@ontrails/core';
6
6
  import type { TestTrailContextOptions } from './types.js';
7
7
  /**
8
8
  * Create a TrailContext with deterministic, test-friendly defaults.
@@ -15,34 +15,34 @@ export declare const createTestContext: (overrides?: TestTrailContextOptions) =>
15
15
  export interface CreateCrossContextOptions {
16
16
  readonly responses?: Record<string, Result<unknown, Error>> | undefined;
17
17
  }
18
- /** Minimal permit shape returned by the mint function. */
19
- export interface MintedPermit {
18
+ /** Minimal permit shape returned by the create function. */
19
+ export interface MinimalPermit {
20
20
  readonly id: string;
21
21
  readonly scopes: readonly string[];
22
22
  }
23
- /** Trail shape consumed by the mint function — avoids importing permits. */
24
- export interface MintableTrail {
23
+ /** Trail shape consumed by the create function — avoids importing permits. */
24
+ export interface PermittedTrail {
25
25
  readonly permit?: {
26
26
  readonly scopes: readonly string[];
27
27
  } | 'public' | undefined;
28
28
  }
29
29
  export interface TestExecutionOptions {
30
30
  readonly ctx?: Partial<TrailContext> | undefined;
31
- readonly provisions?: ProvisionOverrideMap | undefined;
31
+ readonly resources?: ResourceOverrideMap | undefined;
32
32
  /**
33
- * When true, disables automatic permit minting. Tests must provide
33
+ * When true, disables automatic permit creation. Tests must provide
34
34
  * explicit permits.
35
35
  */
36
36
  readonly strictPermits?: boolean | undefined;
37
37
  /**
38
- * Optional function to mint a test permit for a trail. When provided,
38
+ * Optional function to create a test permit for a trail. When provided,
39
39
  * called for each trail with a non-public `permit` requirement.
40
- * Returning `undefined` skips minting for that trail.
40
+ * Returning `undefined` skips creation for that trail.
41
41
  *
42
42
  * A default inline implementation is used when this is not provided,
43
43
  * keeping the testing package free of a hard dependency on `@ontrails/permits`.
44
44
  */
45
- readonly mintPermit?: (trail: MintableTrail) => MintedPermit | undefined;
45
+ readonly createPermit?: (trail: PermittedTrail) => MinimalPermit | undefined;
46
46
  }
47
47
  /**
48
48
  * Create a mock `CrossFn` for testing composite trails.
@@ -60,16 +60,17 @@ export interface TestExecutionOptions {
60
60
  */
61
61
  export declare const createCrossContext: (options?: CreateCrossContextOptions) => CrossFn;
62
62
  /**
63
- * Default permit minter — reads `trail.permit.scopes` and produces a
63
+ * Default permit creator — reads `trail.permit.scopes` and produces a
64
64
  * minimal permit object. No dependency on `@ontrails/permits`.
65
65
  */
66
- export declare const defaultMintPermit: (trail: MintableTrail) => MintedPermit | undefined;
66
+ export declare const defaultCreatePermit: (trail: PermittedTrail) => MinimalPermit | undefined;
67
67
  export declare const normalizeTestExecutionOptions: (input?: Partial<TrailContext> | TestExecutionOptions) => TestExecutionOptions;
68
- export declare const mergeProvisionOverrides: (autoResolved: ProvisionOverrideMap, ctx: Partial<TrailContext> | undefined, explicit: ProvisionOverrideMap | undefined) => ProvisionOverrideMap;
69
- export declare const resolveMockProvisions: (app: Topo) => Promise<ProvisionOverrideMap>;
68
+ export declare const mergeResourceOverrides: (autoResolved: ResourceOverrideMap, ctx: Partial<TrailContext> | undefined, explicit: ResourceOverrideMap | undefined) => ResourceOverrideMap;
69
+ export declare const createMockResources: (app: Topo) => Promise<ResourceOverrideMap>;
70
+ export { buildCrossValidationSchema };
70
71
  /**
71
72
  * Merge a Partial<TrailContext> into a test context.
72
73
  * Used internally when the public API accepts Partial<TrailContext>.
73
74
  */
74
- export declare const mergeTestContext: (ctx?: Partial<TrailContext>, provisions?: ProvisionOverrideMap) => TrailContext;
75
+ export declare const mergeTestContext: (ctx?: Partial<TrailContext>, resources?: ResourceOverrideMap) => TrailContext;
75
76
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,oBAAoB,EACpB,IAAI,EACJ,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAyB,MAAM,gBAAgB,CAAC;AAG/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAU1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,YAAY,uBAAuB,KAClC,YAcF,CAAC;AAMF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;CACzE;AAED,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EACZ;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GACtC,QAAQ,GACR,SAAS,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,YAAY,GAAG,SAAS,CAAC;CAC1E;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,yBAAyB,KAClC,OAcF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,aAAa,KACnB,YAAY,GAAG,SAKjB,CAAC;AAWF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,KACnD,oBACqD,CAAC;AAEzD,eAAO,MAAM,uBAAuB,GAClC,cAAc,oBAAoB,EAClC,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,EACtC,UAAU,oBAAoB,GAAG,SAAS,KACzC,oBAID,CAAC;AAeH,eAAO,MAAM,qBAAqB,GAChC,KAAK,IAAI,KACR,OAAO,CAAC,oBAAoB,CAAmC,CAAC;AAEnE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,OAAO,CAAC,YAAY,CAAC,EAC3B,aAAa,oBAAoB,KAChC,YAeF,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EACnB,IAAI,EACJ,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,MAAM,EACN,0BAA0B,EAG3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAU1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC5B,YAAY,uBAAuB,KAClC,YAeF,CAAC;AAMF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC;CACzE;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EACZ;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GACtC,QAAQ,GACR,SAAS,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACrD;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,aAAa,GAAG,SAAS,CAAC;CAC9E;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,yBAAyB,KAClC,OAiCF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,cAAc,KACpB,aAAa,GAAG,SAKlB,CAAC;AAWF,eAAO,MAAM,6BAA6B,GACxC,QAAQ,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,KACnD,oBACqD,CAAC;AAEzD,eAAO,MAAM,sBAAsB,GACjC,cAAc,mBAAmB,EACjC,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,EACtC,UAAU,mBAAmB,GAAG,SAAS,KACxC,mBAID,CAAC;AAaH,eAAO,MAAM,mBAAmB,GAC9B,KAAK,IAAI,KACR,OAAO,CAAC,mBAAmB,CAAkC,CAAC;AAGjE,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,OAAO,CAAC,YAAY,CAAC,EAC3B,YAAY,mBAAmB,KAC9B,YAeF,CAAC"}