@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.
- package/CHANGELOG.md +31 -0
- package/README.md +12 -1
- package/dist/dataset/dataset.d.ts +4 -45
- package/dist/dataset/dataset.d.ts.map +1 -1
- package/dist/dataset/dataset.js +4 -94
- package/dist/dataset/dataset.js.map +1 -1
- package/dist/dataset/generate.d.ts +49 -0
- package/dist/dataset/generate.d.ts.map +1 -0
- package/dist/dataset/generate.js +96 -0
- package/dist/dataset/generate.js.map +1 -0
- package/dist/foundation/axes.d.ts +4 -9
- package/dist/foundation/axes.d.ts.map +1 -1
- package/dist/foundation/axes.js +11 -37
- package/dist/foundation/axes.js.map +1 -1
- package/dist/foundation/errors.d.ts +7 -5
- package/dist/foundation/errors.d.ts.map +1 -1
- package/dist/foundation/errors.js +1 -1
- package/dist/foundation/errors.js.map +1 -1
- package/dist/foundation/ir.d.ts +9 -1
- package/dist/foundation/ir.d.ts.map +1 -1
- package/dist/foundation/ir.js.map +1 -1
- package/dist/foundation/types.d.ts.map +1 -1
- package/dist/foundation/types.js +9 -42
- package/dist/foundation/types.js.map +1 -1
- package/dist/foundation/walk.d.ts +7 -71
- package/dist/foundation/walk.d.ts.map +1 -1
- package/dist/foundation/walk.js +8 -264
- package/dist/foundation/walk.js.map +1 -1
- package/dist/generator/engine.d.ts +4 -35
- package/dist/generator/engine.d.ts.map +1 -1
- package/dist/generator/engine.js +3 -574
- package/dist/generator/engine.js.map +1 -1
- package/dist/generator/replay.d.ts +4 -8
- package/dist/generator/replay.d.ts.map +1 -1
- package/dist/generator/replay.js +3 -20
- package/dist/generator/replay.js.map +1 -1
- package/dist/generator/trace.d.ts +5 -0
- package/dist/generator/trace.d.ts.map +1 -1
- package/dist/generator/trace.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/plugin.d.ts +7 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +14 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime/contracts.d.ts +101 -0
- package/dist/runtime/contracts.d.ts.map +1 -0
- package/dist/runtime/contracts.js +67 -0
- package/dist/runtime/contracts.js.map +1 -0
- package/dist/runtime/runtime.d.ts +56 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +392 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime.d.ts +7 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +5 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema/decimal.d.ts +2 -2
- package/dist/schema/decimal.js +2 -2
- package/dist/standard/behaviors.d.ts +6 -0
- package/dist/standard/behaviors.d.ts.map +1 -0
- package/dist/standard/behaviors.js +358 -0
- package/dist/standard/behaviors.js.map +1 -0
- package/dist/standard/generation.d.ts +53 -0
- package/dist/standard/generation.d.ts.map +1 -0
- package/dist/standard/generation.js +359 -0
- package/dist/standard/generation.js.map +1 -0
- package/dist/standard/kinds.d.ts +6 -0
- package/dist/standard/kinds.d.ts.map +1 -0
- package/dist/standard/kinds.js +178 -0
- package/dist/standard/kinds.js.map +1 -0
- package/dist/standard/runtime.d.ts +3 -0
- package/dist/standard/runtime.d.ts.map +1 -0
- package/dist/standard/runtime.js +9 -0
- package/dist/standard/runtime.js.map +1 -0
- package/dist/standard/validation.d.ts +44 -0
- package/dist/standard/validation.d.ts.map +1 -0
- package/dist/standard/validation.js +353 -0
- package/dist/standard/validation.js.map +1 -0
- package/dist/standard.d.ts +5 -0
- package/dist/standard.d.ts.map +1 -0
- package/dist/standard.js +5 -0
- package/dist/standard.js.map +1 -0
- package/dist/validator/parse.d.ts +2 -11
- package/dist/validator/parse.d.ts.map +1 -1
- package/dist/validator/parse.js +3 -426
- package/dist/validator/parse.js.map +1 -1
- 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
|
[](https://www.npmjs.com/package/@databehave/schema)
|
|
10
10
|
[](https://github.com/ochairo/databehave/actions/workflows/ci.yml)
|
|
11
|
-
[](https://nodejs.org/)
|
|
12
12
|
[](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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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"}
|
package/dist/dataset/dataset.js
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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":"
|
|
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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/foundation/axes.ts"],"names":[],"mappings":"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"}
|
package/dist/foundation/axes.js
CHANGED
|
@@ -1,42 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
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 **
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
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"}
|
package/dist/foundation/ir.d.ts
CHANGED
|
@@ -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
|
-
|
|
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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"}
|