@databehave/schema 0.1.4 → 0.3.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.
Files changed (92) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +12 -1
  3. package/dist/dataset/dataset.d.ts +4 -45
  4. package/dist/dataset/dataset.d.ts.map +1 -1
  5. package/dist/dataset/dataset.js +4 -94
  6. package/dist/dataset/dataset.js.map +1 -1
  7. package/dist/dataset/generate.d.ts +49 -0
  8. package/dist/dataset/generate.d.ts.map +1 -0
  9. package/dist/dataset/generate.js +96 -0
  10. package/dist/dataset/generate.js.map +1 -0
  11. package/dist/foundation/axes.d.ts +4 -9
  12. package/dist/foundation/axes.d.ts.map +1 -1
  13. package/dist/foundation/axes.js +11 -37
  14. package/dist/foundation/axes.js.map +1 -1
  15. package/dist/foundation/errors.d.ts +7 -5
  16. package/dist/foundation/errors.d.ts.map +1 -1
  17. package/dist/foundation/errors.js +1 -1
  18. package/dist/foundation/errors.js.map +1 -1
  19. package/dist/foundation/ir.d.ts +9 -1
  20. package/dist/foundation/ir.d.ts.map +1 -1
  21. package/dist/foundation/ir.js.map +1 -1
  22. package/dist/foundation/types.d.ts.map +1 -1
  23. package/dist/foundation/types.js +9 -42
  24. package/dist/foundation/types.js.map +1 -1
  25. package/dist/foundation/walk.d.ts +7 -71
  26. package/dist/foundation/walk.d.ts.map +1 -1
  27. package/dist/foundation/walk.js +8 -264
  28. package/dist/foundation/walk.js.map +1 -1
  29. package/dist/generator/engine.d.ts +4 -35
  30. package/dist/generator/engine.d.ts.map +1 -1
  31. package/dist/generator/engine.js +3 -574
  32. package/dist/generator/engine.js.map +1 -1
  33. package/dist/generator/replay.d.ts +4 -8
  34. package/dist/generator/replay.d.ts.map +1 -1
  35. package/dist/generator/replay.js +3 -20
  36. package/dist/generator/replay.js.map +1 -1
  37. package/dist/generator/trace.d.ts +5 -0
  38. package/dist/generator/trace.d.ts.map +1 -1
  39. package/dist/generator/trace.js.map +1 -1
  40. package/dist/index.d.ts +6 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +6 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/internal.d.ts +1 -1
  45. package/dist/internal.d.ts.map +1 -1
  46. package/dist/plugin.d.ts +7 -0
  47. package/dist/plugin.d.ts.map +1 -0
  48. package/dist/plugin.js +14 -0
  49. package/dist/plugin.js.map +1 -0
  50. package/dist/runtime/contracts.d.ts +101 -0
  51. package/dist/runtime/contracts.d.ts.map +1 -0
  52. package/dist/runtime/contracts.js +67 -0
  53. package/dist/runtime/contracts.js.map +1 -0
  54. package/dist/runtime/runtime.d.ts +56 -0
  55. package/dist/runtime/runtime.d.ts.map +1 -0
  56. package/dist/runtime/runtime.js +392 -0
  57. package/dist/runtime/runtime.js.map +1 -0
  58. package/dist/runtime.d.ts +7 -0
  59. package/dist/runtime.d.ts.map +1 -0
  60. package/dist/runtime.js +5 -0
  61. package/dist/runtime.js.map +1 -0
  62. package/dist/schema/decimal.d.ts +2 -2
  63. package/dist/schema/decimal.js +2 -2
  64. package/dist/standard/behaviors.d.ts +6 -0
  65. package/dist/standard/behaviors.d.ts.map +1 -0
  66. package/dist/standard/behaviors.js +358 -0
  67. package/dist/standard/behaviors.js.map +1 -0
  68. package/dist/standard/generation.d.ts +53 -0
  69. package/dist/standard/generation.d.ts.map +1 -0
  70. package/dist/standard/generation.js +359 -0
  71. package/dist/standard/generation.js.map +1 -0
  72. package/dist/standard/kinds.d.ts +6 -0
  73. package/dist/standard/kinds.d.ts.map +1 -0
  74. package/dist/standard/kinds.js +178 -0
  75. package/dist/standard/kinds.js.map +1 -0
  76. package/dist/standard/runtime.d.ts +3 -0
  77. package/dist/standard/runtime.d.ts.map +1 -0
  78. package/dist/standard/runtime.js +9 -0
  79. package/dist/standard/runtime.js.map +1 -0
  80. package/dist/standard/validation.d.ts +44 -0
  81. package/dist/standard/validation.d.ts.map +1 -0
  82. package/dist/standard/validation.js +353 -0
  83. package/dist/standard/validation.js.map +1 -0
  84. package/dist/standard.d.ts +5 -0
  85. package/dist/standard.d.ts.map +1 -0
  86. package/dist/standard.js +5 -0
  87. package/dist/standard.js.map +1 -0
  88. package/dist/validator/parse.d.ts +2 -11
  89. package/dist/validator/parse.d.ts.map +1 -1
  90. package/dist/validator/parse.js +3 -426
  91. package/dist/validator/parse.js.map +1 -1
  92. package/package.json +24 -4
