@databehave/schema 0.1.2 → 0.1.4

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 (77) hide show
  1. package/dist/dataset/dataset.d.ts +47 -0
  2. package/dist/dataset/dataset.d.ts.map +1 -0
  3. package/dist/dataset/dataset.js +96 -0
  4. package/dist/dataset/dataset.js.map +1 -0
  5. package/dist/dataset/relate.d.ts +32 -0
  6. package/dist/dataset/relate.d.ts.map +1 -0
  7. package/dist/dataset/relate.js +46 -0
  8. package/dist/dataset/relate.js.map +1 -0
  9. package/dist/foundation/axes.d.ts +101 -0
  10. package/dist/foundation/axes.d.ts.map +1 -0
  11. package/dist/foundation/axes.js +42 -0
  12. package/dist/foundation/axes.js.map +1 -0
  13. package/dist/foundation/errors.d.ts +99 -0
  14. package/dist/foundation/errors.d.ts.map +1 -0
  15. package/dist/foundation/errors.js +91 -0
  16. package/dist/foundation/errors.js.map +1 -0
  17. package/dist/foundation/hash.d.ts +12 -0
  18. package/dist/foundation/hash.d.ts.map +1 -0
  19. package/dist/foundation/hash.js +21 -0
  20. package/dist/foundation/hash.js.map +1 -0
  21. package/dist/foundation/ir.d.ts +91 -0
  22. package/dist/foundation/ir.d.ts.map +1 -0
  23. package/dist/foundation/ir.js +16 -0
  24. package/dist/foundation/ir.js.map +1 -0
  25. package/dist/foundation/prng.d.ts +27 -0
  26. package/dist/foundation/prng.d.ts.map +1 -0
  27. package/dist/foundation/prng.js +56 -0
  28. package/dist/foundation/prng.js.map +1 -0
  29. package/dist/foundation/types.d.ts +116 -0
  30. package/dist/foundation/types.d.ts.map +1 -0
  31. package/dist/foundation/types.js +188 -0
  32. package/dist/foundation/types.js.map +1 -0
  33. package/dist/foundation/walk.d.ts +72 -0
  34. package/dist/foundation/walk.d.ts.map +1 -0
  35. package/dist/foundation/walk.js +265 -0
  36. package/dist/foundation/walk.js.map +1 -0
  37. package/dist/generator/engine.d.ts +100 -0
  38. package/dist/generator/engine.d.ts.map +1 -0
  39. package/dist/generator/engine.js +575 -0
  40. package/dist/generator/engine.js.map +1 -0
  41. package/dist/generator/replay.d.ts +42 -0
  42. package/dist/generator/replay.d.ts.map +1 -0
  43. package/dist/generator/replay.js +61 -0
  44. package/dist/generator/replay.js.map +1 -0
  45. package/dist/generator/trace.d.ts +49 -0
  46. package/dist/generator/trace.d.ts.map +1 -0
  47. package/dist/generator/trace.js +38 -0
  48. package/dist/generator/trace.js.map +1 -0
  49. package/dist/index.d.ts +31 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +34 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/internal.d.ts +22 -0
  54. package/dist/internal.d.ts.map +1 -0
  55. package/dist/internal.js +25 -0
  56. package/dist/internal.js.map +1 -0
  57. package/dist/schema/composites.d.ts +104 -0
  58. package/dist/schema/composites.d.ts.map +1 -0
  59. package/dist/schema/composites.js +134 -0
  60. package/dist/schema/composites.js.map +1 -0
  61. package/dist/schema/conditional.d.ts +28 -0
  62. package/dist/schema/conditional.d.ts.map +1 -0
  63. package/dist/schema/conditional.js +52 -0
  64. package/dist/schema/conditional.js.map +1 -0
  65. package/dist/schema/decimal.d.ts +33 -0
  66. package/dist/schema/decimal.d.ts.map +1 -0
  67. package/dist/schema/decimal.js +39 -0
  68. package/dist/schema/decimal.js.map +1 -0
  69. package/dist/schema/primitives.d.ts +47 -0
  70. package/dist/schema/primitives.d.ts.map +1 -0
  71. package/dist/schema/primitives.js +78 -0
  72. package/dist/schema/primitives.js.map +1 -0
  73. package/dist/validator/parse.d.ts +22 -0
  74. package/dist/validator/parse.d.ts.map +1 -0
  75. package/dist/validator/parse.js +427 -0
  76. package/dist/validator/parse.js.map +1 -0
  77. package/package.json +3 -1
@@ -0,0 +1,575 @@
1
+ /**
2
+ * Generator engine — turns a SchemaNode + context into a deterministic value.
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
+ };
575
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/generator/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Replay / snapshot helpers — thin layer over `mock()` for tests.
3
+ *
4
+ * `replay(schema, opts)` returns a function bound to a fixed (seed, input)
5
+ * pair. Calling it twice always returns deep-equal values; the function is
6
+ * the canonical way to assert determinism in test suites.
7
+ *
8
+ * `expectStable(schema, opts)` runs the generator twice and throws if the
9
+ * outputs differ — surfaces non-determinism introduced by misuse of
10
+ * `derivedFrom` (e.g. reading `Date.now()`).
11
+ */
12
+ import { type MockOptions } from './engine.js';
13
+ import type { Infer, Schema } from '../foundation/types.js';
14
+ /** A reusable, deterministic generator bound to a fixed seed/input. */
15
+ export type Replay<S extends Schema> = {
16
+ /** Generate the value (always identical for identical bound options). */
17
+ (): Infer<S>;
18
+ /** The frozen options used by this replay. */
19
+ readonly options: Readonly<MockOptions>;
20
+ };
21
+ /** Build a deterministic, repeatedly-callable generator. */
22
+ export declare const replay: <S extends Schema>(schema: S, options?: MockOptions) => Replay<S>;
23
+ /**
24
+ * Run the generator twice with identical inputs and assert deep equality.
25
+ * Returns the produced value on success; throws on divergence.
26
+ *
27
+ * **This is a diagnostic, not a determinism guarantee.** It runs the
28
+ * schema *twice* with the same seed and compares the outputs
29
+ * structurally — useful for catching obvious non-determinism (a
30
+ * `derivedFrom` reading `Date.now()`, a stray `Math.random()`,
31
+ * iteration over a `Set`), but two iterations cannot prove the entire
32
+ * RNG sequence is fixed. The strong contract is {@link replay}, which
33
+ * binds a (seed, input) pair and lets the caller pin the value at the
34
+ * snapshot site.
35
+ *
36
+ * Treat `expectStable` as the equivalent of a smoke test: cheap to
37
+ * keep in a regression suite, fast to fail loudly when a callback
38
+ * goes off-piste, but not a substitute for `replay`-backed snapshots
39
+ * for surfaces that must round-trip across releases.
40
+ */
41
+ export declare const expectStable: <S extends Schema>(schema: S, options?: MockOptions) => Infer<S>;
42
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/generator/replay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE3D,uEAAuE;AACvE,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI;IACrC,yEAAyE;IACzE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;IACZ,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;CACxC,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAS,WAAgB,KAAG,MAAM,CAAC,CAAC,CAKvF,CAAA;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,CAAC,EAAE,UAAS,WAAgB,KAAG,KAAK,CAAC,CAAC,CAU5F,CAAA"}