@nifrajs/mock 4.0.2 → 5.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nifra Authors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -18,9 +18,10 @@ The mock server matches reflected routes and synthesizes values from supported J
18
18
  Unsupported or unsatisfiable schemas fail explicitly instead of returning known-invalid data. Use a
19
19
  fixed seed when responses must be replayable across local development and CI.
20
20
 
21
- Routes whose response validator exposes no JSON Schema (zod, valibot, arktype) mock as `{}` by default.
22
- Pass `reflectJsonSchema` to derive a schema from such a validator so those routes mock real data; for zod,
23
- use the bridge shipped as `@nifrajs/testing/zod`:
21
+ A validator that implements Standard JSON Schema (`~standard.jsonSchema`, zod 4.2+ among them) mocks
22
+ real data with no wiring, and an older zod 4 is converted with `z.toJSONSchema`. Routes whose response
23
+ validator exposes neither mock as `{}` by default. Pass `reflectJsonSchema` to derive a schema from such
24
+ a validator; for zod, the bridge ships as `@nifrajs/testing/zod`:
24
25
 
25
26
  ```ts
26
27
  import { zodJsonSchema } from "@nifrajs/testing/zod"
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * for frontend-first development, agent testing, or CI smoke tests.
7
7
  */
8
8
  import { type JsonSchema } from "@nifrajs/core/reflection";
9
- export { autoReflectJsonSchema } from "./reflect-auto.js";
9
+ export { autoReflectJsonSchema, explainAutoReflectJsonSchema } from "./reflect-auto.js";
10
10
  export declare class UnsupportedMockSchemaError extends Error {
11
11
  readonly keyword: string;
12
12
  constructor(keyword: string, message: string);
@@ -44,9 +44,10 @@ export interface MockServerOptions {
44
44
  * validator but no `.jsonSchema`), so their routes mock real data instead of `{}`. Fail-safe: throwing or
45
45
  * returning undefined falls back to `{}`, as today. Ready-made for zod: `@nifrajs/testing/zod`.
46
46
  *
47
- * Defaults to {@link autoReflectJsonSchema}, which recognizes zod by its Standard Schema vendor tag and
48
- * converts via `z.toJSONSchema` when zod is installed - so zod routes mock real data with no wiring.
49
- * Pass a hook to override, or `() => undefined` to force every opaque schema back to `{}`.
47
+ * Defaults to {@link autoReflectJsonSchema}, which reads the schema's own Standard JSON Schema converter
48
+ * (`~standard.jsonSchema`, zod 4.2+ and other libraries) and, for an older zod, converts via
49
+ * `z.toJSONSchema` - so these routes mock real data with no wiring. Pass a hook to override, or
50
+ * `() => undefined` to force every opaque schema back to `{}`.
50
51
  */
51
52
  readonly reflectJsonSchema?: (schema: unknown) => JsonSchema | undefined;
52
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,0BAA0B,CAAA;AAGxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAoBzD,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM;CAKlB;AAyGD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,GAC/B,OAAO,CAiJT;AAMD,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EACZ;QACE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAC5B,GACD,SAAS,CAAA;CACd;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,MAAM,IAAI,SAAS,aAAa,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAA;CACzE;AAED,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,GACtC,UAAU,CAuFZ"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,0BAA0B,CAAA;AAGxF,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAoBvF,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM;CAKlB;AAuND;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,EACf,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,GAC/B,OAAO,CAyIT;AAMD,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,CAAC,EACZ;QACE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAC5B,GACD,SAAS,CAAA;CACd;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,MAAM,IAAI,SAAS,aAAa,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACtC;;;;;;;;;OASG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAA;CACzE;AAED,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,GACtC,UAAU,CAuFZ"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@
8
8
  import { compileRoutePattern, matchRoutePattern, sortRoutesBySpecificity, } from "@nifrajs/core/pattern";
9
9
  import { reflectRoutes, reflectSchema } from "@nifrajs/core/reflection";
10
10
  import { autoReflectJsonSchema } from "./reflect-auto.js";
11
- export { autoReflectJsonSchema } from "./reflect-auto.js";
11
+ export { autoReflectJsonSchema, explainAutoReflectJsonSchema } from "./reflect-auto.js";
12
12
  // ---------------------------------------------------------------------------
13
13
  // Seeded PRNG (deterministic mocks)
14
14
  // ---------------------------------------------------------------------------
@@ -71,6 +71,25 @@ function multipleInBounds(b, step, rand) {
71
71
  return undefined;
72
72
  return first + randomIndex(rand, Math.floor((last - first) / step) + 1) * step;
73
73
  }
74
+ /** The smallest positive integer that is a multiple of a decimal `multipleOf`: 3 for 1.5, 1 for 0.5. */
75
+ function integerMultiple(step) {
76
+ if (!(step > 0))
77
+ throw new UnsupportedMockSchemaError("multipleOf", "multipleOf must be positive");
78
+ if (Number.isInteger(step))
79
+ return step;
80
+ const text = String(step);
81
+ const dot = text.indexOf(".");
82
+ const digits = text.length - dot - 1;
83
+ if (dot === -1 || text.includes("e") || digits > 15)
84
+ throw new UnsupportedMockSchemaError("multipleOf", "Integer multipleOf must be a plain decimal");
85
+ const scale = 10 ** digits;
86
+ const numerator = Math.round(step * scale);
87
+ let a = numerator;
88
+ let b = scale;
89
+ while (b !== 0)
90
+ [a, b] = [b, a % b];
91
+ return numerator / a;
92
+ }
74
93
  /** A random number inside the bounds, rounded to cents when the rounding stays inside them. */
75
94
  function numberInBounds(b, rand) {
76
95
  // At least one ulp of `x`, so an exclusive bound moves even where `x + Number.EPSILON === x`.
@@ -112,6 +131,91 @@ function constrainedString(schema, initial, fieldName) {
112
131
  // ---------------------------------------------------------------------------
113
132
  // Schema introspection → mock value generation
114
133
  // ---------------------------------------------------------------------------
134
+ const LOWER_BOUNDS = new Set([
135
+ "minimum",
136
+ "exclusiveMinimum",
137
+ "minLength",
138
+ "minItems",
139
+ "minProperties",
140
+ ]);
141
+ const UPPER_BOUNDS = new Set([
142
+ "maximum",
143
+ "exclusiveMaximum",
144
+ "maxLength",
145
+ "maxItems",
146
+ "maxProperties",
147
+ ]);
148
+ const ANNOTATIONS = new Set([
149
+ "title",
150
+ "description",
151
+ "$comment",
152
+ "examples",
153
+ "default",
154
+ "deprecated",
155
+ ]);
156
+ const isSchemaObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
157
+ const sameJson = (a, b) => JSON.stringify(a) === JSON.stringify(b);
158
+ /** Each branch with its own nested `allOf` spread out beside it. */
159
+ function flattenIntersection(parts) {
160
+ return parts.flatMap((part) => {
161
+ const schema = reflectSchema(part).jsonSchema;
162
+ if (schema === true || schema === undefined)
163
+ return [];
164
+ if (!isSchemaObject(schema))
165
+ throw new UnsupportedMockSchemaError("allOf", "An intersection branch has no valid value");
166
+ const { allOf: nested, ...rest } = schema;
167
+ return Array.isArray(nested) ? [rest, ...flattenIntersection(nested)] : [rest];
168
+ });
169
+ }
170
+ /**
171
+ * One schema that every branch of an `allOf` accepts: bounds tighten, `required` and `properties`
172
+ * combine (a property in several branches becomes their own intersection), `type` and `enum`
173
+ * intersect. Any other keyword the branches disagree on is refused rather than guessed.
174
+ */
175
+ function mergeIntersection(parts) {
176
+ const merged = new Map();
177
+ for (const branch of flattenIntersection(parts)) {
178
+ for (const [key, value] of Object.entries(branch)) {
179
+ const current = merged.get(key);
180
+ if (current === undefined || ANNOTATIONS.has(key)) {
181
+ if (current === undefined)
182
+ merged.set(key, value);
183
+ continue;
184
+ }
185
+ if (sameJson(current, value))
186
+ continue;
187
+ if (typeof current === "number" && typeof value === "number" && LOWER_BOUNDS.has(key))
188
+ merged.set(key, Math.max(current, value));
189
+ else if (typeof current === "number" && typeof value === "number" && UPPER_BOUNDS.has(key))
190
+ merged.set(key, Math.min(current, value));
191
+ else if (key === "required" && Array.isArray(current) && Array.isArray(value))
192
+ merged.set(key, [...new Set([...current, ...value])]);
193
+ else if (key === "properties" && isSchemaObject(current) && isSchemaObject(value))
194
+ merged.set(key, mergeProperties(current, value));
195
+ else if (key === "type" || key === "enum")
196
+ merged.set(key, intersectChoices(key, current, value));
197
+ else
198
+ throw new UnsupportedMockSchemaError("allOf", `Intersection branches disagree on "${key}"`);
199
+ }
200
+ }
201
+ return Object.fromEntries(merged);
202
+ }
203
+ function mergeProperties(current, next) {
204
+ const merged = new Map(Object.entries(current));
205
+ for (const [name, schema] of Object.entries(next)) {
206
+ const existing = merged.get(name);
207
+ merged.set(name, existing === undefined ? schema : { allOf: [existing, schema] });
208
+ }
209
+ return Object.fromEntries(merged);
210
+ }
211
+ function intersectChoices(key, current, next) {
212
+ const listOf = (value) => (Array.isArray(value) ? value : [value]);
213
+ const right = listOf(next);
214
+ const shared = listOf(current).filter((choice) => right.some((other) => sameJson(choice, other)));
215
+ if (shared.length === 0)
216
+ throw new UnsupportedMockSchemaError("allOf", `Intersection branches share no "${key}"`);
217
+ return key === "type" && shared.length === 1 ? shared[0] : shared;
218
+ }
115
219
  /**
116
220
  * Generate a mock value from a schema object. Inspects JSON Schema properties
117
221
  * (`type`, `properties`, `items`, `enum`, `format`) that TypeBox / NifraSchema
@@ -159,14 +263,10 @@ export function generateMockValue(schema, fieldName, rng) {
159
263
  }
160
264
  const intersections = raw.allOf;
161
265
  if (Array.isArray(intersections) && intersections.length > 0) {
162
- const values = intersections.map((part) => generateMockValue(part, fieldName, rand));
163
- if (values.every((value) => value !== null && typeof value === "object" && !Array.isArray(value))) {
164
- return Object.assign({}, ...values);
165
- }
166
- const first = values[0];
167
- if (values.every((value) => Object.is(value, first)))
168
- return first;
169
- throw new UnsupportedMockSchemaError("allOf", "Could not prove that a scalar satisfies every intersection branch");
266
+ // Generated from one merged schema: values generated per branch and then combined satisfy only
267
+ // the branch that happened to win each key.
268
+ const { allOf: _intersections, ...siblings } = raw;
269
+ return generateMockValue(mergeIntersection([siblings, ...intersections]), fieldName, rand);
170
270
  }
171
271
  // Enum - pick the first value (deterministic) or random
172
272
  const enumValues = raw.enum;
@@ -206,7 +306,7 @@ export function generateMockValue(schema, fieldName, rng) {
206
306
  return value;
207
307
  }
208
308
  case "integer": {
209
- const step = typeof raw.multipleOf === "number" ? raw.multipleOf : 1;
309
+ const step = typeof raw.multipleOf === "number" ? integerMultiple(raw.multipleOf) : 1;
210
310
  const value = multipleInBounds(numericBounds(raw), step, rand);
211
311
  if (value === undefined)
212
312
  throw new UnsupportedMockSchemaError("integer", "No integer exists in range");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,14 @@
1
1
  import type { JsonSchema } from "@nifrajs/core/reflection";
2
2
  /**
3
- * Derive a JSON Schema from a zod Standard Schema, or `undefined` for anything else (non-zod vendors,
4
- * zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
3
+ * Derive a JSON Schema from a Standard Schema's own converter, or from zod for a zod schema without one;
4
+ * `undefined` for anything else (no converter and not zod, zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
5
5
  * opaque schema inspectable, never change one that already carries JSON Schema metadata.
6
6
  */
7
7
  export declare function autoReflectJsonSchema(schema: unknown): JsonSchema | undefined;
8
+ /**
9
+ * Why {@link autoReflectJsonSchema} could not read a schema: its converter threw or returned nothing,
10
+ * or, for a zod schema without one, zod is not resolvable or is older than 4. `undefined` for a schema
11
+ * it reads, or one it has no way to read.
12
+ */
13
+ export declare function explainAutoReflectJsonSchema(schema: unknown): string | undefined;
8
14
  //# sourceMappingURL=reflect-auto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reflect-auto.d.ts","sourceRoot":"","sources":["../src/reflect-auto.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAoB1D;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAa7E"}
1
+ {"version":3,"file":"reflect-auto.d.ts","sourceRoot":"","sources":["../src/reflect-auto.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAiG1D;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAG7E;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGhF"}
@@ -1,58 +1,140 @@
1
1
  /**
2
- * The DEFAULT `reflectJsonSchema` hook: recognize a zod schema by its Standard Schema vendor tag and
3
- * derive the inspectable JSON Schema the mock/mutation generators read - with no wiring at all.
2
+ * The DEFAULT `reflectJsonSchema` hook: derive the inspectable JSON Schema the mock/mutation generators
3
+ * read from an opaque Standard Schema - with no wiring at all.
4
4
  *
5
5
  * Standard Schema standardizes validation, not introspection, so an opaque validator normally leaves a
6
- * route unmockable (`{}`) and unwitnessed (`NO_WITNESS`) unless the caller passes a bridge. But every
7
- * Standard Schema carries `"~standard".vendor`, and zod ships its own converter (`z.toJSONSchema`,
8
- * zod 4+) - so when the vendor says "zod" and zod is resolvable from here, the bridge can be applied
9
- * automatically. Everything about it fails soft: no zod installed, an older zod without `toJSONSchema`,
10
- * a non-zod vendor, or a schema zod cannot convert (custom transforms) all return `undefined`, which is
11
- * exactly the opaque behavior a caller saw before this existed. An explicit `reflectJsonSchema` option
12
- * always wins over this default.
6
+ * route unmockable (`{}`) and unwitnessed (`NO_WITNESS`) unless the caller passes a bridge. Two sources,
7
+ * in order:
8
+ * 1. The schema's own Standard JSON Schema converter (`"~standard".jsonSchema.input`, zod 4.2+ and
9
+ * other libraries that implement it). The library that built the schema converts it, so nothing is
10
+ * resolved from disk and a monorepo whose zod sits in one app reads the same as a single package.
11
+ * 2. For a zod schema without that converter, zod's `z.toJSONSchema` (zod 4+), with zod resolved from
12
+ * the project first, then from this package.
13
+ * Everything about it fails soft: no converter, no zod installed, an older zod without `toJSONSchema`,
14
+ * or a schema the library cannot convert (custom transforms) all return `undefined`, which is exactly
15
+ * the opaque behavior a caller saw before this existed. An explicit `reflectJsonSchema` option always
16
+ * wins over this default.
13
17
  *
14
18
  * zod stays an OPTIONAL peer: it is loaded lazily via `createRequire` (never a static import), probed
15
- * once per process, and its absence is a cached miss - a zod-free project pays one failed resolve, ever.
19
+ * once per project directory, and its absence is a cached miss. {@link explainAutoReflectJsonSchema}
20
+ * says why a schema stayed opaque.
16
21
  * Conversion options mirror `@nifrajs/testing/zod` (`zodJsonSchema`), which remains the explicit form:
17
- * - target "draft-7" → the keyword set the mock generator + `candidateMutations` read
18
- * - io "input" → the request-side constraints a hostile payload must violate (pre-transform)
19
- * - reused "inline" → no `$ref`/`$defs`; the mock generator fails closed on `$ref`
22
+ * - target draft-07 → the keyword set the mock generator + `candidateMutations` read
23
+ * - the input side → the request-side constraints a hostile payload must violate (pre-transform)
24
+ * - reused "inline" → no `$ref`/`$defs`; the mock generator fails closed on `$ref` (zod only)
20
25
  */
26
+ import { existsSync } from "node:fs";
21
27
  import { createRequire } from "node:module";
28
+ import { dirname, join } from "node:path";
22
29
  const ZOD_TO_JSON_SCHEMA_OPTIONS = { target: "draft-7", io: "input", reused: "inline" };
23
- // Tri-state probe cache: `undefined` = not probed yet, `null` = zod (or its converter) is unavailable.
24
- let cachedToJSONSchema;
25
- const zodToJSONSchema = () => {
26
- if (cachedToJSONSchema !== undefined)
27
- return cachedToJSONSchema;
30
+ /**
31
+ * The directory whose `node_modules/zod` is nearest above `start`, found by walking the filesystem:
32
+ * the project's own zod is the one that built its schemas, and a resolver that memoizes per process
33
+ * would pin the first project's answer.
34
+ */
35
+ function projectZodBase(start) {
36
+ for (let dir = start;;) {
37
+ if (existsSync(join(dir, "node_modules", "zod", "package.json")))
38
+ return join(dir, "package.json");
39
+ const parent = dirname(dir);
40
+ if (parent === dir)
41
+ return undefined;
42
+ dir = parent;
43
+ }
44
+ }
45
+ const probeFrom = (base) => {
46
+ let zod;
28
47
  try {
29
- const zod = createRequire(import.meta.url)("zod");
30
- cachedToJSONSchema =
31
- typeof zod.toJSONSchema === "function" ? zod.toJSONSchema : null;
48
+ zod = createRequire(base)("zod");
32
49
  }
33
50
  catch {
34
- cachedToJSONSchema = null;
51
+ return undefined;
35
52
  }
36
- return cachedToJSONSchema;
53
+ const toJSONSchema = zod.toJSONSchema;
54
+ return typeof toJSONSchema === "function"
55
+ ? { toJSONSchema: (schema, options) => Reflect.apply(toJSONSchema, zod, [schema, options]) }
56
+ : { reason: "the zod installed is older than 4 and has no toJSONSchema" };
37
57
  };
38
- /**
39
- * Derive a JSON Schema from a zod Standard Schema, or `undefined` for anything else (non-zod vendors,
40
- * zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
41
- * opaque schema inspectable, never change one that already carries JSON Schema metadata.
42
- */
43
- export function autoReflectJsonSchema(schema) {
44
- const vendor = schema?.["~standard"]?.vendor;
45
- if (vendor !== "zod")
46
- return undefined;
47
- const toJSONSchema = zodToJSONSchema();
48
- if (toJSONSchema === null)
58
+ // Keyed by the project directory, so a long-lived process serving several projects reads each one's zod.
59
+ const probes = new Map();
60
+ const probeZod = () => {
61
+ const cwd = globalThis.process?.cwd?.() ?? "";
62
+ const cached = probes.get(cwd);
63
+ if (cached !== undefined)
64
+ return cached;
65
+ const projectBase = cwd === "" ? undefined : projectZodBase(cwd);
66
+ // A project zod that cannot convert is the answer: a newer copy here could not read its schemas.
67
+ const probe = (projectBase === undefined ? undefined : probeFrom(projectBase)) ??
68
+ probeFrom(import.meta.url) ?? {
69
+ reason: "zod is not resolvable from the project or from @nifrajs/mock",
70
+ };
71
+ probes.set(cwd, probe);
72
+ return probe;
73
+ };
74
+ // zod's name for the inline-refs option of its converter; other libraries get only the target.
75
+ const ZOD_LIBRARY_OPTIONS = { reused: "inline" };
76
+ /** The schema's own `~standard.jsonSchema.input` result, or `undefined` when it has no converter. */
77
+ function reflectStandardJsonSchema(standard, vendor) {
78
+ const converter = Reflect.get(Object(standard), "jsonSchema");
79
+ const input = Reflect.get(Object(converter), "input");
80
+ if (typeof input !== "function")
49
81
  return undefined;
82
+ const options = {
83
+ target: "draft-07",
84
+ };
85
+ if (vendor === "zod")
86
+ options.libraryOptions = ZOD_LIBRARY_OPTIONS;
50
87
  try {
51
- const json = toJSONSchema(schema, ZOD_TO_JSON_SCHEMA_OPTIONS);
52
- return json === null || json === undefined ? undefined : json;
88
+ const json = Reflect.apply(input, converter, [options]);
89
+ return json !== null && typeof json === "object"
90
+ ? { jsonSchema: json }
91
+ : { reason: `the ${String(vendor)} schema's ~standard.jsonSchema.input returned no schema` };
53
92
  }