package/CHANGELOG.md CHANGED
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ Upcoming package version: **0.3.0**. This section describes planned release contents, not a published release.
11
+
12
+ ### Breaking changes
13
+
14
+ - Require Node.js 24.22.1+ within 24.x or 26.12.1+ within 26.x to enforce the updated security patch floors.
15
+ - Update the optional `@databehave/core` peer range to `^0.2.0` for plugin composition.
16
+
17
+ ### Changed
18
+
19
+ - Refresh the shared build, test and release tooling dependencies.
20
+
21
+ See [migration](../../MIGRATION.md) and [release procedures](../../docs/releasing.md).
22
+
23
+ ## [0.2.0]
24
+
25
+ ### Breaking changes
26
+
27
+ - Require Node.js 24 or 26; support and test majors 24 and 26. Drop Node.js 18, 20 and 22.
28
+ - Replace the closed IR node union with open `SchemaNode` and built-in `StandardSchemaNode` contracts. Serialized IR
29
+ version 2 records exact kind/behavior contracts; version 1 requires explicit migration.
30
+ - Allow plugin-defined issue codes and enforce primitive invariants during validation.
31
+
32
+ ### Added
33
+
34
+ - Sealed instance-local kind and behavior registries, typed descriptors, scoped sampling and runtime methods for
35
+ nested generation, validation, datasets, traversal, replay and serialization.
36
+ - `/runtime`, `/standard` and optional `/plugin` entry points. Standard convenience builders/functions remain available.
37
+ - Public plugin, runtime support and migration guides, plus runnable public API examples.
38
+
39
+ See [migration](../../MIGRATION.md) and [release procedures](../../docs/releasing.md).
40
+
10
41
  ## [0.1.0] - 2026-06-03
11
42
 
