@databehave/schema 0.1.4 → 0.2.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 +18 -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/dist/generator/engine.js
CHANGED
|
@@ -1,575 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Wires the data-schema axes into the sampling pipeline.
|
|
5
|
-
* Resolution priority during sampling:
|
|
6
|
-
*
|
|
7
|
-
* 1. invariants (rejection-sample until they hold; bounded by MAX_ATTEMPTS)
|
|
8
|
-
* 2. identity (handled at dataset layer; not seen here)
|
|
9
|
-
* 3. derived (computed from sibling/root context — skip sampling entirely)
|
|
10
|
-
* 4. conditional (union / discriminated branch selection)
|
|
11
|
-
* 5. domain (closed candidate set)
|
|
12
|
-
* 6. distribution (weighted / normal / typical)
|
|
13
|
-
* 7. type (fall-back bounds from the IR)
|
|
14
|
-
*/
|
|
15
|
-
import { SchemaConflictError } from '../foundation/errors.js';
|
|
16
|
-
import { mulberry32, rngFromString, seedFromString } from '../foundation/prng.js';
|
|
17
|
-
const DEFAULT_SEED = 'databehave';
|
|
18
|
-
const MAX_ATTEMPTS = 100;
|
|
19
|
-
const DEFAULT_MODIFIER_PROBS = { default: 0, optional: 0, nullable: 0 };
|
|
20
|
-
/**
|
|
21
|
-
* Generate a value that conforms to the given schema.
|
|
22
|
-
*
|
|
23
|
-
* Deterministic: identical `schema` + `options.seed` always yields the same
|
|
24
|
-
* value, on every machine, every run.
|
|
25
|
-
*/
|
|
26
|
-
export const mock = (schema, options = {}) => {
|
|
27
|
-
const seedKey = typeof options.seed === 'number' ? String(options.seed) : (options.seed ?? DEFAULT_SEED);
|
|
28
|
-
const prngFactory = options.prng ?? mulberry32;
|
|
29
|
-
const rng = typeof options.seed === 'number'
|
|
30
|
-
? prngFactory(options.seed)
|
|
31
|
-
: options.prng !== undefined
|
|
32
|
-
? prngFactory(seedFromString(seedKey))
|
|
33
|
-
: rngFromString(seedKey);
|
|
34
|
-
const probs = {
|
|
35
|
-
...DEFAULT_MODIFIER_PROBS,
|
|
36
|
-
...(options.modifierProbs ?? {}),
|
|
37
|
-
};
|
|
38
|
-
for (const k of ['default', 'optional', 'nullable']) {
|
|
39
|
-
const p = probs[k];
|
|
40
|
-
if (!(p >= 0 && p <= 1)) {
|
|
41
|
-
throw new RangeError(`modifierProbs.${k} must be in [0, 1], got ${p}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const state = {
|
|
45
|
-
rng,
|
|
46
|
-
rootSeed: seedKey,
|
|
47
|
-
root: undefined,
|
|
48
|
-
modifierProbs: probs,
|
|
49
|
-
...(options.input !== undefined ? { input: options.input } : {}),
|
|
50
|
-
...(options.index !== undefined ? { rootIndex: options.index } : {}),
|
|
51
|
-
...(options.trace !== undefined ? { trace: options.trace } : {}),
|
|
52
|
-
...(options.stableBy !== undefined ? { stableBy: options.stableBy } : {}),
|
|
53
|
-
};
|
|
54
|
-
const value = generateNode(schema._node, [], EMPTY_PARENT, state);
|
|
55
|
-
state.root = value;
|
|
56
|
-
return value;
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Pick the rng to use for a single leaf sample.
|
|
60
|
-
*
|
|
61
|
-
* Falls back to the shared `state.rng` unless `stableBy` is configured and
|
|
62
|
-
* returns a non-empty string for the current node — in which case a fresh
|
|
63
|
-
* deterministic rng is seeded by `${key}:${path}`.
|
|
64
|
-
*/
|
|
65
|
-
const pickLeafRng = (state, parent, path) => {
|
|
66
|
-
if (state.stableBy === undefined)
|
|
67
|
-
return state.rng;
|
|
68
|
-
const key = state.stableBy(makeCtx(state, parent, path));
|
|
69
|
-
if (key == null || key === '')
|
|
70
|
-
return state.rng;
|
|
71
|
-
return rngFromString(`${key}:${path.join('.')}`);
|
|
72
|
-
};
|
|
73
|
-
const EMPTY_PARENT = Object.freeze({});
|
|
74
|
-
/** Find the nearest numeric element walking the path from the end. */
|
|
75
|
-
const nearestNumericIndex = (path) => {
|
|
76
|
-
for (let i = path.length - 1; i >= 0; i -= 1) {
|
|
77
|
-
const seg = path[i];
|
|
78
|
-
if (typeof seg === 'number')
|
|
79
|
-
return seg;
|
|
80
|
-
}
|
|
81
|
-
return undefined;
|
|
82
|
-
};
|
|
83
|
-
const makeCtx = (state, parent, path) => {
|
|
84
|
-
const pathIndex = nearestNumericIndex(path);
|
|
85
|
-
const effectiveIndex = pathIndex ?? state.rootIndex;
|
|
86
|
-
const ctx = {
|
|
87
|
-
root: state.root,
|
|
88
|
-
parent,
|
|
89
|
-
seed: `${state.rootSeed}:${path.join('.')}`,
|
|
90
|
-
};
|
|
91
|
-
if (effectiveIndex !== undefined)
|
|
92
|
-
ctx.index = effectiveIndex;
|
|
93
|
-
if (state.input !== undefined)
|
|
94
|
-
ctx.input = state.input;
|
|
95
|
-
return ctx;
|
|
96
|
-
};
|
|
97
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
98
|
-
// pipeline entry
|
|
99
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
100
|
-
export const generateNode = (node, path, parent, state) => {
|
|
101
|
-
const mods = node.mods;
|
|
102
|
-
const axes = mods?.axes;
|
|
103
|
-
const trace = state.trace;
|
|
104
|
-
const probs = state.modifierProbs;
|
|
105
|
-
if (mods?.hasDefault === true && probs.default > 0 && state.rng.next() < probs.default) {
|
|
106
|
-
trace?.emit({ path, axis: 'default' });
|
|
107
|
-
return mods.defaultValue;
|
|
108
|
-
}
|
|
109
|
-
if (mods?.optional === true && probs.optional > 0 && state.rng.next() < probs.optional) {
|
|
110
|
-
trace?.emit({ path, axis: 'optional-skip' });
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
if (mods?.nullable === true && probs.nullable > 0 && state.rng.next() < probs.nullable) {
|
|
114
|
-
trace?.emit({ path, axis: 'nullable-null' });
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
// derived field — bypass sampling entirely.
|
|
118
|
-
if (axes?.derived !== undefined) {
|
|
119
|
-
const v = runDerived(axes.derived, parent, path, state);
|
|
120
|
-
trace?.emit({ path, axis: 'derived' });
|
|
121
|
-
return v;
|
|
122
|
-
}
|
|
123
|
-
// eventually overrides — fire when ctx.index hits the cadence.
|
|
124
|
-
const idx = nearestNumericIndex(path) ?? state.rootIndex;
|
|
125
|
-
const eve = applyEventually(axes?.eventually, idx);
|
|
126
|
-
if (eve.hit) {
|
|
127
|
-
trace?.emit({ path, axis: 'eventually' });
|
|
128
|
-
return eve.value;
|
|
129
|
-
}
|
|
130
|
-
// occasionally overrides — stack before base sampling.
|
|
131
|
-
const occ = applyOccasionally(axes?.occasionally, state.rng);
|
|
132
|
-
if (occ.hit) {
|
|
133
|
-
trace?.emit({ path, axis: 'occasionally' });
|
|
134
|
-
return occ.value;
|
|
135
|
-
}
|
|
136
|
-
const invariants = axes?.invariants ?? [];
|
|
137
|
-
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt += 1) {
|
|
138
|
-
const value = sampleByKind(node, axes, path, parent, state);
|
|
139
|
-
if (invariants.length === 0) {
|
|
140
|
-
trace?.emit({ path, axis: axisOfSample(node, axes) });
|
|
141
|
-
return value;
|
|
142
|
-
}
|
|
143
|
-
const ctx = makeCtx(state, parent, path);
|
|
144
|
-
if (invariants.every((inv) => inv(value, ctx))) {
|
|
145
|
-
trace?.emit({ path, axis: 'invariant-pass', attempts: attempt + 1 });
|
|
146
|
-
return value;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
trace?.emit({ path, axis: 'invariant-fail', attempts: MAX_ATTEMPTS });
|
|
150
|
-
throw new SchemaConflictError(`invariant unsatisfied after ${MAX_ATTEMPTS} attempts`, path, 'relax the invariant or narrow the distribution / domain');
|
|
151
|
-
};
|
|
152
|
-
/** Classify which sampling axis was used (for trace annotations). */
|
|
153
|
-
const axisOfSample = (node, axes) => {
|
|
154
|
-
if (axes?.domain !== undefined)
|
|
155
|
-
return 'domain';
|
|
156
|
-
if (axes?.distribution !== undefined)
|
|
157
|
-
return 'distribution';
|
|
158
|
-
// composite kinds are bucketed under 'type' since their children get their own entries.
|
|
159
|
-
void node;
|
|
160
|
-
return 'type';
|
|
161
|
-
};
|
|
162
|
-
const runDerived = (fn, parent, path, state) => {
|
|
163
|
-
return fn(makeCtx(state, parent, path));
|
|
164
|
-
};
|
|
165
|
-
const applyOccasionally = (overrides, rng) => {
|
|
166
|
-
if (overrides === undefined)
|
|
167
|
-
return { hit: false };
|
|
168
|
-
for (const o of overrides) {
|
|
169
|
-
if (rng.next() < o.p)
|
|
170
|
-
return { hit: true, value: o.value };
|
|
171
|
-
}
|
|
172
|
-
return { hit: false };
|
|
173
|
-
};
|
|
174
|
-
const applyEventually = (overrides, index) => {
|
|
175
|
-
if (overrides === undefined || index === undefined)
|
|
176
|
-
return { hit: false };
|
|
177
|
-
for (const o of overrides) {
|
|
178
|
-
const offset = o.offset ?? 0;
|
|
179
|
-
if (((index - offset) % o.every + o.every) % o.every === 0 && index >= offset) {
|
|
180
|
-
return { hit: true, value: o.value };
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
return { hit: false };
|
|
184
|
-
};
|
|
185
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
186
|
-
// per-kind sampling
|
|
187
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
188
|
-
const sampleByKind = (node, axes, path, parent, state) => {
|
|
189
|
-
// Leaf sampling may use a stable per-path rng if `stableBy` opts in.
|
|
190
|
-
// Composites (object/array/tuple/union) keep using `state.rng` for shape
|
|
191
|
-
// decisions (length, branch); their children re-enter this fn and may opt-in.
|
|
192
|
-
const leafRng = () => pickLeafRng(state, parent, path);
|
|
193
|
-
if (axes?.domain !== undefined) {
|
|
194
|
-
const fromDomain = sampleFromDomain(axes.domain, axes.distribution, parent, leafRng());
|
|
195
|
-
if (fromDomain !== undefined)
|
|
196
|
-
return fromDomain;
|
|
197
|
-
}
|
|
198
|
-
switch (node.kind) {
|
|
199
|
-
case 'string':
|
|
200
|
-
return genString(node, leafRng());
|
|
201
|
-
case 'number':
|
|
202
|
-
return genNumber(node, axes?.distribution, leafRng(), path);
|
|
203
|
-
case 'decimal':
|
|
204
|
-
return genDecimal(node, axes?.distribution, leafRng(), path);
|
|
205
|
-
case 'boolean':
|
|
206
|
-
return leafRng().next() < 0.5;
|
|
207
|
-
case 'null':
|
|
208
|
-
return null;
|
|
209
|
-
case 'literal':
|
|
210
|
-
return node.value;
|
|
211
|
-
case 'enum':
|
|
212
|
-
return sampleDiscrete(node.values, axes?.distribution, leafRng());
|
|
213
|
-
case 'array':
|
|
214
|
-
return genArray(node, path, state);
|
|
215
|
-
case 'object':
|
|
216
|
-
return genObject(node, path, state);
|
|
217
|
-
case 'tuple':
|
|
218
|
-
return node.items.map((item, i) => generateNode(item, [...path, i], parent, state));
|
|
219
|
-
case 'union': {
|
|
220
|
-
const choice = state.rng.pick(node.options);
|
|
221
|
-
return generateNode(choice, path, parent, state);
|
|
222
|
-
}
|
|
223
|
-
case 'discriminated': {
|
|
224
|
-
const tags = Object.keys(node.branches);
|
|
225
|
-
if (tags.length === 0) {
|
|
226
|
-
throw new SchemaConflictError(`discriminated: empty branches map`, path, 'declare at least one branch in `discriminated({...})`');
|
|
227
|
-
}
|
|
228
|
-
// Branch selection honours a weighted distribution on tags when declared.
|
|
229
|
-
let tag;
|
|
230
|
-
if (axes?.distribution?.kind === 'weighted') {
|
|
231
|
-
const filtered = axes.distribution.weights.filter(([v]) => tags.includes(String(v)));
|
|
232
|
-
const picked = filtered.length > 0 ? pickWeighted(filtered, state.rng) : undefined;
|
|
233
|
-
tag = picked ?? state.rng.pick(tags);
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
tag = state.rng.pick(tags);
|
|
237
|
-
}
|
|
238
|
-
const branch = node.branches[tag];
|
|
239
|
-
return generateNode(branch, path, parent, state);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
244
|
-
// domain / distribution helpers
|
|
245
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
246
|
-
const sampleFromDomain = (domain, dist, parent, rng) => {
|
|
247
|
-
if (domain.kind === 'values') {
|
|
248
|
-
if (domain.values.length === 0)
|
|
249
|
-
return undefined;
|
|
250
|
-
// If a weighted distribution is declared, honour it by picking only
|
|
251
|
-
// weights whose value also lives in the domain.
|
|
252
|
-
if (dist?.kind === 'weighted') {
|
|
253
|
-
const filtered = dist.weights.filter(([v]) => domain.values.includes(v));
|
|
254
|
-
if (filtered.length > 0) {
|
|
255
|
-
const picked = pickWeighted(filtered, rng);
|
|
256
|
-
if (picked !== undefined)
|
|
257
|
-
return picked;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return rng.pick(domain.values);
|
|
261
|
-
}
|
|
262
|
-
const keyVal = parent[domain.fromField];
|
|
263
|
-
if (typeof keyVal !== 'string')
|
|
264
|
-
return undefined;
|
|
265
|
-
const candidates = domain.map[keyVal];
|
|
266
|
-
if (candidates === undefined || candidates.length === 0)
|
|
267
|
-
return undefined;
|
|
268
|
-
if (dist?.kind === 'weighted') {
|
|
269
|
-
const filtered = dist.weights.filter(([v]) => candidates.includes(v));
|
|
270
|
-
if (filtered.length > 0) {
|
|
271
|
-
const picked = pickWeighted(filtered, rng);
|
|
272
|
-
if (picked !== undefined)
|
|
273
|
-
return picked;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
return rng.pick(candidates);
|
|
277
|
-
};
|
|
278
|
-
const sampleDiscrete = (values, dist, rng) => {
|
|
279
|
-
if (dist?.kind === 'weighted') {
|
|
280
|
-
const picked = pickWeighted(dist.weights, rng);
|
|
281
|
-
if (picked !== undefined && (typeof picked === 'string' || typeof picked === 'number')) {
|
|
282
|
-
return picked;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return rng.pick(values);
|
|
286
|
-
};
|
|
287
|
-
const pickWeighted = (weights, rng) => {
|
|
288
|
-
let total = 0;
|
|
289
|
-
for (const [, w] of weights)
|
|
290
|
-
total += Math.max(0, w);
|
|
291
|
-
if (total <= 0)
|
|
292
|
-
return undefined;
|
|
293
|
-
let r = rng.next() * total;
|
|
294
|
-
for (const [v, w] of weights) {
|
|
295
|
-
r -= Math.max(0, w);
|
|
296
|
-
if (r <= 0)
|
|
297
|
-
return v;
|
|
298
|
-
}
|
|
299
|
-
return weights[weights.length - 1]?.[0];
|
|
300
|
-
};
|
|
301
|
-
const sampleNormal = (mean, stddev, rng) => {
|
|
302
|
-
const u1 = Math.max(rng.next(), Number.EPSILON);
|
|
303
|
-
const u2 = rng.next();
|
|
304
|
-
const z = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);
|
|
305
|
-
return mean + z * stddev;
|
|
306
|
-
};
|
|
307
|
-
const clamp = (n, min, max) => n < min ? min : n > max ? max : n;
|
|
308
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
309
|
-
// per-type
|
|
310
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
311
|
-
const ALPHANUM = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
312
|
-
// Slightly extended alphabet used only when a `pattern` is declared. Adds
|
|
313
|
-
// digits-only / lowercase-only fragments more aggressively so common
|
|
314
|
-
// rejection-sampler targets (`^\d+$`, `^[a-z0-9_-]+$`, hyphen-separated
|
|
315
|
-
// slugs) converge within `PATTERN_MAX_ATTEMPTS`. Keep ASCII-only so the
|
|
316
|
-
// produced length matches the requested `min`/`max` byte-for-byte.
|
|
317
|
-
//
|
|
318
|
-
// Uppercase letters and `.` are included so common patterns like
|
|
319
|
-
// `^[A-Z]+$`, `^[A-Z0-9_]+$` and dotted version-like tokens can
|
|
320
|
-
// converge — without them the rejection sampler exhausts
|
|
321
|
-
// `PATTERN_MAX_ATTEMPTS` and throws. Callers who want a stricter
|
|
322
|
-
// alphabet should still prefer `.in([...])` for exact enumerations.
|
|
323
|
-
const PATTERN_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.';
|
|
324
|
-
// Bumped from 200 → 1000. Patterns that include literal characters
|
|
325
|
-
// occurring rarely in the alphabet (e.g. `(a+)+b` requiring "a..b" as a
|
|
326
|
-
// substring of a length-8 random string has ~0.2% per-attempt match
|
|
327
|
-
// probability) converge unreliably at 200. 1000 attempts still complete
|
|
328
|
-
// in well under a millisecond on a satisfiable pattern and only delay
|
|
329
|
-
// the error path on unsatisfiable ones — the failure mode the test
|
|
330
|
-
// suite cares about (`.in([...])` hint surfaces in the thrown message).
|
|
331
|
-
const PATTERN_MAX_ATTEMPTS = 1000;
|
|
332
|
-
/**
|
|
333
|
-
* Bias the random-sampling alphabet toward literal characters that
|
|
334
|
-
* appear in the regex source. Each ASCII alphanumeric literal that
|
|
335
|
-
* survives a *very* shallow parse (skipping escapes and char-class
|
|
336
|
-
* bodies — we only need rough bias, not correctness) is repeated
|
|
337
|
-
* `PATTERN_LITERAL_BIAS_WEIGHT` times in the working alphabet so that
|
|
338
|
-
* uniform-index draws hit it more often. This is intentionally crude:
|
|
339
|
-
* patterns that need exact enumeration belong on `.in([...])`.
|
|
340
|
-
*/
|
|
341
|
-
const PATTERN_LITERAL_BIAS_WEIGHT = 8;
|
|
342
|
-
const biasAlphabetForPattern = (pattern) => {
|
|
343
|
-
const literals = new Set();
|
|
344
|
-
for (let i = 0; i < pattern.length; i += 1) {
|
|
345
|
-
const ch = pattern[i];
|
|
346
|
-
// Skip backslash-escaped sequences entirely — they encode meta
|
|
347
|
-
// classes (`\d`, `\w`) not literal characters.
|
|
348
|
-
if (ch === '\\') {
|
|
349
|
-
i += 1;
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
// Regex metacharacters that are never literal matches.
|
|
353
|
-
if ('()[]{}|.+*?^$'.includes(ch))
|
|
354
|
-
continue;
|
|
355
|
-
// Use only ASCII alphanumerics to bias; symbols introduce noise.
|
|
356
|
-
if (/[A-Za-z0-9]/.test(ch))
|
|
357
|
-
literals.add(ch);
|
|
358
|
-
}
|
|
359
|
-
if (literals.size === 0)
|
|
360
|
-
return PATTERN_ALPHABET;
|
|
361
|
-
return PATTERN_ALPHABET + [...literals].join('').repeat(PATTERN_LITERAL_BIAS_WEIGHT);
|
|
362
|
-
};
|
|
363
|
-
const genString = (node, rng) => {
|
|
364
|
-
const minLen = node.min ?? 4;
|
|
365
|
-
const maxLen = node.max ?? Math.max(minLen, 12);
|
|
366
|
-
if (node.pattern !== undefined) {
|
|
367
|
-
let re;
|
|
368
|
-
try {
|
|
369
|
-
re = new RegExp(node.pattern);
|
|
370
|
-
}
|
|
371
|
-
catch (err) {
|
|
372
|
-
throw new SchemaConflictError(`string: invalid pattern /${node.pattern}/: ${err.message}`, [], 'fix the pattern or drop it');
|
|
373
|
-
}
|
|
374
|
-
// Bias the alphabet toward literal characters appearing in the
|
|
375
|
-
// regex source. For patterns like `(a+)+b` requiring "a..b" in
|
|
376
|
-
// the output, uniform sampling from a 64-char alphabet has a
|
|
377
|
-
// ~0.2% per-attempt match rate; biasing toward 'a' and 'b'
|
|
378
|
-
// raises convergence to >95% within ~50 attempts. The bias is
|
|
379
|
-
// intentionally crude (literal ASCII chars only, no char-class
|
|
380
|
-
// analysis) — patterns that need precise enumeration should
|
|
381
|
-
// still prefer `.in([...])`.
|
|
382
|
-
const biased = biasAlphabetForPattern(node.pattern);
|
|
383
|
-
for (let attempt = 0; attempt < PATTERN_MAX_ATTEMPTS; attempt += 1) {
|
|
384
|
-
const len = rng.int(minLen, maxLen);
|
|
385
|
-
let candidate = '';
|
|
386
|
-
for (let i = 0; i < len; i += 1) {
|
|
387
|
-
candidate += biased[rng.int(0, biased.length - 1)];
|
|
388
|
-
}
|
|
389
|
-
if (re.test(candidate))
|
|
390
|
-
return candidate;
|
|
391
|
-
}
|
|
392
|
-
throw new SchemaConflictError(`string: could not satisfy pattern /${node.pattern}/ after ${PATTERN_MAX_ATTEMPTS} attempts`, [], 'use `.in([...])` to enumerate concrete values, or relax the pattern');
|
|
393
|
-
}
|
|
394
|
-
const len = rng.int(minLen, maxLen);
|
|
395
|
-
let out = '';
|
|
396
|
-
for (let i = 0; i < len; i += 1)
|
|
397
|
-
out += ALPHANUM[rng.int(0, ALPHANUM.length - 1)];
|
|
398
|
-
return out;
|
|
399
|
-
};
|
|
400
|
-
const genNumber = (node, dist, rng, path) => {
|
|
401
|
-
const min = node.min ?? 0;
|
|
402
|
-
const max = node.max ?? (node.int ? 100 : 1);
|
|
403
|
-
if (min > max) {
|
|
404
|
-
throw new SchemaConflictError(`number: min (${min}) > max (${max})`, path, 'swap min/max');
|
|
405
|
-
}
|
|
406
|
-
let raw;
|
|
407
|
-
if (dist?.kind === 'normal') {
|
|
408
|
-
raw = clamp(sampleNormal(dist.mean, dist.stddev, rng), min, max);
|
|
409
|
-
}
|
|
410
|
-
else if (dist?.kind === 'typical') {
|
|
411
|
-
const from = clamp(dist.from, min, max);
|
|
412
|
-
const to = clamp(dist.to, min, max);
|
|
413
|
-
raw = from + rng.next() * (to - from);
|
|
414
|
-
}
|
|
415
|
-
else if (node.int) {
|
|
416
|
-
return rng.int(min, max);
|
|
417
|
-
}
|
|
418
|
-
else {
|
|
419
|
-
return min + rng.next() * (max - min);
|
|
420
|
-
}
|
|
421
|
-
return node.int ? Math.round(raw) : raw;
|
|
422
|
-
};
|
|
423
|
-
const genDecimal = (node, dist, rng, path) => {
|
|
424
|
-
const minStr = node.min ?? '0';
|
|
425
|
-
const maxStr = node.max ?? defaultDecimalMax(node.precision, node.scale);
|
|
426
|
-
if (!isNumericString(minStr) || !isNumericString(maxStr)) {
|
|
427
|
-
throw new SchemaConflictError(`decimal: non-numeric bounds min=${minStr} max=${maxStr}`, path);
|
|
428
|
-
}
|
|
429
|
-
const scale = node.scale;
|
|
430
|
-
const scaleFactor = 10n ** BigInt(scale);
|
|
431
|
-
const minScaled = toScaledBigInt(minStr, scale);
|
|
432
|
-
const maxScaled = toScaledBigInt(maxStr, scale);
|
|
433
|
-
if (minScaled > maxScaled) {
|
|
434
|
-
throw new SchemaConflictError(`decimal: min (${minStr}) > max (${maxStr})`, path, 'swap min/max');
|
|
435
|
-
}
|
|
436
|
-
// For weighted distributions on decimals we honour the discrete-value path
|
|
437
|
-
// upstream; here we focus on continuous distributions.
|
|
438
|
-
let scaledValue;
|
|
439
|
-
if (dist?.kind === 'normal' || dist?.kind === 'typical') {
|
|
440
|
-
// Continuous distributions remain double-precision (approximate); the
|
|
441
|
-
// result is rounded to the declared scale.
|
|
442
|
-
const minN = Number(minStr);
|
|
443
|
-
const maxN = Number(maxStr);
|
|
444
|
-
let v;
|
|
445
|
-
if (dist.kind === 'normal') {
|
|
446
|
-
v = clamp(sampleNormal(dist.mean, dist.stddev, rng), minN, maxN);
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
const from = clamp(dist.from, minN, maxN);
|
|
450
|
-
const to = clamp(dist.to, minN, maxN);
|
|
451
|
-
v = from + rng.next() * (to - from);
|
|
452
|
-
}
|
|
453
|
-
// Round half-away-from-zero in BigInt space to preserve the requested scale.
|
|
454
|
-
scaledValue = roundToScaledBigInt(v, scale);
|
|
455
|
-
// Clamp into integer bounds in case of double rounding error.
|
|
456
|
-
if (scaledValue < minScaled)
|
|
457
|
-
scaledValue = minScaled;
|
|
458
|
-
if (scaledValue > maxScaled)
|
|
459
|
-
scaledValue = maxScaled;
|
|
460
|
-
}
|
|
461
|
-
else {
|
|
462
|
-
// Uniform over [minScaled, maxScaled] in BigInt space → full precision.
|
|
463
|
-
scaledValue = randomBigIntInclusive(rng, minScaled, maxScaled);
|
|
464
|
-
}
|
|
465
|
-
return formatScaledBigInt(scaledValue, scaleFactor, scale);
|
|
466
|
-
};
|
|
467
|
-
const isNumericString = (s) => /^-?\d+(\.\d+)?$/.test(s);
|
|
468
|
-
const toScaledBigInt = (s, scale) => {
|
|
469
|
-
const negative = s.startsWith('-');
|
|
470
|
-
const body = negative ? s.slice(1) : s;
|
|
471
|
-
const [intPart, fracPart = ''] = body.split('.');
|
|
472
|
-
const fracTrunc = fracPart.slice(0, scale);
|
|
473
|
-
const fracPadded = fracTrunc + '0'.repeat(scale - fracTrunc.length);
|
|
474
|
-
const digits = (intPart ?? '0') + fracPadded;
|
|
475
|
-
const magnitude = BigInt(digits.length === 0 ? '0' : digits);
|
|
476
|
-
return negative ? -magnitude : magnitude;
|
|
477
|
-
};
|
|
478
|
-
const roundToScaledBigInt = (v, scale) => {
|
|
479
|
-
// Use a string round-trip so we don't truncate magnitudes above 2^53.
|
|
480
|
-
const fixed = v.toFixed(scale);
|
|
481
|
-
return toScaledBigInt(fixed, scale);
|
|
482
|
-
};
|
|
483
|
-
const randomBigIntInclusive = (rng, lo, hi) => {
|
|
484
|
-
if (lo === hi)
|
|
485
|
-
return lo;
|
|
486
|
-
const range = hi - lo + 1n;
|
|
487
|
-
// Rejection-sample a non-negative BigInt < range using 32-bit RNG chunks.
|
|
488
|
-
let bits = 0;
|
|
489
|
-
for (let tmp = range - 1n; tmp > 0n; tmp >>= 1n)
|
|
490
|
-
bits += 1;
|
|
491
|
-
const chunks = Math.ceil(bits / 32);
|
|
492
|
-
for (let attempt = 0; attempt < 64; attempt += 1) {
|
|
493
|
-
let r = 0n;
|
|
494
|
-
for (let i = 0; i < chunks; i += 1) {
|
|
495
|
-
// rng.next() ∈ [0, 1); multiply by 2^32 → integer u32.
|
|
496
|
-
const u32 = BigInt(Math.floor(rng.next() * 0x100000000));
|
|
497
|
-
r = (r << 32n) | u32;
|
|
498
|
-
}
|
|
499
|
-
// Mask to the smallest power of two ≥ range.
|
|
500
|
-
const mask = (1n << BigInt(bits)) - 1n;
|
|
501
|
-
r &= mask;
|
|
502
|
-
if (r < range)
|
|
503
|
-
return lo + r;
|
|
504
|
-
}
|
|
505
|
-
/* node:coverage disable */
|
|
506
|
-
// Fallback (statistically improbable: 64 consecutive rejections imply the
|
|
507
|
-
// bit-mask is at most a hair larger than `range`, i.e. probability ≤ 2^-64).
|
|
508
|
-
// Modulo bias is acceptable given the negligible activation rate.
|
|
509
|
-
return lo + ((randomU64(rng) % range + range) % range);
|
|
510
|
-
};
|
|
511
|
-
const randomU64 = (rng) => {
|
|
512
|
-
const hi = BigInt(Math.floor(rng.next() * 0x100000000));
|
|
513
|
-
const lo = BigInt(Math.floor(rng.next() * 0x100000000));
|
|
514
|
-
return (hi << 32n) | lo;
|
|
515
|
-
};
|
|
516
|
-
/* node:coverage enable */
|
|
517
|
-
const formatScaledBigInt = (scaled, scaleFactor, scale) => {
|
|
518
|
-
const negative = scaled < 0n;
|
|
519
|
-
const abs = negative ? -scaled : scaled;
|
|
520
|
-
if (scale === 0)
|
|
521
|
-
return (negative ? '-' : '') + abs.toString();
|
|
522
|
-
const intPart = abs / scaleFactor;
|
|
523
|
-
const fracPart = abs % scaleFactor;
|
|
524
|
-
const fracStr = fracPart.toString().padStart(scale, '0');
|
|
525
|
-
return (negative ? '-' : '') + intPart.toString() + '.' + fracStr;
|
|
526
|
-
};
|
|
527
|
-
const defaultDecimalMax = (precision, scale) => {
|
|
528
|
-
const intDigits = precision - scale;
|
|
529
|
-
return '9'.repeat(Math.max(intDigits, 1));
|
|
530
|
-
};
|
|
531
|
-
const genArray = (node, path, state) => {
|
|
532
|
-
let len;
|
|
533
|
-
if (node.length !== undefined) {
|
|
534
|
-
len = node.length;
|
|
535
|
-
}
|
|
536
|
-
else {
|
|
537
|
-
const minL = node.minLength ?? 1;
|
|
538
|
-
const maxL = node.maxLength ?? Math.max(minL, 5);
|
|
539
|
-
if (minL > maxL) {
|
|
540
|
-
throw new SchemaConflictError(`array: minLength (${minL}) > maxLength (${maxL})`, path);
|
|
541
|
-
}
|
|
542
|
-
len = state.rng.int(minL, maxL);
|
|
543
|
-
}
|
|
544
|
-
const out = [];
|
|
545
|
-
for (let i = 0; i < len; i += 1) {
|
|
546
|
-
out.push(generateNode(node.item, [...path, i], EMPTY_PARENT, state));
|
|
547
|
-
}
|
|
548
|
-
return out;
|
|
549
|
-
};
|
|
550
|
-
const genObject = (node, path, state) => {
|
|
551
|
-
// Two-pass: non-derived first (so derived can read them), derived last.
|
|
552
|
-
const keys = Object.keys(node.fields);
|
|
553
|
-
const derivedKeys = [];
|
|
554
|
-
const out = {};
|
|
555
|
-
for (const key of keys) {
|
|
556
|
-
const field = node.fields[key];
|
|
557
|
-
if (field.mods?.axes?.derived !== undefined) {
|
|
558
|
-
derivedKeys.push(key);
|
|
559
|
-
continue;
|
|
560
|
-
}
|
|
561
|
-
const value = generateNode(field, [...path, key], out, state);
|
|
562
|
-
if (value === undefined && field.mods?.optional === true)
|
|
563
|
-
continue;
|
|
564
|
-
out[key] = value;
|
|
565
|
-
}
|
|
566
|
-
for (const key of derivedKeys) {
|
|
567
|
-
const field = node.fields[key];
|
|
568
|
-
const value = generateNode(field, [...path, key], out, state);
|
|
569
|
-
if (value === undefined && field.mods?.optional === true)
|
|
570
|
-
continue;
|
|
571
|
-
out[key] = value;
|
|
572
|
-
}
|
|
573
|
-
return out;
|
|
574
|
-
};
|
|
1
|
+
import { standardRuntime } from '../standard/runtime.js';
|
|
2
|
+
/** Generate using the explicit standard preset. Custom schemas use their composed runtime. */
|
|
3
|
+
export const mock = (schema, options = {}) => standardRuntime.mock(schema, options);
|
|
575
4
|
//# sourceMappingURL=engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/generator/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/generator/engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAmExD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAmB,MAAS,EAAE,UAAuB,EAAE,EAAY,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA"}
|
|
@@ -9,16 +9,12 @@
|
|
|
9
9
|
* outputs differ — surfaces non-determinism introduced by misuse of
|
|
10
10
|
* `derivedFrom` (e.g. reading `Date.now()`).
|
|
11
11
|
*/
|
|
12
|
+
import type { RuntimeReplay } from '../runtime/runtime.js';
|
|
12
13
|
import { type MockOptions } from './engine.js';
|
|
13
14
|
import type { Infer, Schema } from '../foundation/types.js';
|
|
14
|
-
/** A reusable
|
|
15
|
-
export type Replay<S extends Schema> =
|
|
16
|
-
|
|
17
|
-
(): Infer<S>;
|
|
18
|
-
/** The frozen options used by this replay. */
|
|
19
|
-
readonly options: Readonly<MockOptions>;
|
|
20
|
-
};
|
|
21
|
-
/** Build a deterministic, repeatedly-callable generator. */
|
|
15
|
+
/** A reusable standard-runtime generator with frozen options and contract identities. */
|
|
16
|
+
export type Replay<S extends Schema> = RuntimeReplay<S>;
|
|
17
|
+
/** Bind the standard composition; custom schemas use runtime.replay. */
|
|
22
18
|
export declare const replay: <S extends Schema>(schema: S, options?: MockOptions) => Replay<S>;
|
|
23
19
|
/**
|
|
24
20
|
* Run the generator twice with identical inputs and assert deep equality.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/generator/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/generator/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,yFAAyF;AACzF,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,CAAA;AAEvD,wEAAwE;AACxE,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAS,WAAgB,KAAG,MAAM,CAAC,CAAC,CAA4C,CAAA;AAEpI;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAS,WAAgB,KAAG,KAAK,CAAC,CAAC,CAU5F,CAAA"}
|