54
- catch {
93
+ catch (error) {
94
+ return {
95
+ reason: `the ${String(vendor)} schema's ~standard.jsonSchema.input threw: ${error instanceof Error ? error.message : String(error)}`,
96
+ };
97
+ }
98
+ }
99
+ function reflectAuto(schema) {
100
+ const standard = Reflect.get(Object(schema), "~standard");
101
+ const vendor = Reflect.get(Object(standard), "vendor");
102
+ const own = reflectStandardJsonSchema(standard, vendor);
103
+ if (own !== undefined)
104
+ return own;
105
+ if (vendor !== "zod")
55
106
  return undefined;
107
+ const probe = probeZod();
108
+ if ("reason" in probe)
109
+ return probe;
110
+ try {
111
+ const json = probe.toJSONSchema(schema, ZOD_TO_JSON_SCHEMA_OPTIONS);
112
+ return json === null || json === undefined
113
+ ? { reason: "zod's toJSONSchema returned nothing" }
114
+ : { jsonSchema: json };
56
115
  }
116
+ catch (error) {
117
+ return {
118
+ reason: `zod's toJSONSchema threw: ${error instanceof Error ? error.message : String(error)}`,
119
+ };
120
+ }
121
+ }
122
+ /**
123
+ * Derive a JSON Schema from a Standard Schema's own converter, or from zod for a zod schema without one;
124
+ * `undefined` for anything else (no converter and not zod, zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
125
+ * opaque schema inspectable, never change one that already carries JSON Schema metadata.
126
+ */
127
+ export function autoReflectJsonSchema(schema) {
128
+ const reflected = reflectAuto(schema);
129
+ return reflected !== undefined && "jsonSchema" in reflected ? reflected.jsonSchema : undefined;
130
+ }
131
+ /**
132
+ * Why {@link autoReflectJsonSchema} could not read a schema: its converter threw or returned nothing,
133
+ * or, for a zod schema without one, zod is not resolvable or is older than 4. `undefined` for a schema
134
+ * it reads, or one it has no way to read.
135
+ */
136
+ export function explainAutoReflectJsonSchema(schema) {
137
+ const reflected = reflectAuto(schema);
138
+ return reflected !== undefined && "reason" in reflected ? reflected.reason : undefined;
57
139
  }