12
43
  Initial public release of `@databehave/schema`.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/@databehave/schema.svg)](https://www.npmjs.com/package/@databehave/schema)
10
10
  [![CI](https://github.com/ochairo/databehave/actions/workflows/ci.yml/badge.svg)](https://github.com/ochairo/databehave/actions/workflows/ci.yml)
11
- [![Node.js](https://img.shields.io/badge/node-%E2%89%A518-brightgreen)](https://nodejs.org/)
11
+ [![Node.js](https://img.shields.io/badge/node-24%20%7C%2026-brightgreen)](https://nodejs.org/)
12
12
  [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
13
13
 
14
14
  </div>
@@ -17,6 +17,9 @@ Most schema libraries describe what shape your data has. @databehave/schema desc
17
17
 
18
18
  ## Install
19
19
 
20
+ The upcoming release requires Node.js 24.22.1+ (24.x) or 26.12.1+ (26.x); supported majors are 24 and 26.
21
+ See the [workspace documentation](../../docs/index.md) and [runnable schema example](../../examples/schema.mjs).
22
+
20
23
  ```sh
21
24
  npm install @databehave/schema
22
25
  # or: pnpm add @databehave/schema
@@ -108,3 +111,11 @@ const Tier = enum_(['A', 'B', 'C']).weighted([['A', 0.7], ['B', 0.2], ['C', 0.1]
108
111
  © 2026-present ochairo. See [LICENSE](LICENSE)
109
112
 
110
113
  </div>
114
+
115
+ ### Composable schema runtime
116
+
117
+ Use `createSchemaRuntime({ kinds, behaviors })` for explicit plugin composition. The `standardKinds` and
118
+ `standardBehaviors` groups use the same public descriptors as external kinds and behaviors. Runtime operations,
119
+ including nested generation, validation, traversal, datasets, replay and versioned serialization, retain the selected
120
+ registry. See [schema plugins](docs/extending.md) for authoring and migration details. The standalone runtime needs no
121
+ application host or HTTP transport.
@@ -1,47 +1,6 @@
1
- /**
2
- * Dataset abstraction.
3
- *
4
- * A Dataset is a collection of records that share:
5
- * - a per-record schema `S`
6
- * - identity keys `K` (same identity → same value, cross-endpoint)
7
- * - a record count `N`
8
- * - aggregate invariants `J` (predicates over the full record list)
9
- *
10
- * Identity uniqueness contract:
11
- * The dataset will not silently return two rows with the same identity
12
- * tuple. When generation produces a colliding identity, the row is
13
- * re-sampled with a fresh sub-seed up to `DEDUP_ATTEMPTS_PER_ROW` times;
14
- * if still colliding, a `SchemaConflictError` is thrown (your identity
15
- * domain is too small for `n`).
16
- */
17
1
  import type { Infer, Schema } from '../foundation/types.js';
18
- export type DatasetOptions<S extends Schema> = {
19
- /** Unique dataset name (participates in the identity seed). */
20
- readonly name: string;
21
- /** Record-level schema. */
22
- readonly schema: S;
23
- /** Field names whose tuple defines a record's identity. */
24
- readonly identity: readonly string[];
25
- /** Number of records to generate per `mockDataset` call. */
26
- readonly n: number;
27
- /** Aggregate invariants — applied to the full record list, with bounded retries. */
28
- readonly invariants?: readonly ((rows: readonly Infer<S>[]) => boolean)[];
29
- /** Caller-supplied context channel exposed to derived/invariants as `ctx.input`. */
30
- readonly input?: Readonly<Record<string, unknown>>;
31
- /** Optional seed prefix; if omitted, the dataset name is used. */
32
- readonly seedPrefix?: string;
33
- };
34
- /**
35
- * Generate `n` records that conform to the schema and satisfy all aggregate
36
- * invariants. Each row carries a unique identity tuple (collisions are
37
- * re-sampled; if the identity domain is exhausted, `SchemaConflictError`
38
- * is thrown).
39
- */
40
- export declare const mockDataset: <S extends Schema>(opts: DatasetOptions<S>) => Infer<S>[];
41
- /**
42
- * Produce the deterministic identity key for a record. Two records with the
43
- * same identity values produce the same key. `null` and `undefined` are
44
- * distinguished from each other.
45
- */
46
- export declare const identityFor: (datasetName: string, identityKeys: readonly string[], row: Record<string, unknown>) => string;
2
+ import { type DatasetOptions } from './generate.js';
3
+ export { identityFor, type DatasetOptions } from './generate.js';
4
+ /** Standard convenience composition; runtime.mockDataset binds a selected registry. */
5
+ export declare const mockDataset: <S extends Schema>(options: DatasetOptions<S>) => Infer<S>[];
47
6
  //# sourceMappingURL=dataset.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/dataset/dataset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI;IAC7C,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAA;IACzE,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAClD,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAYD;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,CAAC,CAAC,EA6C/E,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,aAAa,MAAM,EACnB,cAAc,SAAS,MAAM,EAAE,EAC/B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,MAUF,CAAA"}
1
+ {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/dataset/dataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAChE,uFAAuF;AACvF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,CAAC,CAAC,EAAoC,CAAA"}
@@ -1,96 +1,6 @@
1
- /**
2
- * Dataset abstraction.
3
- *
4
- * A Dataset is a collection of records that share:
5
- * - a per-record schema `S`
6
- * - identity keys `K` (same identity → same value, cross-endpoint)
7
- * - a record count `N`
8
- * - aggregate invariants `J` (predicates over the full record list)
9
- *
10
- * Identity uniqueness contract:
11
- * The dataset will not silently return two rows with the same identity
12
- * tuple. When generation produces a colliding identity, the row is
13
- * re-sampled with a fresh sub-seed up to `DEDUP_ATTEMPTS_PER_ROW` times;
14
- * if still colliding, a `SchemaConflictError` is thrown (your identity
15
- * domain is too small for `n`).
16
- */
17
- import { SchemaConflictError } from '../foundation/errors.js';
18
- import { identityKey } from '../foundation/hash.js';
19
1
  import { mock } from '../generator/engine.js';
20
- /**
21
- * Number of full dataset re-rolls on top of the initial attempt. Each retry
22
- * uses a *different* per-row seed (the loop variable is folded into the seed
23
- * string), so retries can absorb aggregate-invariant rejection without the
24
- * user having to widen the schema. Raise this only after verifying that the
25
- * declared invariants are satisfiable for the chosen `n`.
26
- */
27
- const MAX_DATASET_RETRIES = 1;
28
- const DEDUP_ATTEMPTS_PER_ROW = 8;
29
- /**
30
- * Generate `n` records that conform to the schema and satisfy all aggregate
31
- * invariants. Each row carries a unique identity tuple (collisions are
32
- * re-sampled; if the identity domain is exhausted, `SchemaConflictError`
33
- * is thrown).
34
- */
35
- export const mockDataset = (opts) => {
36
- const totalAttempts = MAX_DATASET_RETRIES + 1;
37
- for (let attempt = 0; attempt < totalAttempts; attempt += 1) {
38
- const seen = new Set();
39
- const rows = [];
40
- let collided = false;
41
- for (let i = 0; i < opts.n; i += 1) {
42
- let row;
43
- let key = '';
44
- for (let dedup = 0; dedup < DEDUP_ATTEMPTS_PER_ROW; dedup += 1) {
45
- const rowSeed = `${opts.seedPrefix ?? opts.name}:row:${i}:attempt:${attempt}:dedup:${dedup}`;
46
- const candidate = mock(opts.schema, {
47
- seed: rowSeed,
48
- index: i,
49
- ...(opts.input !== undefined ? { input: opts.input } : {}),
50
- });
51
- const k = identityFor(opts.name, opts.identity, candidate);
52
- if (!seen.has(k)) {
53
- row = candidate;
54
- key = k;
55
- break;
56
- }
57
- }
58
- if (row === undefined) {
59
- collided = true;
60
- break;
61
- }
62
- seen.add(key);
63
- rows.push(row);
64
- }
65
- if (collided) {
66
- // Try next dataset-level attempt with a different seed family.
67
- continue;
68
- }
69
- const invariants = opts.invariants ?? [];
70
- if (invariants.every((j) => j(rows)))
71
- return rows;
72
- }
73
- throw new SchemaConflictError(`dataset "${opts.name}": could not satisfy identity uniqueness or aggregate invariants ` +
74
- `after ${MAX_DATASET_RETRIES + 1} dataset attempt(s) ` +
75
- `× ${DEDUP_ATTEMPTS_PER_ROW} dedup retries`, [opts.name], 'widen the identity domain, lower n, or relax aggregate invariants');
76
- };
77
- /**
78
- * Produce the deterministic identity key for a record. Two records with the
79
- * same identity values produce the same key. `null` and `undefined` are
80
- * distinguished from each other.
81
- */
82
- export const identityFor = (datasetName, identityKeys, row) => {
83
- const parts = {};
84
- for (const k of identityKeys) {
85
- const v = row[k];
86
- // Distinguish "missing" / "explicit null" / "explicit undefined".
87
- if (v === undefined)
88
- parts[k] = '__undef__';
89
- else if (v === null)
90
- parts[k] = '__null__';
91
- else
92
- parts[k] = JSON.stringify(v);
93
- }
94
- return identityKey('DATASET', datasetName, parts);
95
- };
2
+ import { generateDataset } from './generate.js';
3
+ export { identityFor } from './generate.js';
4
+ /** Standard convenience composition; runtime.mockDataset binds a selected registry. */
5
+ export const mockDataset = (options) => generateDataset(options, mock);
96
6
  //# sourceMappingURL=dataset.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/dataset/dataset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAoB7C;;;;;;GAMG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAC7B,MAAM,sBAAsB,GAAG,CAAC,CAAA;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAmB,IAAuB,EAAc,EAAE;IACnF,MAAM,aAAa,GAAG,mBAAmB,GAAG,CAAC,CAAA;IAC7C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QAC9B,MAAM,IAAI,GAAe,EAAE,CAAA;QAC3B,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,GAAyB,CAAA;YAC7B,IAAI,GAAG,GAAG,EAAE,CAAA;YACZ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,sBAAsB,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC/D,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,YAAY,OAAO,UAAU,KAAK,EAAE,CAAA;gBAC5F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAClC,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,CAAC;oBACR,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC3D,CAAC,CAAA;gBACF,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAoC,CAAC,CAAA;gBACrF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjB,GAAG,GAAG,SAAS,CAAA;oBACf,GAAG,GAAG,CAAC,CAAA;oBACP,MAAK;gBACP,CAAC;YACH,CAAC;YACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,QAAQ,GAAG,IAAI,CAAA;gBACf,MAAK;YACP,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,+DAA+D;YAC/D,SAAQ;QACV,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;QACxC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;IACnD,CAAC;IACD,MAAM,IAAI,mBAAmB,CAC3B,YAAY,IAAI,CAAC,IAAI,mEAAmE;QACtF,SAAS,mBAAmB,GAAG,CAAC,sBAAsB;QACtD,KAAK,sBAAsB,gBAAgB,EAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,EACX,mEAAmE,CACpE,CAAA;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,WAAmB,EACnB,YAA+B,EAC/B,GAA4B,EACpB,EAAE;IACV,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,kEAAkE;QAClE,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAA;aACtC,IAAI,CAAC,KAAK,IAAI;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAA;;YACrC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAA;AACnD,CAAC,CAAA"}
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/dataset/dataset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAA;AAChE,uFAAuF;AACvF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAmB,OAA0B,EAAc,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Dataset abstraction.
3
+ *
4
+ * A Dataset is a collection of records that share:
5
+ * - a per-record schema `S`
6
+ * - identity keys `K` (same identity → same value, cross-endpoint)
7
+ * - a record count `N`
8
+ * - aggregate invariants `J` (predicates over the full record list)
9
+ *
10
+ * Identity uniqueness contract:
11
+ * The dataset will not silently return two rows with the same identity
12
+ * tuple. When generation produces a colliding identity, the row is
13
+ * re-sampled with a fresh sub-seed up to `DEDUP_ATTEMPTS_PER_ROW` times;
14
+ * if still colliding, a `SchemaConflictError` is thrown (your identity
15
+ * domain is too small for `n`).
16
+ */
17
+ import type { SchemaRuntime } from '../runtime/runtime.js';
18
+ import type { Infer, Schema } from '../foundation/types.js';
19
+ export type DatasetOptions<S extends Schema> = {
20
+ /** Unique dataset name (participates in the identity seed). */
21
+ readonly name: string;
22
+ /** Record-level schema. */
23
+ readonly schema: S;
24
+ /** Field names whose tuple defines a record's identity. */
25
+ readonly identity: readonly string[];
26
+ /** Number of records to generate per `mockDataset` call. */
27
+ readonly n: number;
28
+ /** Aggregate invariants — applied to the full record list, with bounded retries. */
29
+ readonly invariants?: readonly ((rows: readonly Infer<S>[]) => boolean)[];
30
+ /** Caller-supplied context channel exposed to derived/invariants as `ctx.input`. */
31
+ readonly input?: Readonly<Record<string, unknown>>;
32
+ /** Optional seed prefix; if omitted, the dataset name is used. */
33
+ readonly seedPrefix?: string;
34
+ };
35
+ /**
36
+ * Generate `n` records that conform to the schema and satisfy all aggregate
37
+ * invariants. Each row carries a unique identity tuple (collisions are
38
+ * re-sampled; if the identity domain is exhausted, `SchemaConflictError`
39
+ * is thrown).
40
+ */
41
+ /** Dataset policy receives the selected runtime's generator. */
42
+ export declare const generateDataset: <S extends Schema>(opts: DatasetOptions<S>, generate: SchemaRuntime["mock"]) => Infer<S>[];
43
+ /**
44
+ * Produce the deterministic identity key for a record. Two records with the
45
+ * same identity values produce the same key. `null` and `undefined` are
46
+ * distinguished from each other.
47
+ */
48
+ export declare const identityFor: (datasetName: string, identityKeys: readonly string[], row: Record<string, unknown>) => string;
49
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/dataset/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI;IAC7C,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;IAClB,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAA;IACzE,oFAAoF;IACpF,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAClD,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAYD;;;;;GAKG;AACH,gEAAgE;AAChE,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,aAAa,CAAC,MAAM,CAAC,KAAG,KAAK,CAAC,CAAC,CAAC,EA6CpH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,aAAa,MAAM,EACnB,cAAc,SAAS,MAAM,EAAE,EAC/B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,MAUF,CAAA"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Dataset abstraction.
3
+ *
4
+ * A Dataset is a collection of records that share:
5
+ * - a per-record schema `S`
6
+ * - identity keys `K` (same identity → same value, cross-endpoint)
7
+ * - a record count `N`
8
+ * - aggregate invariants `J` (predicates over the full record list)
9
+ *
10
+ * Identity uniqueness contract:
11
+ * The dataset will not silently return two rows with the same identity
12
+ * tuple. When generation produces a colliding identity, the row is
13
+ * re-sampled with a fresh sub-seed up to `DEDUP_ATTEMPTS_PER_ROW` times;
14
+ * if still colliding, a `SchemaConflictError` is thrown (your identity
15
+ * domain is too small for `n`).
16
+ */
17
+ import { SchemaConflictError } from '../foundation/errors.js';
18
+ import { identityKey } from '../foundation/hash.js';
19
+ /**
20
+ * Number of full dataset re-rolls on top of the initial attempt. Each retry
21
+ * uses a *different* per-row seed (the loop variable is folded into the seed
22
+ * string), so retries can absorb aggregate-invariant rejection without the
23
+ * user having to widen the schema. Raise this only after verifying that the
24
+ * declared invariants are satisfiable for the chosen `n`.
25
+ */
26
+ const MAX_DATASET_RETRIES = 1;
27
+ const DEDUP_ATTEMPTS_PER_ROW = 8;
28
+ /**
29
+ * Generate `n` records that conform to the schema and satisfy all aggregate
30
+ * invariants. Each row carries a unique identity tuple (collisions are
31
+ * re-sampled; if the identity domain is exhausted, `SchemaConflictError`
32
+ * is thrown).
33
+ */
34
+ /** Dataset policy receives the selected runtime's generator. */
35
+ export const generateDataset = (opts, generate) => {
36
+ const totalAttempts = MAX_DATASET_RETRIES + 1;
37
+ for (let attempt = 0; attempt < totalAttempts; attempt += 1) {
38
+ const seen = new Set();
39
+ const rows = [];
40
+ let collided = false;
41
+ for (let i = 0; i < opts.n; i += 1) {
42
+ let row;
43
+ let key = '';
44
+ for (let dedup = 0; dedup < DEDUP_ATTEMPTS_PER_ROW; dedup += 1) {
45
+ const rowSeed = `${opts.seedPrefix ?? opts.name}:row:${i}:attempt:${attempt}:dedup:${dedup}`;
46
+ const candidate = generate(opts.schema, {
47
+ seed: rowSeed,
48
+ index: i,
49
+ ...(opts.input !== undefined ? { input: opts.input } : {}),
50
+ });
51
+ const k = identityFor(opts.name, opts.identity, candidate);
52
+ if (!seen.has(k)) {
53
+ row = candidate;
54
+ key = k;
55
+ break;
56
+ }
57
+ }
58
+ if (row === undefined) {
59
+ collided = true;
60
+ break;
61
+ }
62
+ seen.add(key);
63
+ rows.push(row);
64
+ }
65
+ if (collided) {
66
+ // Try next dataset-level attempt with a different seed family.
67
+ continue;
68
+ }
69
+ const invariants = opts.invariants ?? [];
70
+ if (invariants.every((j) => j(rows)))
71
+ return rows;
72
+ }
73
+ throw new SchemaConflictError(`dataset "${opts.name}": could not satisfy identity uniqueness or aggregate invariants ` +
74
+ `after ${MAX_DATASET_RETRIES + 1} dataset attempt(s) ` +
75
+ `× ${DEDUP_ATTEMPTS_PER_ROW} dedup retries`, [opts.name], 'widen the identity domain, lower n, or relax aggregate invariants');
76
+ };
77
+ /**
78
+ * Produce the deterministic identity key for a record. Two records with the
79
+ * same identity values produce the same key. `null` and `undefined` are
80
+ * distinguished from each other.
81
+ */
82
+ export const identityFor = (datasetName, identityKeys, row) => {
83
+ const parts = {};
84
+ for (const k of identityKeys) {
85
+ const v = row[k];
86
+ // Distinguish "missing" / "explicit null" / "explicit undefined".
87
+ if (v === undefined)
88
+ parts[k] = '__undef__';
89
+ else if (v === null)
90
+ parts[k] = '__null__';
91
+ else
92
+ parts[k] = JSON.stringify(v);
93
+ }
94
+ return identityKey('DATASET', datasetName, parts);
95
+ };
96
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/dataset/generate.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,9 @@
5
5
  * The generator inspects axes during sampling; the validator inspects only
6
6
  * `domain` (since distribution is a sampling hint, not a conformance constraint).
7
7
  *
8
- * Priority order during generation (high → low):
9
- * 1. invariants (single-record predicates that must hold)
10
- * 2. identity (dataset-level — handled by dataset engine)
11
- * 3. derived (computed from other fields → fixed)
12
- * 4. conditional shape (handled by union/discriminated)
13
- * 5. domain (closed candidate set)
14
- * 6. distribution (weighting within domain ∩ type)
15
- * 7. type defaults
8
+ * Generation order: modifiers; derived; eventually; occasionally; bounded
9
+ * invariants around domain/distribution/kind sampling. Short-circuit values
10
+ * bypass invariants. Dataset identity is handled by the dataset policy.
16
11
  */
17
12
  /** A generation context exposed to derived functions and invariants. */
18
13
  export type GenContext = {
@@ -96,6 +91,6 @@ export type Axes = {
96
91
  readonly invariants?: readonly InvariantFn[];
97
92
  readonly domain?: DomainConstraint;
98
93
  };
99
- /** Merge two axis records (right-hand wins for scalar fields, lists concat). */
94
+ /** Merge standard axes through their owning behavior descriptors. */
100
95
  export declare const mergeAxes: (a: Axes | undefined, b: Axes) => Axes;
101
96
  //# sourceMappingURL=axes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/foundation/axes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/foundation/axes.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,16 @@
1
- /**
2
- * Data-schema axes.
3
- *
4
- * Each axis is optional metadata attached to a schema node via `Modifiers.axes`.
5
- * The generator inspects axes during sampling; the validator inspects only
6
- * `domain` (since distribution is a sampling hint, not a conformance constraint).
7
- *
8
- * Priority order during generation (high → low):
9
- * 1. invariants (single-record predicates that must hold)
10
- * 2. identity (dataset-level — handled by dataset engine)
11
- * 3. derived (computed from other fields → fixed)
12
- * 4. conditional shape (handled by union/discriminated)
13
- * 5. domain (closed candidate set)
14
- * 6. distribution (weighting within domain ∩ type)
15
- * 7. type defaults
16
- */
17
- /** Merge two axis records (right-hand wins for scalar fields, lists concat). */
1
+ import { standardBehaviors } from '../standard/behaviors.js';
2
+ /** Merge standard axes through their owning behavior descriptors. */
18
3
  export const mergeAxes = (a, b) => {
19
4
  if (a === undefined)
20
5
  return b;
21
- const merged = {};
22
- const dist = b.distribution ?? a.distribution;
23
- if (dist !== undefined)
24
- merged.distribution = dist;
25
- const der = b.derived ?? a.derived;
26
- if (der !== undefined)
27
- merged.derived = der;
28
- const dom = b.domain ?? a.domain;
29
- if (dom !== undefined)
30
- merged.domain = dom;
31
- const occ = [...(a.occasionally ?? []), ...(b.occasionally ?? [])];
32
- if (occ.length > 0)
33
- merged.occasionally = occ;
34
- const evn = [...(a.eventually ?? []), ...(b.eventually ?? [])];
35
- if (evn.length > 0)
36
- merged.eventually = evn;
37
- const inv = [...(a.invariants ?? []), ...(b.invariants ?? [])];
38
- if (inv.length > 0)
39
- merged.invariants = inv;
40
- return merged;
6
+ let node = { kind: 'metadata', mods: { axes: a ?? {} } };
7
+ for (const [id, incoming] of Object.entries(b)) {
8
+ const descriptor = standardBehaviors.find((behavior) => behavior.id === id);
9
+ if (descriptor === undefined)
10
+ throw new TypeError(`missing schema behavior ${id}`);
11
+ const previous = descriptor.read(node);
12
+ node = descriptor.write(node, previous === undefined ? incoming : descriptor.merge(previous, incoming));
13
+ }
14
+ return node.mods?.axes ?? {};
41
15
  };
42
16
  //# sourceMappingURL=axes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"axes.js","sourceRoot":"","sources":["../../src/foundation/axes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA0FH,gFAAgF;AAChF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAmB,EAAE,CAAO,EAAQ,EAAE;IAC9D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,MAAM,GAOR,EAAE,CAAA;IACN,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAA;IAC7C,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAA;IAClD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAA;IAClC,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,GAAG,CAAA;IAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAA;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IAC1C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAA;IAClE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,YAAY,GAAG,GAAG,CAAA;IAC7C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAA;IAC3C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAA;IAC3C,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
1
+ {"version":3,"file":"axes.js","sourceRoot":"","sources":["../../src/foundation/axes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAqG5D,qEAAqE;AACrE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAmB,EAAE,CAAO,EAAQ,EAAE;IAC9D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IAC7B,IAAI,IAAI,GAAiC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAA;IACtF,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3E,IAAI,UAAU,KAAK,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;QAClF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IACzG,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAA;AAC9B,CAAC,CAAA"}
@@ -15,12 +15,14 @@
15
15
  /**
16
16
  * Stable, machine-matchable identifier for a conformance failure.
17
17
  *
18
- * The catalog is **closed and snapshot-locked** by
18
+ * The standard catalog is **snapshot-locked** by
19
19
  * `test/foundation/issue-codes.test.ts`. Each value is a kebab-case,
20
20
  * dot-segmented identifier (`'<bucket>.<reason>'` or a bare token
21
21
  * for cross-cutting issues) and is part of the SemVer contract:
22
22
  *
23
- * - Adding a new code is `MINOR` (the snapshot test must be updated
23
+ * Plugins may add namespaced string codes through their registered validators.
24
+ *
25
+ * - Adding a new standard code is `MINOR` (the snapshot test must be updated
24
26
  * in the same commit).
25
27
  * - Renaming, removing, or changing the meaning of an existing code
26
28
  * is `MAJOR`.
@@ -29,13 +31,13 @@
29
31
  * change in any release. See `docs/stability.md` ("Issue messages
30
32
  * are diagnostic-only").
31
33
  */
32
- export type IssueCode = 'array.expected' | 'array.length-mismatch' | 'array.too-long' | 'array.too-short' | 'boolean.expected' | 'decimal.expected' | 'decimal.not-numeric' | 'decimal.scale-exceeded' | 'derived.callback-threw' | 'derived.mismatch' | 'discriminated.expected-object' | 'discriminated.missing-tag' | 'discriminated.unknown-tag' | 'domain.lookup-mismatch' | 'domain.not-in-values' | 'enum.not-member' | 'invariant.callback-threw' | 'invariant.failed' | 'literal.not-equal' | 'null.expected' | 'number.expected' | 'number.not-integer' | 'number.too-large' | 'number.too-small' | 'object.expected' | 'required' | 'string.expected' | 'string.pattern-mismatch' | 'string.too-long' | 'string.too-short' | 'tuple.expected-array' | 'tuple.length-mismatch' | 'unexpected-null' | 'union.no-match';
34
+ export type IssueCode = 'array.expected' | 'array.length-mismatch' | 'array.too-long' | 'array.too-short' | 'boolean.expected' | 'decimal.expected' | 'decimal.not-numeric' | 'decimal.scale-exceeded' | 'derived.callback-threw' | 'derived.mismatch' | 'discriminated.expected-object' | 'discriminated.missing-tag' | 'discriminated.unknown-tag' | 'domain.lookup-mismatch' | 'domain.not-in-values' | 'enum.not-member' | 'invariant.callback-threw' | 'invariant.failed' | 'literal.not-equal' | 'null.expected' | 'number.expected' | 'number.not-integer' | 'number.too-large' | 'number.too-small' | 'object.expected' | 'required' | 'string.expected' | 'string.pattern-mismatch' | 'string.too-long' | 'string.too-short' | 'tuple.expected-array' | 'tuple.length-mismatch' | 'unexpected-null' | 'union.no-match' | (string & {});
33
35
  export type Issue = {
34
36
  readonly path: readonly (string | number)[];
35
37
  /**
36
38
  * Stable, machine-matchable identifier. Use this — together with
37
39
  * {@link Issue.path} — for programmatic assertions and runtime
38
- * branching. See {@link IssueCode} for the closed catalog.
40
+ * branching. See {@link IssueCode} for the standard catalog and extension contract.
39
41
  */
40
42
  readonly code: IssueCode;
41
43
  /**
@@ -88,7 +90,7 @@ export declare class SchemaConflictError extends DataBehaveError {
88
90
  /**
89
91
  * Optional, machine-matchable identifier for cross-cutting failures
90
92
  * raised outside the conform pipeline (e.g. `'serialize.closure-axis'`
91
- * thrown by {@link serializeSchema} when an axis carries a non-JSON
93
+ * thrown by `serializeSchema` when an axis carries a non-JSON
92
94
  * function value). Free-form `'<bucket>.<reason>'` slugs; not part of
93
95
  * the closed {@link IssueCode} catalog because they describe builder /
94
96
  * codec misuse rather than runtime conformance.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/foundation/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,kBAAkB,GAClB,+BAA+B,GAC/B,2BAA2B,GAC3B,2BAA2B,GAC3B,wBAAwB,GACxB,sBAAsB,GACtB,iBAAiB,GACjB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,UAAU,GACV,iBAAiB,GACjB,yBAAyB,GACzB,iBAAiB,GACjB,kBAAkB,GAClB,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,8BAAsB,eAAgB,SAAQ,KAAK;IACjD,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACpD,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAK;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE,SAAS,KAAK,EAAE;CASrC;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAGpB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAO,EACvC,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM;CAQhB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/foundation/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,uBAAuB,GACvB,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,wBAAwB,GACxB,wBAAwB,GACxB,kBAAkB,GAClB,+BAA+B,GAC/B,2BAA2B,GAC3B,2BAA2B,GAC3B,wBAAwB,GACxB,sBAAsB,GACtB,iBAAiB,GACjB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,UAAU,GACV,iBAAiB,GACjB,yBAAyB,GACzB,iBAAiB,GACjB,kBAAkB,GAClB,sBAAsB,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEjB,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,8BAAsB,eAAgB,SAAQ,KAAK;IACjD,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACpD,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAChC;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;IACjC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAK;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE,SAAS,KAAK,EAAE;CASrC;AAED;;;;;;;;;GASG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;gBAGpB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAO,EACvC,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM;CAQhB"}
@@ -56,7 +56,7 @@ export class SchemaConflictError extends DataBehaveError {
56
56
  /**
57
57
  * Optional, machine-matchable identifier for cross-cutting failures
58
58
  * raised outside the conform pipeline (e.g. `'serialize.closure-axis'`
59
- * thrown by {@link serializeSchema} when an axis carries a non-JSON
59
+ * thrown by `serializeSchema` when an axis carries a non-JSON
60
60
  * function value). Free-form `'<bucket>.<reason>'` slugs; not part of
61
61
  * the closed {@link IssueCode} catalog because they describe builder /
62
62
  * codec misuse rather than runtime conformance.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/foundation/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAyEH;;;;;;;GAOG;AACH,MAAM,OAAgB,eAAgB,SAAQ,KAAK;CAKlD;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IACtC,MAAM,CAAkB;IACjC,8DAA8D;IACrD,IAAI,GAAiC,EAAE,CAAA;IACvC,IAAI,CAAS;IAEtB,YAAY,MAAwB;QAClC,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YACzB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,IAAI,CAA8B;IAClC,IAAI,CAAS;IACtB;;;;;;;OAOG;IACM,IAAI,CAAS;IAEtB,YACE,OAAe,EACf,OAAqC,EAAE,EACvC,IAAa,EACb,IAAa;QAEb,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QACxC,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAU,EAAE;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjF,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1E,MAAM,QAAQ,GACZ,UAAU,IAAI,CAAC;QACb,CAAC,CAAC,aAAa,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC1C,CAAC,CAAC,EAAE,CAAA;IACR,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,CAAU,EAAU,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/foundation/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4EH;;;;;;;GAOG;AACH,MAAM,OAAgB,eAAgB,SAAQ,KAAK;CAKlD;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IACtC,MAAM,CAAkB;IACjC,8DAA8D;IACrD,IAAI,GAAiC,EAAE,CAAA;IACvC,IAAI,CAAS;IAEtB,YAAY,MAAwB;QAClC,MAAM,OAAO,GACX,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YACzB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAC7C,IAAI,CAA8B;IAClC,IAAI,CAAS;IACtB;;;;;;;OAOG;IACM,IAAI,CAAS;IAEtB,YACE,OAAe,EACf,OAAqC,EAAE,EACvC,IAAa,EACb,IAAa;QAEb,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACpD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QACxC,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,WAAW,GAAG,CAAC,CAAQ,EAAU,EAAE;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjF,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1E,MAAM,QAAQ,GACZ,UAAU,IAAI,CAAC;QACb,CAAC,CAAC,aAAa,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE;QAC1C,CAAC,CAAC,EAAE,CAAA;IACR,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,QAAQ,GAAG,QAAQ,EAAE,CAAA;AACnD,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,CAAU,EAAU,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;AACH,CAAC,CAAA"}
@@ -81,11 +81,19 @@ export type Modifiers = {
81
81
  readonly defaultValue?: unknown;
82
82
  readonly description?: string;
83
83
  readonly axes?: Axes;
84
+ readonly behaviors?: Readonly<Record<string, unknown>>;
84
85
  };
85
86
  export type SchemaCore = NumberKind | StringKind | DecimalKind | BooleanKind | NullKind | LiteralKind | EnumKind | ArrayKind | ObjectKind | TupleKind | UnionKind | DiscriminatedKind;
86
- export type SchemaNode = SchemaCore & {
87
+ /** Standard node union used within the standard descriptors. */
88
+ export type StandardSchemaNode = SchemaCore & {
87
89
  readonly mods?: Modifiers;
88
90
  };
91
+ /** Open node carrier; each registered kind validates its own metadata. */
92
+ export interface SchemaNode {
93
+ readonly kind: string;
94
+ readonly mods?: Modifiers;
95
+ readonly [metadata: string]: unknown;
96
+ }
89
97
  /** Helper: produce a fresh node with merged modifiers. `axes` are deep-merged. */
90
98
  export declare const withMods: (node: SchemaNode, patch: Partial<Modifiers>) => SchemaNode;
91
99
  //# sourceMappingURL=ir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/foundation/ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/foundation/ir.ts"],"names":[],"mappings":"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"}