58
140
  //# sourceMappingURL=reflect-auto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reflect-auto.js","sourceRoot":"","sources":["../src/reflect-auto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,0BAA0B,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAA;AAIhG,uGAAuG;AACvG,IAAI,kBAAmD,CAAA;AACvD,MAAM,eAAe,GAAG,GAAwB,EAAE;IAChD,IAAI,kBAAkB,KAAK,SAAS;QAAE,OAAO,kBAAkB,CAAA;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAA+B,CAAA;QAC/E,kBAAkB;YAChB,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAE,GAAG,CAAC,YAA6B,CAAC,CAAC,CAAC,IAAI,CAAA;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB,GAAG,IAAI,CAAA;IAC3B,CAAC;IACD,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe;IACnD,MAAM,MAAM,GAAI,MAA+E,EAAE,CAC/F,WAAW,CACZ,EAAE,MAAM,CAAA;IACT,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,SAAS,CAAA;IACtC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAA;QAC7D,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,IAAmB,CAAA;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"reflect-auto.js","sourceRoot":"","sources":["../src/reflect-auto.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/mock",
3
- "version": "4.0.2",
3
+ "version": "5.1.0",
4
4
  "description": "Contract-based mock server - reads route schemas and generates fake responses.",
5
5
  "keywords": [
6
6
  "bun",
@@ -40,7 +40,7 @@
40
40
  "access": "public"
41
41
  },
42
42
  "dependencies": {
43
- "@nifrajs/core": "4.0.2"
43
+ "@nifrajs/core": "5.1.0"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "zod": ">=4.0.0"
package/src/index.ts CHANGED
@@ -15,7 +15,7 @@ import {
15
15
  import { type JsonSchema, reflectRoutes, reflectSchema } from "@nifrajs/core/reflection"
16
16
  import { autoReflectJsonSchema } from "./reflect-auto.ts"
17
17
 
18
- export { autoReflectJsonSchema } from "./reflect-auto.ts"
18
+ export { autoReflectJsonSchema, explainAutoReflectJsonSchema } from "./reflect-auto.ts"
19
19
 
20
20
  // ---------------------------------------------------------------------------
21
21
  // Seeded PRNG (deterministic mocks)
@@ -97,6 +97,23 @@ function multipleInBounds(b: NumericBounds, step: number, rand: () => number): n
97
97
  return first + randomIndex(rand, Math.floor((last - first) / step) + 1) * step
98
98
  }
99
99
 
100
+ /** The smallest positive integer that is a multiple of a decimal `multipleOf`: 3 for 1.5, 1 for 0.5. */
101
+ function integerMultiple(step: number): number {
102
+ if (!(step > 0)) throw new UnsupportedMockSchemaError("multipleOf", "multipleOf must be positive")
103
+ if (Number.isInteger(step)) return step
104
+ const text = String(step)
105
+ const dot = text.indexOf(".")
106
+ const digits = text.length - dot - 1
107
+ if (dot === -1 || text.includes("e") || digits > 15)
108
+ throw new UnsupportedMockSchemaError("multipleOf", "Integer multipleOf must be a plain decimal")
109
+ const scale = 10 ** digits
110
+ const numerator = Math.round(step * scale)
111
+ let a = numerator
112
+ let b = scale
113
+ while (b !== 0) [a, b] = [b, a % b]
114
+ return numerator / a
115
+ }
116
+
100
117
  /** A random number inside the bounds, rounded to cents when the rounding stays inside them. */
101
118
  function numberInBounds(b: NumericBounds, rand: () => number): number {
102
119
  // At least one ulp of `x`, so an exclusive bound moves even where `x + Number.EPSILON === x`.
@@ -148,6 +165,99 @@ function constrainedString(
148
165
  // Schema introspection → mock value generation
149
166
  // ---------------------------------------------------------------------------
150
167
 
168
+ const LOWER_BOUNDS = new Set([
169
+ "minimum",
170
+ "exclusiveMinimum",
171
+ "minLength",
172
+ "minItems",
173
+ "minProperties",
174
+ ])
175
+ const UPPER_BOUNDS = new Set([
176
+ "maximum",
177
+ "exclusiveMaximum",
178
+ "maxLength",
179
+ "maxItems",
180
+ "maxProperties",
181
+ ])
182
+ const ANNOTATIONS = new Set([
183
+ "title",
184
+ "description",
185
+ "$comment",
186
+ "examples",
187
+ "default",
188
+ "deprecated",
189
+ ])
190
+
191
+ const isSchemaObject = (value: unknown): value is Readonly<Record<string, unknown>> =>
192
+ value !== null && typeof value === "object" && !Array.isArray(value)
193
+
194
+ const sameJson = (a: unknown, b: unknown): boolean => JSON.stringify(a) === JSON.stringify(b)
195
+
196
+ /** Each branch with its own nested `allOf` spread out beside it. */
197
+ function flattenIntersection(parts: readonly unknown[]): Readonly<Record<string, unknown>>[] {
198
+ return parts.flatMap((part) => {
199
+ const schema = reflectSchema(part).jsonSchema
200
+ if (schema === true || schema === undefined) return []
201
+ if (!isSchemaObject(schema))
202
+ throw new UnsupportedMockSchemaError("allOf", "An intersection branch has no valid value")
203
+ const { allOf: nested, ...rest } = schema
204
+ return Array.isArray(nested) ? [rest, ...flattenIntersection(nested)] : [rest]
205
+ })
206
+ }
207
+
208
+ /**
209
+ * One schema that every branch of an `allOf` accepts: bounds tighten, `required` and `properties`
210
+ * combine (a property in several branches becomes their own intersection), `type` and `enum`
211
+ * intersect. Any other keyword the branches disagree on is refused rather than guessed.
212
+ */
213
+ function mergeIntersection(parts: readonly unknown[]): Record<string, unknown> {
214
+ const merged = new Map<string, unknown>()
215
+ for (const branch of flattenIntersection(parts)) {
216
+ for (const [key, value] of Object.entries(branch)) {
217
+ const current = merged.get(key)
218
+ if (current === undefined || ANNOTATIONS.has(key)) {
219
+ if (current === undefined) merged.set(key, value)
220
+ continue
221
+ }
222
+ if (sameJson(current, value)) continue
223
+ if (typeof current === "number" && typeof value === "number" && LOWER_BOUNDS.has(key))
224
+ merged.set(key, Math.max(current, value))
225
+ else if (typeof current === "number" && typeof value === "number" && UPPER_BOUNDS.has(key))
226
+ merged.set(key, Math.min(current, value))
227
+ else if (key === "required" && Array.isArray(current) && Array.isArray(value))
228
+ merged.set(key, [...new Set([...current, ...value])])
229
+ else if (key === "properties" && isSchemaObject(current) && isSchemaObject(value))
230
+ merged.set(key, mergeProperties(current, value))
231
+ else if (key === "type" || key === "enum")
232
+ merged.set(key, intersectChoices(key, current, value))
233
+ else
234
+ throw new UnsupportedMockSchemaError("allOf", `Intersection branches disagree on "${key}"`)
235
+ }
236
+ }
237
+ return Object.fromEntries(merged)
238
+ }
239
+
240
+ function mergeProperties(
241
+ current: Readonly<Record<string, unknown>>,
242
+ next: Readonly<Record<string, unknown>>,
243
+ ): Record<string, unknown> {
244
+ const merged = new Map(Object.entries(current))
245
+ for (const [name, schema] of Object.entries(next)) {
246
+ const existing = merged.get(name)
247
+ merged.set(name, existing === undefined ? schema : { allOf: [existing, schema] })
248
+ }
249
+ return Object.fromEntries(merged)
250
+ }
251
+
252
+ function intersectChoices(key: "type" | "enum", current: unknown, next: unknown): unknown {
253
+ const listOf = (value: unknown): readonly unknown[] => (Array.isArray(value) ? value : [value])
254
+ const right = listOf(next)
255
+ const shared = listOf(current).filter((choice) => right.some((other) => sameJson(choice, other)))
256
+ if (shared.length === 0)
257
+ throw new UnsupportedMockSchemaError("allOf", `Intersection branches share no "${key}"`)
258
+ return key === "type" && shared.length === 1 ? shared[0] : shared
259
+ }
260
+
151
261
  /**
152
262
  * Generate a mock value from a schema object. Inspects JSON Schema properties
153
263
  * (`type`, `properties`, `items`, `enum`, `format`) that TypeBox / NifraSchema
@@ -203,18 +313,10 @@ export function generateMockValue(
203
313
  }
204
314
  const intersections = raw.allOf as readonly unknown[] | undefined
205
315
  if (Array.isArray(intersections) && intersections.length > 0) {
206
- const values = intersections.map((part) => generateMockValue(part, fieldName, rand))
207
- if (
208
- values.every((value) => value !== null && typeof value === "object" && !Array.isArray(value))
209
- ) {
210
- return Object.assign({}, ...values)
211
- }
212
- const first = values[0]
213
- if (values.every((value) => Object.is(value, first))) return first
214
- throw new UnsupportedMockSchemaError(
215
- "allOf",
216
- "Could not prove that a scalar satisfies every intersection branch",
217
- )
316
+ // Generated from one merged schema: values generated per branch and then combined satisfy only
317
+ // the branch that happened to win each key.
318
+ const { allOf: _intersections, ...siblings } = raw
319
+ return generateMockValue(mergeIntersection([siblings, ...intersections]), fieldName, rand)
218
320
  }
219
321
 
220
322
  // Enum - pick the first value (deterministic) or random
@@ -258,7 +360,7 @@ export function generateMockValue(
258
360
  }
259
361
 
260
362
  case "integer": {
261
- const step = typeof raw.multipleOf === "number" ? raw.multipleOf : 1
363
+ const step = typeof raw.multipleOf === "number" ? integerMultiple(raw.multipleOf) : 1
262
364
  const value = multipleInBounds(numericBounds(raw), step, rand)
263
365
  if (value === undefined)
264
366
  throw new UnsupportedMockSchemaError("integer", "No integer exists in range")
@@ -339,9 +441,10 @@ export interface MockServerOptions {
339
441
  * validator but no `.jsonSchema`), so their routes mock real data instead of `{}`. Fail-safe: throwing or
340
442
  * returning undefined falls back to `{}`, as today. Ready-made for zod: `@nifrajs/testing/zod`.
341
443
  *
342
- * Defaults to {@link autoReflectJsonSchema}, which recognizes zod by its Standard Schema vendor tag and
343
- * converts via `z.toJSONSchema` when zod is installed - so zod routes mock real data with no wiring.
344
- * Pass a hook to override, or `() => undefined` to force every opaque schema back to `{}`.
444
+ * Defaults to {@link autoReflectJsonSchema}, which reads the schema's own Standard JSON Schema converter
445
+ * (`~standard.jsonSchema`, zod 4.2+ and other libraries) and, for an older zod, converts via
446
+ * `z.toJSONSchema` - so these routes mock real data with no wiring. Pass a hook to override, or
447
+ * `() => undefined` to force every opaque schema back to `{}`.
345
448
  */
346
449
  readonly reflectJsonSchema?: (schema: unknown) => JsonSchema | undefined
347
450
  }
@@ -1,60 +1,144 @@
1
1
  /**
2
- * The DEFAULT `reflectJsonSchema` hook: recognize a zod schema by its Standard Schema vendor tag and
3
- * derive the inspectable JSON Schema the mock/mutation generators read - with no wiring at all.
2
+ * The DEFAULT `reflectJsonSchema` hook: derive the inspectable JSON Schema the mock/mutation generators
3
+ * read from an opaque Standard Schema - with no wiring at all.
4
4
  *
5
5
  * Standard Schema standardizes validation, not introspection, so an opaque validator normally leaves a
6
- * route unmockable (`{}`) and unwitnessed (`NO_WITNESS`) unless the caller passes a bridge. But every
7
- * Standard Schema carries `"~standard".vendor`, and zod ships its own converter (`z.toJSONSchema`,
8
- * zod 4+) - so when the vendor says "zod" and zod is resolvable from here, the bridge can be applied
9
- * automatically. Everything about it fails soft: no zod installed, an older zod without `toJSONSchema`,
10
- * a non-zod vendor, or a schema zod cannot convert (custom transforms) all return `undefined`, which is
11
- * exactly the opaque behavior a caller saw before this existed. An explicit `reflectJsonSchema` option
12
- * always wins over this default.
6
+ * route unmockable (`{}`) and unwitnessed (`NO_WITNESS`) unless the caller passes a bridge. Two sources,
7
+ * in order:
8
+ * 1. The schema's own Standard JSON Schema converter (`"~standard".jsonSchema.input`, zod 4.2+ and
9
+ * other libraries that implement it). The library that built the schema converts it, so nothing is
10
+ * resolved from disk and a monorepo whose zod sits in one app reads the same as a single package.
11
+ * 2. For a zod schema without that converter, zod's `z.toJSONSchema` (zod 4+), with zod resolved from
12
+ * the project first, then from this package.
13
+ * Everything about it fails soft: no converter, no zod installed, an older zod without `toJSONSchema`,
14
+ * or a schema the library cannot convert (custom transforms) all return `undefined`, which is exactly
15
+ * the opaque behavior a caller saw before this existed. An explicit `reflectJsonSchema` option always
16
+ * wins over this default.
13
17
  *
14
18
  * zod stays an OPTIONAL peer: it is loaded lazily via `createRequire` (never a static import), probed
15
- * once per process, and its absence is a cached miss - a zod-free project pays one failed resolve, ever.
19
+ * once per project directory, and its absence is a cached miss. {@link explainAutoReflectJsonSchema}
20
+ * says why a schema stayed opaque.
16
21
  * Conversion options mirror `@nifrajs/testing/zod` (`zodJsonSchema`), which remains the explicit form:
17
- * - target "draft-7" → the keyword set the mock generator + `candidateMutations` read
18
- * - io "input" → the request-side constraints a hostile payload must violate (pre-transform)
19
- * - reused "inline" → no `$ref`/`$defs`; the mock generator fails closed on `$ref`
22
+ * - target draft-07 → the keyword set the mock generator + `candidateMutations` read
23
+ * - the input side → the request-side constraints a hostile payload must violate (pre-transform)
24
+ * - reused "inline" → no `$ref`/`$defs`; the mock generator fails closed on `$ref` (zod only)
20
25
  */
26
+ import { existsSync } from "node:fs"
21
27
  import { createRequire } from "node:module"
28
+ import { dirname, join } from "node:path"
22
29
  import type { JsonSchema } from "@nifrajs/core/reflection"
23
30
 
24
31
  const ZOD_TO_JSON_SCHEMA_OPTIONS = { target: "draft-7", io: "input", reused: "inline" } as const
25
32
 
26
33
  type ToJSONSchema = (schema: unknown, options?: unknown) => unknown
34
+ type ZodProbe = { readonly toJSONSchema: ToJSONSchema } | { readonly reason: string }
27
35
 
28
- // Tri-state probe cache: `undefined` = not probed yet, `null` = zod (or its converter) is unavailable.
29
- let cachedToJSONSchema: ToJSONSchema | null | undefined
30
- const zodToJSONSchema = (): ToJSONSchema | null => {
31
- if (cachedToJSONSchema !== undefined) return cachedToJSONSchema
36
+ /**
37
+ * The directory whose `node_modules/zod` is nearest above `start`, found by walking the filesystem:
38
+ * the project's own zod is the one that built its schemas, and a resolver that memoizes per process
39
+ * would pin the first project's answer.
40
+ */
41
+ function projectZodBase(start: string): string | undefined {
42
+ for (let dir = start; ; ) {
43
+ if (existsSync(join(dir, "node_modules", "zod", "package.json")))
44
+ return join(dir, "package.json")
45
+ const parent = dirname(dir)
46
+ if (parent === dir) return undefined
47
+ dir = parent
48
+ }
49
+ }
50
+
51
+ const probeFrom = (base: string): ZodProbe | undefined => {
52
+ let zod: { readonly toJSONSchema?: unknown }
32
53
  try {
33
- const zod = createRequire(import.meta.url)("zod") as { toJSONSchema?: unknown }
34
- cachedToJSONSchema =
35
- typeof zod.toJSONSchema === "function" ? (zod.toJSONSchema as ToJSONSchema) : null
54
+ zod = createRequire(base)("zod")
36
55
  } catch {
37
- cachedToJSONSchema = null
56
+ return undefined
57
+ }
58
+ const toJSONSchema = zod.toJSONSchema
59
+ return typeof toJSONSchema === "function"
60
+ ? { toJSONSchema: (schema, options) => Reflect.apply(toJSONSchema, zod, [schema, options]) }
61
+ : { reason: "the zod installed is older than 4 and has no toJSONSchema" }
62
+ }
63
+
64
+ // Keyed by the project directory, so a long-lived process serving several projects reads each one's zod.
65
+ const probes = new Map<string, ZodProbe>()
66
+ const probeZod = (): ZodProbe => {
67
+ const cwd = globalThis.process?.cwd?.() ?? ""
68
+ const cached = probes.get(cwd)
69
+ if (cached !== undefined) return cached
70
+ const projectBase = cwd === "" ? undefined : projectZodBase(cwd)
71
+ // A project zod that cannot convert is the answer: a newer copy here could not read its schemas.
72
+ const probe = (projectBase === undefined ? undefined : probeFrom(projectBase)) ??
73
+ probeFrom(import.meta.url) ?? {
74
+ reason: "zod is not resolvable from the project or from @nifrajs/mock",
75
+ }
76
+ probes.set(cwd, probe)
77
+ return probe
78
+ }
79
+
80
+ type AutoReflection = { readonly jsonSchema: JsonSchema } | { readonly reason: string }
81
+
82
+ // zod's name for the inline-refs option of its converter; other libraries get only the target.
83
+ const ZOD_LIBRARY_OPTIONS = { reused: "inline" } as const
84
+
85
+ /** The schema's own `~standard.jsonSchema.input` result, or `undefined` when it has no converter. */
86
+ function reflectStandardJsonSchema(standard: unknown, vendor: unknown): AutoReflection | undefined {
87
+ const converter: unknown = Reflect.get(Object(standard), "jsonSchema")
88
+ const input: unknown = Reflect.get(Object(converter), "input")
89
+ if (typeof input !== "function") return undefined
90
+ const options: { target: string; libraryOptions?: Record<string, unknown> } = {
91
+ target: "draft-07",
92
+ }
93
+ if (vendor === "zod") options.libraryOptions = ZOD_LIBRARY_OPTIONS
94
+ try {
95
+ const json: unknown = Reflect.apply(input, converter, [options])
96
+ return json !== null && typeof json === "object"
97
+ ? { jsonSchema: json as JsonSchema }
98
+ : { reason: `the ${String(vendor)} schema's ~standard.jsonSchema.input returned no schema` }
99
+ } catch (error) {
100
+ return {
101
+ reason: `the ${String(vendor)} schema's ~standard.jsonSchema.input threw: ${error instanceof Error ? error.message : String(error)}`,
102
+ }
103
+ }
104
+ }
105
+
106
+ function reflectAuto(schema: unknown): AutoReflection | undefined {
107
+ const standard: unknown = Reflect.get(Object(schema), "~standard")
108
+ const vendor: unknown = Reflect.get(Object(standard), "vendor")
109
+ const own = reflectStandardJsonSchema(standard, vendor)
110
+ if (own !== undefined) return own
111
+ if (vendor !== "zod") return undefined
112
+ const probe = probeZod()
113
+ if ("reason" in probe) return probe
114
+ try {
115
+ const json = probe.toJSONSchema(schema, ZOD_TO_JSON_SCHEMA_OPTIONS)
116
+ return json === null || json === undefined
117
+ ? { reason: "zod's toJSONSchema returned nothing" }
118
+ : { jsonSchema: json as JsonSchema }
119
+ } catch (error) {
120
+ return {
121
+ reason: `zod's toJSONSchema threw: ${error instanceof Error ? error.message : String(error)}`,
122
+ }
38
123
  }
39
- return cachedToJSONSchema
40
124
  }
41
125
 
42
126
  /**
43
- * Derive a JSON Schema from a zod Standard Schema, or `undefined` for anything else (non-zod vendors,
44
- * zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
127
+ * Derive a JSON Schema from a Standard Schema's own converter, or from zod for a zod schema without one;
128
+ * `undefined` for anything else (no converter and not zod, zod not installed, unconvertible schemas). Safe as an always-on default: it can only ever turn an
45
129
  * opaque schema inspectable, never change one that already carries JSON Schema metadata.
46
130
  */
47
131
  export function autoReflectJsonSchema(schema: unknown): JsonSchema | undefined {
48
- const vendor = (schema as { readonly "~standard"?: { readonly vendor?: unknown } } | undefined)?.[
49
- "~standard"
50
- ]?.vendor
51
- if (vendor !== "zod") return undefined
52
- const toJSONSchema = zodToJSONSchema()
53
- if (toJSONSchema === null) return undefined
54
- try {
55
- const json = toJSONSchema(schema, ZOD_TO_JSON_SCHEMA_OPTIONS)
56
- return json === null || json === undefined ? undefined : (json as JsonSchema)
57
- } catch {
58
- return undefined
59
- }
132
+ const reflected = reflectAuto(schema)
133
+ return reflected !== undefined && "jsonSchema" in reflected ? reflected.jsonSchema : undefined
134
+ }
135
+
136
+ /**
137
+ * Why {@link autoReflectJsonSchema} could not read a schema: its converter threw or returned nothing,
138
+ * or, for a zod schema without one, zod is not resolvable or is older than 4. `undefined` for a schema
139
+ * it reads, or one it has no way to read.
140
+ */
141
+ export function explainAutoReflectJsonSchema(schema: unknown): string | undefined {
142
+ const reflected = reflectAuto(schema)
143
+ return reflected !== undefined && "reason" in reflected ? reflected.reason : undefined
60
144
  }