zod-nest 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { JSONSchema, $ZodTypes } from 'zod/v4/core';
3
+ import { BadRequestException, ArgumentMetadata, PipeTransform } from '@nestjs/common';
3
4
 
4
5
  /** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */
5
6
  declare const COMPONENTS_SCHEMAS_PREFIX = "#/components/schemas/";
@@ -115,4 +116,63 @@ declare const makeZodDtoMarker: (dtoId: string, io: Io) => ZodDtoMarker;
115
116
  /** Phase 2e (and tests) use this to discriminate a marker from a real schema. */
116
117
  declare const isZodDtoMarker: (value: unknown) => value is ZodDtoMarker;
117
118
 
118
- export { COMPONENTS_SCHEMAS_PREFIX, type CreateZodDtoOptions, type Io, type Override, type OverrideContext, type SchemaObject, type ToOpenApiOptions, type ToOpenApiResult, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, type ZodDto, type ZodDtoMarker, ZodNestError, type ZodNestRegistry, ZodNestUnrepresentableError, createRegistry, createZodDto, defaultRegistry, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
119
+ /**
120
+ * Runtime guard: is `value` a class returned by `createZodDto`?
121
+ *
122
+ * Used by the validation pipe (Phase 2c), the serializer interceptor (2d),
123
+ * and the doc merger (2e) to discriminate zod-nest DTOs from plain
124
+ * constructors, class-validator DTOs, primitives, and any other metatypes
125
+ * NestJS exposes via `ArgumentMetadata`.
126
+ */
127
+ declare const isZodDto: (value: unknown) => value is ZodDto;
128
+
129
+ /**
130
+ * Default exception thrown by `ZodValidationPipe` when input fails to parse.
131
+ *
132
+ * Body shape (returned by `getResponse()`):
133
+ * ```
134
+ * {
135
+ * statusCode: 400,
136
+ * message: 'Validation failed',
137
+ * errors: z.treeifyError(zodError),
138
+ * }
139
+ * ```
140
+ *
141
+ * Carries `zodError` and `argMetadata` so custom exception filters can
142
+ * introspect the original validation failure.
143
+ */
144
+ declare class ZodValidationException extends BadRequestException {
145
+ readonly zodError: z.ZodError;
146
+ readonly argMetadata?: ArgumentMetadata;
147
+ constructor(zodError: z.ZodError, argMetadata?: ArgumentMetadata);
148
+ }
149
+
150
+ /**
151
+ * Build the exception thrown by `ZodValidationPipe` on validation failure.
152
+ * Receives Zod's error and the NestJS argument metadata; returns anything
153
+ * `throw`-able (typically a NestJS `HttpException` subclass).
154
+ */
155
+ type CreateValidationException = (zodError: z.ZodError, argMetadata: ArgumentMetadata) => unknown;
156
+ interface ZodValidationPipeOptions {
157
+ schema?: z.ZodType | ZodDto;
158
+ createValidationException?: CreateValidationException;
159
+ }
160
+ /**
161
+ * Constructor input for `ZodValidationPipe`. Discriminated at runtime:
162
+ * - `undefined` → metatype-driven (read DTO from handler arg's metatype)
163
+ * - a class with `[ZOD_DTO_SYMBOL]` → explicit DTO
164
+ * - a Zod schema (has `_zod` internals) → raw schema
165
+ * - anything else → options object
166
+ */
167
+ type ZodValidationPipeArg = z.ZodType | ZodDto | ZodValidationPipeOptions;
168
+
169
+ declare class ZodValidationPipe implements PipeTransform {
170
+ private readonly explicitSchema;
171
+ private readonly createValidationException;
172
+ constructor(arg?: ZodValidationPipeArg);
173
+ transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown>;
174
+ private resolveSchema;
175
+ private static parseArg;
176
+ }
177
+
178
+ export { COMPONENTS_SCHEMAS_PREFIX, type CreateValidationException, type CreateZodDtoOptions, type Io, type Override, type OverrideContext, type SchemaObject, type ToOpenApiOptions, type ToOpenApiResult, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, type ZodDto, type ZodDtoMarker, ZodNestError, type ZodNestRegistry, ZodNestUnrepresentableError, ZodValidationException, ZodValidationPipe, type ZodValidationPipeArg, type ZodValidationPipeOptions, createRegistry, createZodDto, defaultRegistry, isZodDto, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { JSONSchema, $ZodTypes } from 'zod/v4/core';
3
+ import { BadRequestException, ArgumentMetadata, PipeTransform } from '@nestjs/common';
3
4
 
4
5
  /** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */
5
6
  declare const COMPONENTS_SCHEMAS_PREFIX = "#/components/schemas/";
@@ -115,4 +116,63 @@ declare const makeZodDtoMarker: (dtoId: string, io: Io) => ZodDtoMarker;
115
116
  /** Phase 2e (and tests) use this to discriminate a marker from a real schema. */
116
117
  declare const isZodDtoMarker: (value: unknown) => value is ZodDtoMarker;
117
118
 
118
- export { COMPONENTS_SCHEMAS_PREFIX, type CreateZodDtoOptions, type Io, type Override, type OverrideContext, type SchemaObject, type ToOpenApiOptions, type ToOpenApiResult, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, type ZodDto, type ZodDtoMarker, ZodNestError, type ZodNestRegistry, ZodNestUnrepresentableError, createRegistry, createZodDto, defaultRegistry, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
119
+ /**
120
+ * Runtime guard: is `value` a class returned by `createZodDto`?
121
+ *
122
+ * Used by the validation pipe (Phase 2c), the serializer interceptor (2d),
123
+ * and the doc merger (2e) to discriminate zod-nest DTOs from plain
124
+ * constructors, class-validator DTOs, primitives, and any other metatypes
125
+ * NestJS exposes via `ArgumentMetadata`.
126
+ */
127
+ declare const isZodDto: (value: unknown) => value is ZodDto;
128
+
129
+ /**
130
+ * Default exception thrown by `ZodValidationPipe` when input fails to parse.
131
+ *
132
+ * Body shape (returned by `getResponse()`):
133
+ * ```
134
+ * {
135
+ * statusCode: 400,
136
+ * message: 'Validation failed',
137
+ * errors: z.treeifyError(zodError),
138
+ * }
139
+ * ```
140
+ *
141
+ * Carries `zodError` and `argMetadata` so custom exception filters can
142
+ * introspect the original validation failure.
143
+ */
144
+ declare class ZodValidationException extends BadRequestException {
145
+ readonly zodError: z.ZodError;
146
+ readonly argMetadata?: ArgumentMetadata;
147
+ constructor(zodError: z.ZodError, argMetadata?: ArgumentMetadata);
148
+ }
149
+
150
+ /**
151
+ * Build the exception thrown by `ZodValidationPipe` on validation failure.
152
+ * Receives Zod's error and the NestJS argument metadata; returns anything
153
+ * `throw`-able (typically a NestJS `HttpException` subclass).
154
+ */
155
+ type CreateValidationException = (zodError: z.ZodError, argMetadata: ArgumentMetadata) => unknown;
156
+ interface ZodValidationPipeOptions {
157
+ schema?: z.ZodType | ZodDto;
158
+ createValidationException?: CreateValidationException;
159
+ }
160
+ /**
161
+ * Constructor input for `ZodValidationPipe`. Discriminated at runtime:
162
+ * - `undefined` → metatype-driven (read DTO from handler arg's metatype)
163
+ * - a class with `[ZOD_DTO_SYMBOL]` → explicit DTO
164
+ * - a Zod schema (has `_zod` internals) → raw schema
165
+ * - anything else → options object
166
+ */
167
+ type ZodValidationPipeArg = z.ZodType | ZodDto | ZodValidationPipeOptions;
168
+
169
+ declare class ZodValidationPipe implements PipeTransform {
170
+ private readonly explicitSchema;
171
+ private readonly createValidationException;
172
+ constructor(arg?: ZodValidationPipeArg);
173
+ transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown>;
174
+ private resolveSchema;
175
+ private static parseArg;
176
+ }
177
+
178
+ export { COMPONENTS_SCHEMAS_PREFIX, type CreateValidationException, type CreateZodDtoOptions, type Io, type Override, type OverrideContext, type SchemaObject, type ToOpenApiOptions, type ToOpenApiResult, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, type ZodDto, type ZodDtoMarker, ZodNestError, type ZodNestRegistry, ZodNestUnrepresentableError, ZodValidationException, ZodValidationPipe, type ZodValidationPipeArg, type ZodValidationPipeOptions, createRegistry, createZodDto, defaultRegistry, isZodDto, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
package/dist/index.js CHANGED
@@ -1,6 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  var zod = require('zod');
4
+ var common = require('@nestjs/common');
5
+
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __decorateClass = (decorators, target, key, kind) => {
8
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
9
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
10
+ if (decorator = decorators[i])
11
+ result = (decorator(result)) || result;
12
+ return result;
13
+ };
14
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
4
15
 
5
16
  // src/schema/constants.ts
6
17
  var COMPONENTS_SCHEMAS_PREFIX = "#/components/schemas/";
@@ -307,6 +318,79 @@ var createZodDto = (schema, options) => {
307
318
  return ZodDtoBase;
308
319
  };
309
320
 
321
+ // src/dto/predicates.ts
322
+ var isZodDto = (value) => typeof value === "function" && value[ZOD_DTO_SYMBOL] === true;
323
+ var ZodValidationException = class extends common.BadRequestException {
324
+ zodError;
325
+ argMetadata;
326
+ constructor(zodError, argMetadata) {
327
+ super({
328
+ statusCode: common.HttpStatus.BAD_REQUEST,
329
+ message: "Validation failed",
330
+ errors: zod.z.treeifyError(zodError)
331
+ });
332
+ this.zodError = zodError;
333
+ this.argMetadata = argMetadata;
334
+ }
335
+ };
336
+ var isZodSchema = (value) => value !== null && typeof value === "object" && "_zod" in value;
337
+ var isOptionsObject = (value) => value !== null && typeof value === "object" && !isZodSchema(value);
338
+ var defaultExceptionFactory = (zodError, argMetadata) => new ZodValidationException(zodError, argMetadata);
339
+ exports.ZodValidationPipe = class ZodValidationPipe {
340
+ explicitSchema;
341
+ createValidationException;
342
+ constructor(arg) {
343
+ const { schema, factory } = exports.ZodValidationPipe.parseArg(arg);
344
+ this.explicitSchema = schema;
345
+ this.createValidationException = factory;
346
+ }
347
+ async transform(value, metadata) {
348
+ const schema = this.resolveSchema(metadata);
349
+ if (schema === void 0) {
350
+ return value;
351
+ }
352
+ const result = await schema.safeParseAsync(value);
353
+ if (result.success) {
354
+ return result.data;
355
+ }
356
+ throw this.createValidationException(result.error, metadata);
357
+ }
358
+ resolveSchema(metadata) {
359
+ if (this.explicitSchema !== void 0) {
360
+ return this.explicitSchema;
361
+ }
362
+ const metatype = metadata.metatype;
363
+ if (!isZodDto(metatype)) {
364
+ return void 0;
365
+ }
366
+ return metatype.schema;
367
+ }
368
+ static parseArg(arg) {
369
+ if (arg === void 0) {
370
+ return { schema: void 0, factory: defaultExceptionFactory };
371
+ }
372
+ if (isZodDto(arg)) {
373
+ return { schema: arg.schema, factory: defaultExceptionFactory };
374
+ }
375
+ if (isZodSchema(arg)) {
376
+ return { schema: arg, factory: defaultExceptionFactory };
377
+ }
378
+ if (!isOptionsObject(arg)) {
379
+ return { schema: void 0, factory: defaultExceptionFactory };
380
+ }
381
+ const optionSchema = arg.schema;
382
+ const resolvedSchema = isZodDto(optionSchema) ? optionSchema.schema : optionSchema;
383
+ return {
384
+ schema: resolvedSchema,
385
+ factory: arg.createValidationException ?? defaultExceptionFactory
386
+ };
387
+ }
388
+ };
389
+ exports.ZodValidationPipe = __decorateClass([
390
+ common.Injectable(),
391
+ __decorateParam(0, common.Optional())
392
+ ], exports.ZodValidationPipe);
393
+
310
394
  exports.COMPONENTS_SCHEMAS_PREFIX = COMPONENTS_SCHEMAS_PREFIX;
311
395
  exports.ZOD_DTO_SYMBOL = ZOD_DTO_SYMBOL;
312
396
  exports.ZOD_NEST_DTO_EXTENSION = ZOD_NEST_DTO_EXTENSION;
@@ -314,9 +398,11 @@ exports.ZOD_NEST_ERROR_DUPLICATE_ID = ZOD_NEST_ERROR_DUPLICATE_ID;
314
398
  exports.ZOD_NEST_ERROR_EXTENSION = ZOD_NEST_ERROR_EXTENSION;
315
399
  exports.ZodNestError = ZodNestError;
316
400
  exports.ZodNestUnrepresentableError = ZodNestUnrepresentableError;
401
+ exports.ZodValidationException = ZodValidationException;
317
402
  exports.createRegistry = createRegistry;
318
403
  exports.createZodDto = createZodDto;
319
404
  exports.defaultRegistry = defaultRegistry;
405
+ exports.isZodDto = isZodDto;
320
406
  exports.isZodDtoMarker = isZodDtoMarker;
321
407
  exports.makeZodDtoMarker = makeZodDtoMarker;
322
408
  exports.toOpenApi = toOpenApi;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema/constants.ts","../src/schema/errors.ts","../src/schema/override.ts","../src/schema/post-process.ts","../src/schema/engine.ts","../src/schema/registry.ts","../src/dto/marker.ts","../src/dto/symbols.ts","../src/dto/output-dto.ts","../src/dto/create-zod-dto.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */\nexport const COMPONENTS_SCHEMAS_PREFIX = '#/components/schemas/';\n\n/** OpenAPI extension key zod-nest uses to surface engine errors inside emitted schemas. */\nexport const ZOD_NEST_ERROR_EXTENSION = 'x-zod-nest-error';\n\n/** Value of `x-zod-nest-error` when a registry id is claimed by more than one schema. */\nexport const ZOD_NEST_ERROR_DUPLICATE_ID = 'duplicate-id';\n\n/**\n * OpenAPI extension key used by `createZodDto` to mark a class for Phase 2e's\n * doc-merger. The marker carries `{ __zodNestDto: true, dtoId, io }` so the\n * merger can locate every zod-nest DTO in the @nestjs/swagger document and\n * inject the real Zod-derived schema.\n */\nexport const ZOD_NEST_DTO_EXTENSION = 'x-zod-nest-dto';\n","export class ZodNestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZodNestError';\n }\n}\n\nexport class ZodNestUnrepresentableError extends ZodNestError {\n readonly path: ReadonlyArray<string | number>;\n readonly zodType: string;\n\n constructor(path: ReadonlyArray<string | number>, zodType: string) {\n super(\n `Unrepresentable Zod schema \\`${zodType}\\` at ${formatPath(path)}: no override produced ` +\n `a JSON Schema body. Set strict: false to emit \\`{}\\` instead, or supply an \\`override\\` ` +\n `that handles this Zod type.`,\n );\n this.name = 'ZodNestUnrepresentableError';\n this.path = path;\n this.zodType = zodType;\n }\n}\n\nconst formatPath = (path: ReadonlyArray<string | number>): string => {\n if (path.length === 0) {\n return '<root>';\n }\n return '/' + path.map(String).join('/');\n};\n","import type { $ZodTypes } from 'zod/v4/core';\nimport type { SchemaObject } from './openapi.types.js';\n\nexport interface OverrideContext {\n zodSchema: $ZodTypes;\n jsonSchema: SchemaObject;\n path: (string | number)[];\n}\n\nexport type Override = (ctx: OverrideContext) => void;\n\nexport const builtInOverride: Override = ({ zodSchema, jsonSchema }) => {\n const type = zodSchema._zod.def.type;\n if (type === 'bigint') {\n jsonSchema.type = 'integer';\n return;\n }\n if (type === 'date') {\n jsonSchema.type = 'string';\n jsonSchema.format = 'date-time';\n return;\n }\n};\n\nconst STRICT_REQUIRES_OVERRIDE: ReadonlySet<string> = new Set([\n 'bigint',\n 'date',\n 'symbol',\n 'undefined',\n 'void',\n 'map',\n 'set',\n 'transform',\n 'nan',\n 'custom',\n]);\n\nexport const isStrictlyUnrepresentable = (\n jsonSchema: SchemaObject,\n zodSchema: $ZodTypes,\n): boolean => {\n if (!STRICT_REQUIRES_OVERRIDE.has(zodSchema._zod.def.type)) {\n return false;\n }\n return Object.keys(jsonSchema).length === 0;\n};\n\nexport const combine = (...overrides: ReadonlyArray<Override | undefined>): Override => {\n const list: Override[] = [];\n for (const candidate of overrides) {\n if (typeof candidate !== 'function') {\n continue;\n }\n list.push(candidate);\n }\n if (list.length === 0) {\n return () => undefined;\n }\n return (ctx) => {\n for (const o of list) {\n o(ctx);\n }\n };\n};\n","import type { SchemaObject } from './openapi.types.js';\n\nimport { COMPONENTS_SCHEMAS_PREFIX } from './constants.js';\n\nexport interface PostProcessResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\nconst DEFS_PREFIX = '#/$defs/';\n\nconst rewriteRefs = (node: unknown, selfRef: string | undefined): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n rewriteRefs(item, selfRef);\n }\n return;\n }\n if (node === null || typeof node !== 'object') {\n return;\n }\n const obj = node as Record<string, unknown>;\n const ref = obj.$ref;\n if (typeof ref === 'string' && ref.startsWith(DEFS_PREFIX)) {\n obj.$ref = COMPONENTS_SCHEMAS_PREFIX + ref.slice(DEFS_PREFIX.length);\n } else if (ref === '#' && selfRef !== undefined) {\n // Zod emits '#' for cycle refs back to the document root. When we lift a\n // named schema into its own components.schemas entry, '#' should resolve\n // to that entry's own URI.\n obj.$ref = selfRef;\n }\n for (const value of Object.values(obj)) {\n rewriteRefs(value, selfRef);\n }\n};\n\nexport const postProcess = (raw: SchemaObject): PostProcessResult => {\n const refs = new Map<string, SchemaObject>();\n const rawDefs = raw.$defs;\n if (rawDefs !== undefined) {\n for (const [id, body] of Object.entries(rawDefs)) {\n refs.set(id, body);\n }\n }\n\n const root: SchemaObject = { ...raw };\n delete root.$schema;\n delete root.$defs;\n\n // Root has no own self-uri at the 2a level. If the root is a bare `$ref` to a\n // lifted named schema (the common case when input itself has `.meta({ id })`),\n // we'll have already rewritten it to '#/components/schemas/<id>'.\n rewriteRefs(root, undefined);\n\n for (const [id, body] of refs) {\n rewriteRefs(body, `${COMPONENTS_SCHEMAS_PREFIX}${id}`);\n }\n\n return { schema: root, refs };\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from './openapi.types.js';\nimport type { Override } from './override.js';\nimport type { ZodNestRegistry } from './registry.js';\n\nimport { ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION } from './constants.js';\nimport { ZodNestUnrepresentableError } from './errors.js';\nimport { builtInOverride, combine, isStrictlyUnrepresentable } from './override.js';\nimport { postProcess } from './post-process.js';\n\nexport interface ToOpenApiOptions {\n io: 'input' | 'output';\n registry: ZodNestRegistry;\n override?: Override;\n strict?: boolean;\n}\n\nexport interface ToOpenApiResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\ninterface UnrepresentableHit {\n path: (string | number)[];\n zodType: string;\n}\n\nexport const toOpenApi = (schema: z.ZodType, opts: ToOpenApiOptions): ToOpenApiResult => {\n const strict = opts.strict ?? true;\n const merged = combine(builtInOverride, opts.override);\n const unrepresentableHits: UnrepresentableHit[] = [];\n\n const wrapped: Override = (ctx) => {\n merged(ctx);\n if (!strict || !isStrictlyUnrepresentable(ctx.jsonSchema, ctx.zodSchema)) {\n return;\n }\n unrepresentableHits.push({\n path: [...ctx.path],\n zodType: ctx.zodSchema._zod.def.type,\n });\n };\n\n const raw = z.toJSONSchema(schema, {\n target: 'draft-2020-12',\n io: opts.io,\n unrepresentable: 'any',\n metadata: opts.registry.zodRegistry,\n override: wrapped,\n cycles: 'ref',\n reused: 'inline',\n });\n\n const firstHit = unrepresentableHits[0];\n if (firstHit !== undefined) {\n throw new ZodNestUnrepresentableError(firstHit.path, firstHit.zodType);\n }\n\n const result = postProcess(raw);\n\n for (const [id] of opts.registry.getCollisions()) {\n if (!result.refs.has(id)) {\n continue;\n }\n result.refs.set(id, {\n description: `ERROR: duplicate zod-nest id <${id}>`,\n [ZOD_NEST_ERROR_EXTENSION]: ZOD_NEST_ERROR_DUPLICATE_ID,\n });\n }\n\n return result;\n};\n","import { z } from 'zod';\n\nexport interface ZodNestRegistry {\n readonly zodRegistry: typeof z.globalRegistry;\n register(schema: z.ZodType, id: string): void;\n hasCollision(id: string): boolean;\n getCollisions(): ReadonlyMap<string, ReadonlySet<z.ZodType>>;\n}\n\nexport const createRegistry = (): ZodNestRegistry => {\n const seen = new Map<string, Set<z.ZodType>>();\n\n return {\n zodRegistry: z.globalRegistry,\n register: (schema, id) => {\n z.globalRegistry.add(schema, { id });\n let set = seen.get(id);\n if (set === undefined) {\n set = new Set<z.ZodType>();\n seen.set(id, set);\n }\n set.add(schema);\n },\n hasCollision: (id) => {\n const set = seen.get(id);\n return set !== undefined && set.size > 1;\n },\n getCollisions: () => {\n const out = new Map<string, Set<z.ZodType>>();\n for (const [id, set] of seen) {\n if (set.size <= 1) {\n continue;\n }\n out.set(id, set);\n }\n return out;\n },\n };\n};\n\n/**\n * Process-wide default registry. `createZodDto` registers schemas here unless\n * the caller passes `options.registry`. Phase 2e's doc merger reads from the\n * same instance for bulk emission. Multi-app WeakMap isolation is deferred\n * to v0.2.\n */\nexport const defaultRegistry: ZodNestRegistry = createRegistry();\n","import type { Io } from './dto.types.js';\n\n/**\n * Payload of the `x-zod-nest-dto` placeholder property that\n * `_OPENAPI_METADATA_FACTORY` returns. Phase 2e's doc merger reads this off\n * each `components.schemas.<DtoName>.properties[x-zod-nest-dto]` entry,\n * uses `dtoId` to look up the schema in the registry, and replaces the\n * synthetic schema body with the real Zod-derived schema.\n *\n * `type` and `required` are benign filler that satisfy @nestjs/swagger's\n * property-type guard (without them, the explorer throws \"A circular\n * dependency has been detected\"). They have no semantic meaning and are\n * stripped along with the rest of the marker by Phase 2e.\n */\nexport interface ZodDtoMarker {\n readonly type: () => typeof Object;\n readonly required: false;\n readonly __zodNestDto: true;\n readonly dtoId: string;\n readonly io: Io;\n}\n\nexport const makeZodDtoMarker = (dtoId: string, io: Io): ZodDtoMarker => ({\n type: () => Object,\n required: false,\n __zodNestDto: true,\n dtoId,\n io,\n});\n\n/** Phase 2e (and tests) use this to discriminate a marker from a real schema. */\nexport const isZodDtoMarker = (value: unknown): value is ZodDtoMarker => {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as { __zodNestDto?: unknown }).__zodNestDto === true;\n};\n","/**\n * Runtime detection marker placed on every class returned by `createZodDto`.\n * Used by the validation pipe (Phase 2c), serializer (2d), and doc merger (2e)\n * to discriminate zod-nest DTO classes from regular constructors.\n */\nexport const ZOD_DTO_SYMBOL: unique symbol = Symbol.for('zod-nest.dto');\n","import type { z } from 'zod';\nimport type { Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Cache of `parent -> output-sibling` so repeated reads of `Dto.Output` return\n * the same class instance. WeakMap so the sibling can be GC'd if the parent is.\n */\nconst outputCache = new WeakMap<ZodDto<z.ZodType>, ZodDto<z.ZodType>>();\n\n/**\n * `.Output` is always a distinct sibling class — it carries `io: 'output'` so\n * the Phase 2e doc-merger can run the output-side emission and apply the\n * suffix truth table (`Foo` alone vs `Foo` + `FooOutput`) based on actual JSON\n * Schema equality at doc-build time. The earlier \"return self when io-identical\"\n * optimization was dropped because `z.object()` already diverges at the JSON\n * Schema level (input is permissive, output sets `additionalProperties: false`),\n * which would have made the sibling reused only for non-object roots — not\n * worth the implementation complexity.\n */\nconst buildSiblingClass = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const SiblingClass = class {\n static readonly schema = schema;\n static readonly io: Io = 'output';\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return parent.id;\n }\n\n static get Output(): ZodDto<TSchema> {\n return this as unknown as ZodDto<TSchema>;\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(parent.id, 'output') };\n }\n };\n return SiblingClass as unknown as ZodDto<TSchema>;\n};\n\nexport const resolveOutput = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const cached = outputCache.get(parent as ZodDto<z.ZodType>);\n if (cached !== undefined) {\n return cached as ZodDto<TSchema>;\n }\n const sibling = buildSiblingClass(parent, schema);\n outputCache.set(parent as ZodDto<z.ZodType>, sibling as ZodDto<z.ZodType>);\n return sibling;\n};\n","import type { z } from 'zod';\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { CreateZodDtoOptions, Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { resolveOutput } from './output-dto.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\nlet anonCounter = 0;\nlet warnedOnAnonymous = false;\n\nconst resolveId = (\n registry: ZodNestRegistry,\n schema: z.ZodType,\n providedId: string | undefined,\n className: string,\n): string => {\n if (providedId !== undefined && providedId !== '') {\n return providedId;\n }\n const meta = registry.zodRegistry.get(schema) as { id?: string } | undefined;\n if (meta && typeof meta.id === 'string' && meta.id !== '') {\n return meta.id;\n }\n if (className !== '' && className.length > 1) {\n return className;\n }\n anonCounter += 1;\n const fallback = `_AnonZodDto_${anonCounter}`;\n if (!warnedOnAnonymous) {\n warnedOnAnonymous = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[zod-nest] Could not resolve a DTO id from class name (got \"${className}\"). ` +\n `Using \"${fallback}\". Pass \\`createZodDto(schema, { id: 'Foo' })\\` to set a stable ` +\n `name — important under minification, where class names become single mangled characters.`,\n );\n }\n return fallback;\n};\n\nexport const createZodDto = <TSchema extends z.ZodType>(\n schema: TSchema,\n options?: CreateZodDtoOptions,\n): ZodDto<TSchema> => {\n const registry: ZodNestRegistry = options?.registry ?? defaultRegistry;\n const io: Io = 'input';\n let cachedId: string | undefined;\n\n const ensureRegistered = (className: string): string => {\n if (cachedId !== undefined) {\n return cachedId;\n }\n cachedId = resolveId(registry, schema, options?.id, className);\n registry.register(schema, cachedId);\n return cachedId;\n };\n\n const ZodDtoBase = class {\n static readonly schema = schema;\n static readonly io: Io = io;\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return ensureRegistered(this.name);\n }\n\n static get Output(): ZodDto<TSchema> {\n return resolveOutput(this as unknown as ZodDto<TSchema>, schema);\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(ensureRegistered(this.name), io) };\n }\n };\n\n return ZodDtoBase as unknown as ZodDto<TSchema>;\n};\n"]}
1
+ {"version":3,"sources":["../src/schema/constants.ts","../src/schema/errors.ts","../src/schema/override.ts","../src/schema/post-process.ts","../src/schema/engine.ts","../src/schema/registry.ts","../src/dto/marker.ts","../src/dto/symbols.ts","../src/dto/output-dto.ts","../src/dto/create-zod-dto.ts","../src/dto/predicates.ts","../src/exceptions/validation.exception.ts","../src/pipes/validation.pipe.ts"],"names":["z","BadRequestException","HttpStatus","ZodValidationPipe","Injectable","Optional"],"mappings":"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","file":"index.js","sourcesContent":["/** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */\nexport const COMPONENTS_SCHEMAS_PREFIX = '#/components/schemas/';\n\n/** OpenAPI extension key zod-nest uses to surface engine errors inside emitted schemas. */\nexport const ZOD_NEST_ERROR_EXTENSION = 'x-zod-nest-error';\n\n/** Value of `x-zod-nest-error` when a registry id is claimed by more than one schema. */\nexport const ZOD_NEST_ERROR_DUPLICATE_ID = 'duplicate-id';\n\n/**\n * OpenAPI extension key used by `createZodDto` to mark a class for Phase 2e's\n * doc-merger. The marker carries `{ __zodNestDto: true, dtoId, io }` so the\n * merger can locate every zod-nest DTO in the @nestjs/swagger document and\n * inject the real Zod-derived schema.\n */\nexport const ZOD_NEST_DTO_EXTENSION = 'x-zod-nest-dto';\n","export class ZodNestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZodNestError';\n }\n}\n\nexport class ZodNestUnrepresentableError extends ZodNestError {\n readonly path: ReadonlyArray<string | number>;\n readonly zodType: string;\n\n constructor(path: ReadonlyArray<string | number>, zodType: string) {\n super(\n `Unrepresentable Zod schema \\`${zodType}\\` at ${formatPath(path)}: no override produced ` +\n `a JSON Schema body. Set strict: false to emit \\`{}\\` instead, or supply an \\`override\\` ` +\n `that handles this Zod type.`,\n );\n this.name = 'ZodNestUnrepresentableError';\n this.path = path;\n this.zodType = zodType;\n }\n}\n\nconst formatPath = (path: ReadonlyArray<string | number>): string => {\n if (path.length === 0) {\n return '<root>';\n }\n return '/' + path.map(String).join('/');\n};\n","import type { $ZodTypes } from 'zod/v4/core';\nimport type { SchemaObject } from './openapi.types.js';\n\nexport interface OverrideContext {\n zodSchema: $ZodTypes;\n jsonSchema: SchemaObject;\n path: (string | number)[];\n}\n\nexport type Override = (ctx: OverrideContext) => void;\n\nexport const builtInOverride: Override = ({ zodSchema, jsonSchema }) => {\n const type = zodSchema._zod.def.type;\n if (type === 'bigint') {\n jsonSchema.type = 'integer';\n return;\n }\n if (type === 'date') {\n jsonSchema.type = 'string';\n jsonSchema.format = 'date-time';\n return;\n }\n};\n\nconst STRICT_REQUIRES_OVERRIDE: ReadonlySet<string> = new Set([\n 'bigint',\n 'date',\n 'symbol',\n 'undefined',\n 'void',\n 'map',\n 'set',\n 'transform',\n 'nan',\n 'custom',\n]);\n\nexport const isStrictlyUnrepresentable = (\n jsonSchema: SchemaObject,\n zodSchema: $ZodTypes,\n): boolean => {\n if (!STRICT_REQUIRES_OVERRIDE.has(zodSchema._zod.def.type)) {\n return false;\n }\n return Object.keys(jsonSchema).length === 0;\n};\n\nexport const combine = (...overrides: ReadonlyArray<Override | undefined>): Override => {\n const list: Override[] = [];\n for (const candidate of overrides) {\n if (typeof candidate !== 'function') {\n continue;\n }\n list.push(candidate);\n }\n if (list.length === 0) {\n return () => undefined;\n }\n return (ctx) => {\n for (const o of list) {\n o(ctx);\n }\n };\n};\n","import type { SchemaObject } from './openapi.types.js';\n\nimport { COMPONENTS_SCHEMAS_PREFIX } from './constants.js';\n\nexport interface PostProcessResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\nconst DEFS_PREFIX = '#/$defs/';\n\nconst rewriteRefs = (node: unknown, selfRef: string | undefined): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n rewriteRefs(item, selfRef);\n }\n return;\n }\n if (node === null || typeof node !== 'object') {\n return;\n }\n const obj = node as Record<string, unknown>;\n const ref = obj.$ref;\n if (typeof ref === 'string' && ref.startsWith(DEFS_PREFIX)) {\n obj.$ref = COMPONENTS_SCHEMAS_PREFIX + ref.slice(DEFS_PREFIX.length);\n } else if (ref === '#' && selfRef !== undefined) {\n // Zod emits '#' for cycle refs back to the document root. When we lift a\n // named schema into its own components.schemas entry, '#' should resolve\n // to that entry's own URI.\n obj.$ref = selfRef;\n }\n for (const value of Object.values(obj)) {\n rewriteRefs(value, selfRef);\n }\n};\n\nexport const postProcess = (raw: SchemaObject): PostProcessResult => {\n const refs = new Map<string, SchemaObject>();\n const rawDefs = raw.$defs;\n if (rawDefs !== undefined) {\n for (const [id, body] of Object.entries(rawDefs)) {\n refs.set(id, body);\n }\n }\n\n const root: SchemaObject = { ...raw };\n delete root.$schema;\n delete root.$defs;\n\n // Root has no own self-uri at the 2a level. If the root is a bare `$ref` to a\n // lifted named schema (the common case when input itself has `.meta({ id })`),\n // we'll have already rewritten it to '#/components/schemas/<id>'.\n rewriteRefs(root, undefined);\n\n for (const [id, body] of refs) {\n rewriteRefs(body, `${COMPONENTS_SCHEMAS_PREFIX}${id}`);\n }\n\n return { schema: root, refs };\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from './openapi.types.js';\nimport type { Override } from './override.js';\nimport type { ZodNestRegistry } from './registry.js';\n\nimport { ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION } from './constants.js';\nimport { ZodNestUnrepresentableError } from './errors.js';\nimport { builtInOverride, combine, isStrictlyUnrepresentable } from './override.js';\nimport { postProcess } from './post-process.js';\n\nexport interface ToOpenApiOptions {\n io: 'input' | 'output';\n registry: ZodNestRegistry;\n override?: Override;\n strict?: boolean;\n}\n\nexport interface ToOpenApiResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\ninterface UnrepresentableHit {\n path: (string | number)[];\n zodType: string;\n}\n\nexport const toOpenApi = (schema: z.ZodType, opts: ToOpenApiOptions): ToOpenApiResult => {\n const strict = opts.strict ?? true;\n const merged = combine(builtInOverride, opts.override);\n const unrepresentableHits: UnrepresentableHit[] = [];\n\n const wrapped: Override = (ctx) => {\n merged(ctx);\n if (!strict || !isStrictlyUnrepresentable(ctx.jsonSchema, ctx.zodSchema)) {\n return;\n }\n unrepresentableHits.push({\n path: [...ctx.path],\n zodType: ctx.zodSchema._zod.def.type,\n });\n };\n\n const raw = z.toJSONSchema(schema, {\n target: 'draft-2020-12',\n io: opts.io,\n unrepresentable: 'any',\n metadata: opts.registry.zodRegistry,\n override: wrapped,\n cycles: 'ref',\n reused: 'inline',\n });\n\n const firstHit = unrepresentableHits[0];\n if (firstHit !== undefined) {\n throw new ZodNestUnrepresentableError(firstHit.path, firstHit.zodType);\n }\n\n const result = postProcess(raw);\n\n for (const [id] of opts.registry.getCollisions()) {\n if (!result.refs.has(id)) {\n continue;\n }\n result.refs.set(id, {\n description: `ERROR: duplicate zod-nest id <${id}>`,\n [ZOD_NEST_ERROR_EXTENSION]: ZOD_NEST_ERROR_DUPLICATE_ID,\n });\n }\n\n return result;\n};\n","import { z } from 'zod';\n\nexport interface ZodNestRegistry {\n readonly zodRegistry: typeof z.globalRegistry;\n register(schema: z.ZodType, id: string): void;\n hasCollision(id: string): boolean;\n getCollisions(): ReadonlyMap<string, ReadonlySet<z.ZodType>>;\n}\n\nexport const createRegistry = (): ZodNestRegistry => {\n const seen = new Map<string, Set<z.ZodType>>();\n\n return {\n zodRegistry: z.globalRegistry,\n register: (schema, id) => {\n z.globalRegistry.add(schema, { id });\n let set = seen.get(id);\n if (set === undefined) {\n set = new Set<z.ZodType>();\n seen.set(id, set);\n }\n set.add(schema);\n },\n hasCollision: (id) => {\n const set = seen.get(id);\n return set !== undefined && set.size > 1;\n },\n getCollisions: () => {\n const out = new Map<string, Set<z.ZodType>>();\n for (const [id, set] of seen) {\n if (set.size <= 1) {\n continue;\n }\n out.set(id, set);\n }\n return out;\n },\n };\n};\n\n/**\n * Process-wide default registry. `createZodDto` registers schemas here unless\n * the caller passes `options.registry`. Phase 2e's doc merger reads from the\n * same instance for bulk emission. Multi-app WeakMap isolation is deferred\n * to v0.2.\n */\nexport const defaultRegistry: ZodNestRegistry = createRegistry();\n","import type { Io } from './dto.types.js';\n\n/**\n * Payload of the `x-zod-nest-dto` placeholder property that\n * `_OPENAPI_METADATA_FACTORY` returns. Phase 2e's doc merger reads this off\n * each `components.schemas.<DtoName>.properties[x-zod-nest-dto]` entry,\n * uses `dtoId` to look up the schema in the registry, and replaces the\n * synthetic schema body with the real Zod-derived schema.\n *\n * `type` and `required` are benign filler that satisfy @nestjs/swagger's\n * property-type guard (without them, the explorer throws \"A circular\n * dependency has been detected\"). They have no semantic meaning and are\n * stripped along with the rest of the marker by Phase 2e.\n */\nexport interface ZodDtoMarker {\n readonly type: () => typeof Object;\n readonly required: false;\n readonly __zodNestDto: true;\n readonly dtoId: string;\n readonly io: Io;\n}\n\nexport const makeZodDtoMarker = (dtoId: string, io: Io): ZodDtoMarker => ({\n type: () => Object,\n required: false,\n __zodNestDto: true,\n dtoId,\n io,\n});\n\n/** Phase 2e (and tests) use this to discriminate a marker from a real schema. */\nexport const isZodDtoMarker = (value: unknown): value is ZodDtoMarker => {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as { __zodNestDto?: unknown }).__zodNestDto === true;\n};\n","/**\n * Runtime detection marker placed on every class returned by `createZodDto`.\n * Used by the validation pipe (Phase 2c), serializer (2d), and doc merger (2e)\n * to discriminate zod-nest DTO classes from regular constructors.\n */\nexport const ZOD_DTO_SYMBOL: unique symbol = Symbol.for('zod-nest.dto');\n","import type { z } from 'zod';\nimport type { Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Cache of `parent -> output-sibling` so repeated reads of `Dto.Output` return\n * the same class instance. WeakMap so the sibling can be GC'd if the parent is.\n */\nconst outputCache = new WeakMap<ZodDto<z.ZodType>, ZodDto<z.ZodType>>();\n\n/**\n * `.Output` is always a distinct sibling class — it carries `io: 'output'` so\n * the Phase 2e doc-merger can run the output-side emission and apply the\n * suffix truth table (`Foo` alone vs `Foo` + `FooOutput`) based on actual JSON\n * Schema equality at doc-build time. The earlier \"return self when io-identical\"\n * optimization was dropped because `z.object()` already diverges at the JSON\n * Schema level (input is permissive, output sets `additionalProperties: false`),\n * which would have made the sibling reused only for non-object roots — not\n * worth the implementation complexity.\n */\nconst buildSiblingClass = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const SiblingClass = class {\n static readonly schema = schema;\n static readonly io: Io = 'output';\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return parent.id;\n }\n\n static get Output(): ZodDto<TSchema> {\n return this as unknown as ZodDto<TSchema>;\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(parent.id, 'output') };\n }\n };\n return SiblingClass as unknown as ZodDto<TSchema>;\n};\n\nexport const resolveOutput = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const cached = outputCache.get(parent as ZodDto<z.ZodType>);\n if (cached !== undefined) {\n return cached as ZodDto<TSchema>;\n }\n const sibling = buildSiblingClass(parent, schema);\n outputCache.set(parent as ZodDto<z.ZodType>, sibling as ZodDto<z.ZodType>);\n return sibling;\n};\n","import type { z } from 'zod';\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { CreateZodDtoOptions, Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { resolveOutput } from './output-dto.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\nlet anonCounter = 0;\nlet warnedOnAnonymous = false;\n\nconst resolveId = (\n registry: ZodNestRegistry,\n schema: z.ZodType,\n providedId: string | undefined,\n className: string,\n): string => {\n if (providedId !== undefined && providedId !== '') {\n return providedId;\n }\n const meta = registry.zodRegistry.get(schema) as { id?: string } | undefined;\n if (meta && typeof meta.id === 'string' && meta.id !== '') {\n return meta.id;\n }\n if (className !== '' && className.length > 1) {\n return className;\n }\n anonCounter += 1;\n const fallback = `_AnonZodDto_${anonCounter}`;\n if (!warnedOnAnonymous) {\n warnedOnAnonymous = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[zod-nest] Could not resolve a DTO id from class name (got \"${className}\"). ` +\n `Using \"${fallback}\". Pass \\`createZodDto(schema, { id: 'Foo' })\\` to set a stable ` +\n `name — important under minification, where class names become single mangled characters.`,\n );\n }\n return fallback;\n};\n\nexport const createZodDto = <TSchema extends z.ZodType>(\n schema: TSchema,\n options?: CreateZodDtoOptions,\n): ZodDto<TSchema> => {\n const registry: ZodNestRegistry = options?.registry ?? defaultRegistry;\n const io: Io = 'input';\n let cachedId: string | undefined;\n\n const ensureRegistered = (className: string): string => {\n if (cachedId !== undefined) {\n return cachedId;\n }\n cachedId = resolveId(registry, schema, options?.id, className);\n registry.register(schema, cachedId);\n return cachedId;\n };\n\n const ZodDtoBase = class {\n static readonly schema = schema;\n static readonly io: Io = io;\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return ensureRegistered(this.name);\n }\n\n static get Output(): ZodDto<TSchema> {\n return resolveOutput(this as unknown as ZodDto<TSchema>, schema);\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(ensureRegistered(this.name), io) };\n }\n };\n\n return ZodDtoBase as unknown as ZodDto<TSchema>;\n};\n","import type { ZodDto } from './dto.types.js';\n\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Runtime guard: is `value` a class returned by `createZodDto`?\n *\n * Used by the validation pipe (Phase 2c), the serializer interceptor (2d),\n * and the doc merger (2e) to discriminate zod-nest DTOs from plain\n * constructors, class-validator DTOs, primitives, and any other metatypes\n * NestJS exposes via `ArgumentMetadata`.\n */\nexport const isZodDto = (value: unknown): value is ZodDto =>\n typeof value === 'function' &&\n (value as unknown as Record<symbol, unknown>)[ZOD_DTO_SYMBOL] === true;\n","import { BadRequestException, HttpStatus } from '@nestjs/common';\nimport { z } from 'zod';\n\nimport type { ArgumentMetadata } from '@nestjs/common';\n\n/**\n * Default exception thrown by `ZodValidationPipe` when input fails to parse.\n *\n * Body shape (returned by `getResponse()`):\n * ```\n * {\n * statusCode: 400,\n * message: 'Validation failed',\n * errors: z.treeifyError(zodError),\n * }\n * ```\n *\n * Carries `zodError` and `argMetadata` so custom exception filters can\n * introspect the original validation failure.\n */\nexport class ZodValidationException extends BadRequestException {\n readonly zodError: z.ZodError;\n readonly argMetadata?: ArgumentMetadata;\n\n constructor(zodError: z.ZodError, argMetadata?: ArgumentMetadata) {\n super({\n statusCode: HttpStatus.BAD_REQUEST,\n message: 'Validation failed',\n errors: z.treeifyError(zodError),\n });\n this.zodError = zodError;\n this.argMetadata = argMetadata;\n }\n}\n","import { Injectable, Optional } from '@nestjs/common';\n\nimport type { ArgumentMetadata, PipeTransform } from '@nestjs/common';\nimport type { z } from 'zod';\nimport type {\n CreateValidationException,\n ZodValidationPipeArg,\n ZodValidationPipeOptions,\n} from './types.js';\n\nimport { isZodDto } from '../dto/predicates.js';\nimport { ZodValidationException } from '../exceptions/validation.exception.js';\n\nconst isZodSchema = (value: unknown): value is z.ZodType =>\n value !== null && typeof value === 'object' && '_zod' in value;\n\nconst isOptionsObject = (value: unknown): value is ZodValidationPipeOptions =>\n value !== null && typeof value === 'object' && !isZodSchema(value);\n\nconst defaultExceptionFactory: CreateValidationException = (zodError, argMetadata) =>\n new ZodValidationException(zodError, argMetadata);\n\n@Injectable()\nexport class ZodValidationPipe implements PipeTransform {\n private readonly explicitSchema: z.ZodType | undefined;\n private readonly createValidationException: CreateValidationException;\n\n constructor(@Optional() arg?: ZodValidationPipeArg) {\n const { schema, factory } = ZodValidationPipe.parseArg(arg);\n this.explicitSchema = schema;\n this.createValidationException = factory;\n }\n\n async transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown> {\n const schema = this.resolveSchema(metadata);\n if (schema === undefined) {\n return value;\n }\n const result = await schema.safeParseAsync(value);\n if (result.success) {\n return result.data;\n }\n throw this.createValidationException(result.error, metadata);\n }\n\n private resolveSchema(metadata: ArgumentMetadata): z.ZodType | undefined {\n if (this.explicitSchema !== undefined) {\n return this.explicitSchema;\n }\n const metatype: unknown = metadata.metatype;\n if (!isZodDto(metatype)) {\n return undefined;\n }\n return metatype.schema;\n }\n\n private static parseArg(arg: ZodValidationPipeArg | undefined): {\n schema: z.ZodType | undefined;\n factory: CreateValidationException;\n } {\n if (arg === undefined) {\n return { schema: undefined, factory: defaultExceptionFactory };\n }\n if (isZodDto(arg)) {\n return { schema: arg.schema, factory: defaultExceptionFactory };\n }\n if (isZodSchema(arg)) {\n return { schema: arg, factory: defaultExceptionFactory };\n }\n if (!isOptionsObject(arg)) {\n return { schema: undefined, factory: defaultExceptionFactory };\n }\n const optionSchema = arg.schema;\n const resolvedSchema = isZodDto(optionSchema) ? optionSchema.schema : optionSchema;\n return {\n schema: resolvedSchema,\n factory: arg.createValidationException ?? defaultExceptionFactory,\n };\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,4 +1,15 @@
1
1
  import { z } from 'zod';
2
+ import { Injectable, Optional, BadRequestException, HttpStatus } from '@nestjs/common';
3
+
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __decorateClass = (decorators, target, key, kind) => {
6
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
7
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
8
+ if (decorator = decorators[i])
9
+ result = (decorator(result)) || result;
10
+ return result;
11
+ };
12
+ var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
2
13
 
3
14
  // src/schema/constants.ts
4
15
  var COMPONENTS_SCHEMAS_PREFIX = "#/components/schemas/";
@@ -305,6 +316,79 @@ var createZodDto = (schema, options) => {
305
316
  return ZodDtoBase;
306
317
  };
307
318
 
308
- export { COMPONENTS_SCHEMAS_PREFIX, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, ZodNestError, ZodNestUnrepresentableError, createRegistry, createZodDto, defaultRegistry, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
319
+ // src/dto/predicates.ts
320
+ var isZodDto = (value) => typeof value === "function" && value[ZOD_DTO_SYMBOL] === true;
321
+ var ZodValidationException = class extends BadRequestException {
322
+ zodError;
323
+ argMetadata;
324
+ constructor(zodError, argMetadata) {
325
+ super({
326
+ statusCode: HttpStatus.BAD_REQUEST,
327
+ message: "Validation failed",
328
+ errors: z.treeifyError(zodError)
329
+ });
330
+ this.zodError = zodError;
331
+ this.argMetadata = argMetadata;
332
+ }
333
+ };
334
+ var isZodSchema = (value) => value !== null && typeof value === "object" && "_zod" in value;
335
+ var isOptionsObject = (value) => value !== null && typeof value === "object" && !isZodSchema(value);
336
+ var defaultExceptionFactory = (zodError, argMetadata) => new ZodValidationException(zodError, argMetadata);
337
+ var ZodValidationPipe = class {
338
+ explicitSchema;
339
+ createValidationException;
340
+ constructor(arg) {
341
+ const { schema, factory } = ZodValidationPipe.parseArg(arg);
342
+ this.explicitSchema = schema;
343
+ this.createValidationException = factory;
344
+ }
345
+ async transform(value, metadata) {
346
+ const schema = this.resolveSchema(metadata);
347
+ if (schema === void 0) {
348
+ return value;
349
+ }
350
+ const result = await schema.safeParseAsync(value);
351
+ if (result.success) {
352
+ return result.data;
353
+ }
354
+ throw this.createValidationException(result.error, metadata);
355
+ }
356
+ resolveSchema(metadata) {
357
+ if (this.explicitSchema !== void 0) {
358
+ return this.explicitSchema;
359
+ }
360
+ const metatype = metadata.metatype;
361
+ if (!isZodDto(metatype)) {
362
+ return void 0;
363
+ }
364
+ return metatype.schema;
365
+ }
366
+ static parseArg(arg) {
367
+ if (arg === void 0) {
368
+ return { schema: void 0, factory: defaultExceptionFactory };
369
+ }
370
+ if (isZodDto(arg)) {
371
+ return { schema: arg.schema, factory: defaultExceptionFactory };
372
+ }
373
+ if (isZodSchema(arg)) {
374
+ return { schema: arg, factory: defaultExceptionFactory };
375
+ }
376
+ if (!isOptionsObject(arg)) {
377
+ return { schema: void 0, factory: defaultExceptionFactory };
378
+ }
379
+ const optionSchema = arg.schema;
380
+ const resolvedSchema = isZodDto(optionSchema) ? optionSchema.schema : optionSchema;
381
+ return {
382
+ schema: resolvedSchema,
383
+ factory: arg.createValidationException ?? defaultExceptionFactory
384
+ };
385
+ }
386
+ };
387
+ ZodValidationPipe = __decorateClass([
388
+ Injectable(),
389
+ __decorateParam(0, Optional())
390
+ ], ZodValidationPipe);
391
+
392
+ export { COMPONENTS_SCHEMAS_PREFIX, ZOD_DTO_SYMBOL, ZOD_NEST_DTO_EXTENSION, ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION, ZodNestError, ZodNestUnrepresentableError, ZodValidationException, ZodValidationPipe, createRegistry, createZodDto, defaultRegistry, isZodDto, isZodDtoMarker, makeZodDtoMarker, toOpenApi };
309
393
  //# sourceMappingURL=index.mjs.map
310
394
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema/constants.ts","../src/schema/errors.ts","../src/schema/override.ts","../src/schema/post-process.ts","../src/schema/engine.ts","../src/schema/registry.ts","../src/dto/marker.ts","../src/dto/symbols.ts","../src/dto/output-dto.ts","../src/dto/create-zod-dto.ts"],"names":["z"],"mappings":"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","file":"index.mjs","sourcesContent":["/** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */\nexport const COMPONENTS_SCHEMAS_PREFIX = '#/components/schemas/';\n\n/** OpenAPI extension key zod-nest uses to surface engine errors inside emitted schemas. */\nexport const ZOD_NEST_ERROR_EXTENSION = 'x-zod-nest-error';\n\n/** Value of `x-zod-nest-error` when a registry id is claimed by more than one schema. */\nexport const ZOD_NEST_ERROR_DUPLICATE_ID = 'duplicate-id';\n\n/**\n * OpenAPI extension key used by `createZodDto` to mark a class for Phase 2e's\n * doc-merger. The marker carries `{ __zodNestDto: true, dtoId, io }` so the\n * merger can locate every zod-nest DTO in the @nestjs/swagger document and\n * inject the real Zod-derived schema.\n */\nexport const ZOD_NEST_DTO_EXTENSION = 'x-zod-nest-dto';\n","export class ZodNestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZodNestError';\n }\n}\n\nexport class ZodNestUnrepresentableError extends ZodNestError {\n readonly path: ReadonlyArray<string | number>;\n readonly zodType: string;\n\n constructor(path: ReadonlyArray<string | number>, zodType: string) {\n super(\n `Unrepresentable Zod schema \\`${zodType}\\` at ${formatPath(path)}: no override produced ` +\n `a JSON Schema body. Set strict: false to emit \\`{}\\` instead, or supply an \\`override\\` ` +\n `that handles this Zod type.`,\n );\n this.name = 'ZodNestUnrepresentableError';\n this.path = path;\n this.zodType = zodType;\n }\n}\n\nconst formatPath = (path: ReadonlyArray<string | number>): string => {\n if (path.length === 0) {\n return '<root>';\n }\n return '/' + path.map(String).join('/');\n};\n","import type { $ZodTypes } from 'zod/v4/core';\nimport type { SchemaObject } from './openapi.types.js';\n\nexport interface OverrideContext {\n zodSchema: $ZodTypes;\n jsonSchema: SchemaObject;\n path: (string | number)[];\n}\n\nexport type Override = (ctx: OverrideContext) => void;\n\nexport const builtInOverride: Override = ({ zodSchema, jsonSchema }) => {\n const type = zodSchema._zod.def.type;\n if (type === 'bigint') {\n jsonSchema.type = 'integer';\n return;\n }\n if (type === 'date') {\n jsonSchema.type = 'string';\n jsonSchema.format = 'date-time';\n return;\n }\n};\n\nconst STRICT_REQUIRES_OVERRIDE: ReadonlySet<string> = new Set([\n 'bigint',\n 'date',\n 'symbol',\n 'undefined',\n 'void',\n 'map',\n 'set',\n 'transform',\n 'nan',\n 'custom',\n]);\n\nexport const isStrictlyUnrepresentable = (\n jsonSchema: SchemaObject,\n zodSchema: $ZodTypes,\n): boolean => {\n if (!STRICT_REQUIRES_OVERRIDE.has(zodSchema._zod.def.type)) {\n return false;\n }\n return Object.keys(jsonSchema).length === 0;\n};\n\nexport const combine = (...overrides: ReadonlyArray<Override | undefined>): Override => {\n const list: Override[] = [];\n for (const candidate of overrides) {\n if (typeof candidate !== 'function') {\n continue;\n }\n list.push(candidate);\n }\n if (list.length === 0) {\n return () => undefined;\n }\n return (ctx) => {\n for (const o of list) {\n o(ctx);\n }\n };\n};\n","import type { SchemaObject } from './openapi.types.js';\n\nimport { COMPONENTS_SCHEMAS_PREFIX } from './constants.js';\n\nexport interface PostProcessResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\nconst DEFS_PREFIX = '#/$defs/';\n\nconst rewriteRefs = (node: unknown, selfRef: string | undefined): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n rewriteRefs(item, selfRef);\n }\n return;\n }\n if (node === null || typeof node !== 'object') {\n return;\n }\n const obj = node as Record<string, unknown>;\n const ref = obj.$ref;\n if (typeof ref === 'string' && ref.startsWith(DEFS_PREFIX)) {\n obj.$ref = COMPONENTS_SCHEMAS_PREFIX + ref.slice(DEFS_PREFIX.length);\n } else if (ref === '#' && selfRef !== undefined) {\n // Zod emits '#' for cycle refs back to the document root. When we lift a\n // named schema into its own components.schemas entry, '#' should resolve\n // to that entry's own URI.\n obj.$ref = selfRef;\n }\n for (const value of Object.values(obj)) {\n rewriteRefs(value, selfRef);\n }\n};\n\nexport const postProcess = (raw: SchemaObject): PostProcessResult => {\n const refs = new Map<string, SchemaObject>();\n const rawDefs = raw.$defs;\n if (rawDefs !== undefined) {\n for (const [id, body] of Object.entries(rawDefs)) {\n refs.set(id, body);\n }\n }\n\n const root: SchemaObject = { ...raw };\n delete root.$schema;\n delete root.$defs;\n\n // Root has no own self-uri at the 2a level. If the root is a bare `$ref` to a\n // lifted named schema (the common case when input itself has `.meta({ id })`),\n // we'll have already rewritten it to '#/components/schemas/<id>'.\n rewriteRefs(root, undefined);\n\n for (const [id, body] of refs) {\n rewriteRefs(body, `${COMPONENTS_SCHEMAS_PREFIX}${id}`);\n }\n\n return { schema: root, refs };\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from './openapi.types.js';\nimport type { Override } from './override.js';\nimport type { ZodNestRegistry } from './registry.js';\n\nimport { ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION } from './constants.js';\nimport { ZodNestUnrepresentableError } from './errors.js';\nimport { builtInOverride, combine, isStrictlyUnrepresentable } from './override.js';\nimport { postProcess } from './post-process.js';\n\nexport interface ToOpenApiOptions {\n io: 'input' | 'output';\n registry: ZodNestRegistry;\n override?: Override;\n strict?: boolean;\n}\n\nexport interface ToOpenApiResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\ninterface UnrepresentableHit {\n path: (string | number)[];\n zodType: string;\n}\n\nexport const toOpenApi = (schema: z.ZodType, opts: ToOpenApiOptions): ToOpenApiResult => {\n const strict = opts.strict ?? true;\n const merged = combine(builtInOverride, opts.override);\n const unrepresentableHits: UnrepresentableHit[] = [];\n\n const wrapped: Override = (ctx) => {\n merged(ctx);\n if (!strict || !isStrictlyUnrepresentable(ctx.jsonSchema, ctx.zodSchema)) {\n return;\n }\n unrepresentableHits.push({\n path: [...ctx.path],\n zodType: ctx.zodSchema._zod.def.type,\n });\n };\n\n const raw = z.toJSONSchema(schema, {\n target: 'draft-2020-12',\n io: opts.io,\n unrepresentable: 'any',\n metadata: opts.registry.zodRegistry,\n override: wrapped,\n cycles: 'ref',\n reused: 'inline',\n });\n\n const firstHit = unrepresentableHits[0];\n if (firstHit !== undefined) {\n throw new ZodNestUnrepresentableError(firstHit.path, firstHit.zodType);\n }\n\n const result = postProcess(raw);\n\n for (const [id] of opts.registry.getCollisions()) {\n if (!result.refs.has(id)) {\n continue;\n }\n result.refs.set(id, {\n description: `ERROR: duplicate zod-nest id <${id}>`,\n [ZOD_NEST_ERROR_EXTENSION]: ZOD_NEST_ERROR_DUPLICATE_ID,\n });\n }\n\n return result;\n};\n","import { z } from 'zod';\n\nexport interface ZodNestRegistry {\n readonly zodRegistry: typeof z.globalRegistry;\n register(schema: z.ZodType, id: string): void;\n hasCollision(id: string): boolean;\n getCollisions(): ReadonlyMap<string, ReadonlySet<z.ZodType>>;\n}\n\nexport const createRegistry = (): ZodNestRegistry => {\n const seen = new Map<string, Set<z.ZodType>>();\n\n return {\n zodRegistry: z.globalRegistry,\n register: (schema, id) => {\n z.globalRegistry.add(schema, { id });\n let set = seen.get(id);\n if (set === undefined) {\n set = new Set<z.ZodType>();\n seen.set(id, set);\n }\n set.add(schema);\n },\n hasCollision: (id) => {\n const set = seen.get(id);\n return set !== undefined && set.size > 1;\n },\n getCollisions: () => {\n const out = new Map<string, Set<z.ZodType>>();\n for (const [id, set] of seen) {\n if (set.size <= 1) {\n continue;\n }\n out.set(id, set);\n }\n return out;\n },\n };\n};\n\n/**\n * Process-wide default registry. `createZodDto` registers schemas here unless\n * the caller passes `options.registry`. Phase 2e's doc merger reads from the\n * same instance for bulk emission. Multi-app WeakMap isolation is deferred\n * to v0.2.\n */\nexport const defaultRegistry: ZodNestRegistry = createRegistry();\n","import type { Io } from './dto.types.js';\n\n/**\n * Payload of the `x-zod-nest-dto` placeholder property that\n * `_OPENAPI_METADATA_FACTORY` returns. Phase 2e's doc merger reads this off\n * each `components.schemas.<DtoName>.properties[x-zod-nest-dto]` entry,\n * uses `dtoId` to look up the schema in the registry, and replaces the\n * synthetic schema body with the real Zod-derived schema.\n *\n * `type` and `required` are benign filler that satisfy @nestjs/swagger's\n * property-type guard (without them, the explorer throws \"A circular\n * dependency has been detected\"). They have no semantic meaning and are\n * stripped along with the rest of the marker by Phase 2e.\n */\nexport interface ZodDtoMarker {\n readonly type: () => typeof Object;\n readonly required: false;\n readonly __zodNestDto: true;\n readonly dtoId: string;\n readonly io: Io;\n}\n\nexport const makeZodDtoMarker = (dtoId: string, io: Io): ZodDtoMarker => ({\n type: () => Object,\n required: false,\n __zodNestDto: true,\n dtoId,\n io,\n});\n\n/** Phase 2e (and tests) use this to discriminate a marker from a real schema. */\nexport const isZodDtoMarker = (value: unknown): value is ZodDtoMarker => {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as { __zodNestDto?: unknown }).__zodNestDto === true;\n};\n","/**\n * Runtime detection marker placed on every class returned by `createZodDto`.\n * Used by the validation pipe (Phase 2c), serializer (2d), and doc merger (2e)\n * to discriminate zod-nest DTO classes from regular constructors.\n */\nexport const ZOD_DTO_SYMBOL: unique symbol = Symbol.for('zod-nest.dto');\n","import type { z } from 'zod';\nimport type { Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Cache of `parent -> output-sibling` so repeated reads of `Dto.Output` return\n * the same class instance. WeakMap so the sibling can be GC'd if the parent is.\n */\nconst outputCache = new WeakMap<ZodDto<z.ZodType>, ZodDto<z.ZodType>>();\n\n/**\n * `.Output` is always a distinct sibling class — it carries `io: 'output'` so\n * the Phase 2e doc-merger can run the output-side emission and apply the\n * suffix truth table (`Foo` alone vs `Foo` + `FooOutput`) based on actual JSON\n * Schema equality at doc-build time. The earlier \"return self when io-identical\"\n * optimization was dropped because `z.object()` already diverges at the JSON\n * Schema level (input is permissive, output sets `additionalProperties: false`),\n * which would have made the sibling reused only for non-object roots — not\n * worth the implementation complexity.\n */\nconst buildSiblingClass = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const SiblingClass = class {\n static readonly schema = schema;\n static readonly io: Io = 'output';\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return parent.id;\n }\n\n static get Output(): ZodDto<TSchema> {\n return this as unknown as ZodDto<TSchema>;\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(parent.id, 'output') };\n }\n };\n return SiblingClass as unknown as ZodDto<TSchema>;\n};\n\nexport const resolveOutput = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const cached = outputCache.get(parent as ZodDto<z.ZodType>);\n if (cached !== undefined) {\n return cached as ZodDto<TSchema>;\n }\n const sibling = buildSiblingClass(parent, schema);\n outputCache.set(parent as ZodDto<z.ZodType>, sibling as ZodDto<z.ZodType>);\n return sibling;\n};\n","import type { z } from 'zod';\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { CreateZodDtoOptions, Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { resolveOutput } from './output-dto.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\nlet anonCounter = 0;\nlet warnedOnAnonymous = false;\n\nconst resolveId = (\n registry: ZodNestRegistry,\n schema: z.ZodType,\n providedId: string | undefined,\n className: string,\n): string => {\n if (providedId !== undefined && providedId !== '') {\n return providedId;\n }\n const meta = registry.zodRegistry.get(schema) as { id?: string } | undefined;\n if (meta && typeof meta.id === 'string' && meta.id !== '') {\n return meta.id;\n }\n if (className !== '' && className.length > 1) {\n return className;\n }\n anonCounter += 1;\n const fallback = `_AnonZodDto_${anonCounter}`;\n if (!warnedOnAnonymous) {\n warnedOnAnonymous = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[zod-nest] Could not resolve a DTO id from class name (got \"${className}\"). ` +\n `Using \"${fallback}\". Pass \\`createZodDto(schema, { id: 'Foo' })\\` to set a stable ` +\n `name — important under minification, where class names become single mangled characters.`,\n );\n }\n return fallback;\n};\n\nexport const createZodDto = <TSchema extends z.ZodType>(\n schema: TSchema,\n options?: CreateZodDtoOptions,\n): ZodDto<TSchema> => {\n const registry: ZodNestRegistry = options?.registry ?? defaultRegistry;\n const io: Io = 'input';\n let cachedId: string | undefined;\n\n const ensureRegistered = (className: string): string => {\n if (cachedId !== undefined) {\n return cachedId;\n }\n cachedId = resolveId(registry, schema, options?.id, className);\n registry.register(schema, cachedId);\n return cachedId;\n };\n\n const ZodDtoBase = class {\n static readonly schema = schema;\n static readonly io: Io = io;\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return ensureRegistered(this.name);\n }\n\n static get Output(): ZodDto<TSchema> {\n return resolveOutput(this as unknown as ZodDto<TSchema>, schema);\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(ensureRegistered(this.name), io) };\n }\n };\n\n return ZodDtoBase as unknown as ZodDto<TSchema>;\n};\n"]}
1
+ {"version":3,"sources":["../src/schema/constants.ts","../src/schema/errors.ts","../src/schema/override.ts","../src/schema/post-process.ts","../src/schema/engine.ts","../src/schema/registry.ts","../src/dto/marker.ts","../src/dto/symbols.ts","../src/dto/output-dto.ts","../src/dto/create-zod-dto.ts","../src/dto/predicates.ts","../src/exceptions/validation.exception.ts","../src/pipes/validation.pipe.ts"],"names":["z"],"mappings":"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","file":"index.mjs","sourcesContent":["/** OpenAPI 3.1 `$ref` prefix for entries in `components.schemas`. */\nexport const COMPONENTS_SCHEMAS_PREFIX = '#/components/schemas/';\n\n/** OpenAPI extension key zod-nest uses to surface engine errors inside emitted schemas. */\nexport const ZOD_NEST_ERROR_EXTENSION = 'x-zod-nest-error';\n\n/** Value of `x-zod-nest-error` when a registry id is claimed by more than one schema. */\nexport const ZOD_NEST_ERROR_DUPLICATE_ID = 'duplicate-id';\n\n/**\n * OpenAPI extension key used by `createZodDto` to mark a class for Phase 2e's\n * doc-merger. The marker carries `{ __zodNestDto: true, dtoId, io }` so the\n * merger can locate every zod-nest DTO in the @nestjs/swagger document and\n * inject the real Zod-derived schema.\n */\nexport const ZOD_NEST_DTO_EXTENSION = 'x-zod-nest-dto';\n","export class ZodNestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ZodNestError';\n }\n}\n\nexport class ZodNestUnrepresentableError extends ZodNestError {\n readonly path: ReadonlyArray<string | number>;\n readonly zodType: string;\n\n constructor(path: ReadonlyArray<string | number>, zodType: string) {\n super(\n `Unrepresentable Zod schema \\`${zodType}\\` at ${formatPath(path)}: no override produced ` +\n `a JSON Schema body. Set strict: false to emit \\`{}\\` instead, or supply an \\`override\\` ` +\n `that handles this Zod type.`,\n );\n this.name = 'ZodNestUnrepresentableError';\n this.path = path;\n this.zodType = zodType;\n }\n}\n\nconst formatPath = (path: ReadonlyArray<string | number>): string => {\n if (path.length === 0) {\n return '<root>';\n }\n return '/' + path.map(String).join('/');\n};\n","import type { $ZodTypes } from 'zod/v4/core';\nimport type { SchemaObject } from './openapi.types.js';\n\nexport interface OverrideContext {\n zodSchema: $ZodTypes;\n jsonSchema: SchemaObject;\n path: (string | number)[];\n}\n\nexport type Override = (ctx: OverrideContext) => void;\n\nexport const builtInOverride: Override = ({ zodSchema, jsonSchema }) => {\n const type = zodSchema._zod.def.type;\n if (type === 'bigint') {\n jsonSchema.type = 'integer';\n return;\n }\n if (type === 'date') {\n jsonSchema.type = 'string';\n jsonSchema.format = 'date-time';\n return;\n }\n};\n\nconst STRICT_REQUIRES_OVERRIDE: ReadonlySet<string> = new Set([\n 'bigint',\n 'date',\n 'symbol',\n 'undefined',\n 'void',\n 'map',\n 'set',\n 'transform',\n 'nan',\n 'custom',\n]);\n\nexport const isStrictlyUnrepresentable = (\n jsonSchema: SchemaObject,\n zodSchema: $ZodTypes,\n): boolean => {\n if (!STRICT_REQUIRES_OVERRIDE.has(zodSchema._zod.def.type)) {\n return false;\n }\n return Object.keys(jsonSchema).length === 0;\n};\n\nexport const combine = (...overrides: ReadonlyArray<Override | undefined>): Override => {\n const list: Override[] = [];\n for (const candidate of overrides) {\n if (typeof candidate !== 'function') {\n continue;\n }\n list.push(candidate);\n }\n if (list.length === 0) {\n return () => undefined;\n }\n return (ctx) => {\n for (const o of list) {\n o(ctx);\n }\n };\n};\n","import type { SchemaObject } from './openapi.types.js';\n\nimport { COMPONENTS_SCHEMAS_PREFIX } from './constants.js';\n\nexport interface PostProcessResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\nconst DEFS_PREFIX = '#/$defs/';\n\nconst rewriteRefs = (node: unknown, selfRef: string | undefined): void => {\n if (Array.isArray(node)) {\n for (const item of node) {\n rewriteRefs(item, selfRef);\n }\n return;\n }\n if (node === null || typeof node !== 'object') {\n return;\n }\n const obj = node as Record<string, unknown>;\n const ref = obj.$ref;\n if (typeof ref === 'string' && ref.startsWith(DEFS_PREFIX)) {\n obj.$ref = COMPONENTS_SCHEMAS_PREFIX + ref.slice(DEFS_PREFIX.length);\n } else if (ref === '#' && selfRef !== undefined) {\n // Zod emits '#' for cycle refs back to the document root. When we lift a\n // named schema into its own components.schemas entry, '#' should resolve\n // to that entry's own URI.\n obj.$ref = selfRef;\n }\n for (const value of Object.values(obj)) {\n rewriteRefs(value, selfRef);\n }\n};\n\nexport const postProcess = (raw: SchemaObject): PostProcessResult => {\n const refs = new Map<string, SchemaObject>();\n const rawDefs = raw.$defs;\n if (rawDefs !== undefined) {\n for (const [id, body] of Object.entries(rawDefs)) {\n refs.set(id, body);\n }\n }\n\n const root: SchemaObject = { ...raw };\n delete root.$schema;\n delete root.$defs;\n\n // Root has no own self-uri at the 2a level. If the root is a bare `$ref` to a\n // lifted named schema (the common case when input itself has `.meta({ id })`),\n // we'll have already rewritten it to '#/components/schemas/<id>'.\n rewriteRefs(root, undefined);\n\n for (const [id, body] of refs) {\n rewriteRefs(body, `${COMPONENTS_SCHEMAS_PREFIX}${id}`);\n }\n\n return { schema: root, refs };\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from './openapi.types.js';\nimport type { Override } from './override.js';\nimport type { ZodNestRegistry } from './registry.js';\n\nimport { ZOD_NEST_ERROR_DUPLICATE_ID, ZOD_NEST_ERROR_EXTENSION } from './constants.js';\nimport { ZodNestUnrepresentableError } from './errors.js';\nimport { builtInOverride, combine, isStrictlyUnrepresentable } from './override.js';\nimport { postProcess } from './post-process.js';\n\nexport interface ToOpenApiOptions {\n io: 'input' | 'output';\n registry: ZodNestRegistry;\n override?: Override;\n strict?: boolean;\n}\n\nexport interface ToOpenApiResult {\n schema: SchemaObject;\n refs: Map<string, SchemaObject>;\n}\n\ninterface UnrepresentableHit {\n path: (string | number)[];\n zodType: string;\n}\n\nexport const toOpenApi = (schema: z.ZodType, opts: ToOpenApiOptions): ToOpenApiResult => {\n const strict = opts.strict ?? true;\n const merged = combine(builtInOverride, opts.override);\n const unrepresentableHits: UnrepresentableHit[] = [];\n\n const wrapped: Override = (ctx) => {\n merged(ctx);\n if (!strict || !isStrictlyUnrepresentable(ctx.jsonSchema, ctx.zodSchema)) {\n return;\n }\n unrepresentableHits.push({\n path: [...ctx.path],\n zodType: ctx.zodSchema._zod.def.type,\n });\n };\n\n const raw = z.toJSONSchema(schema, {\n target: 'draft-2020-12',\n io: opts.io,\n unrepresentable: 'any',\n metadata: opts.registry.zodRegistry,\n override: wrapped,\n cycles: 'ref',\n reused: 'inline',\n });\n\n const firstHit = unrepresentableHits[0];\n if (firstHit !== undefined) {\n throw new ZodNestUnrepresentableError(firstHit.path, firstHit.zodType);\n }\n\n const result = postProcess(raw);\n\n for (const [id] of opts.registry.getCollisions()) {\n if (!result.refs.has(id)) {\n continue;\n }\n result.refs.set(id, {\n description: `ERROR: duplicate zod-nest id <${id}>`,\n [ZOD_NEST_ERROR_EXTENSION]: ZOD_NEST_ERROR_DUPLICATE_ID,\n });\n }\n\n return result;\n};\n","import { z } from 'zod';\n\nexport interface ZodNestRegistry {\n readonly zodRegistry: typeof z.globalRegistry;\n register(schema: z.ZodType, id: string): void;\n hasCollision(id: string): boolean;\n getCollisions(): ReadonlyMap<string, ReadonlySet<z.ZodType>>;\n}\n\nexport const createRegistry = (): ZodNestRegistry => {\n const seen = new Map<string, Set<z.ZodType>>();\n\n return {\n zodRegistry: z.globalRegistry,\n register: (schema, id) => {\n z.globalRegistry.add(schema, { id });\n let set = seen.get(id);\n if (set === undefined) {\n set = new Set<z.ZodType>();\n seen.set(id, set);\n }\n set.add(schema);\n },\n hasCollision: (id) => {\n const set = seen.get(id);\n return set !== undefined && set.size > 1;\n },\n getCollisions: () => {\n const out = new Map<string, Set<z.ZodType>>();\n for (const [id, set] of seen) {\n if (set.size <= 1) {\n continue;\n }\n out.set(id, set);\n }\n return out;\n },\n };\n};\n\n/**\n * Process-wide default registry. `createZodDto` registers schemas here unless\n * the caller passes `options.registry`. Phase 2e's doc merger reads from the\n * same instance for bulk emission. Multi-app WeakMap isolation is deferred\n * to v0.2.\n */\nexport const defaultRegistry: ZodNestRegistry = createRegistry();\n","import type { Io } from './dto.types.js';\n\n/**\n * Payload of the `x-zod-nest-dto` placeholder property that\n * `_OPENAPI_METADATA_FACTORY` returns. Phase 2e's doc merger reads this off\n * each `components.schemas.<DtoName>.properties[x-zod-nest-dto]` entry,\n * uses `dtoId` to look up the schema in the registry, and replaces the\n * synthetic schema body with the real Zod-derived schema.\n *\n * `type` and `required` are benign filler that satisfy @nestjs/swagger's\n * property-type guard (without them, the explorer throws \"A circular\n * dependency has been detected\"). They have no semantic meaning and are\n * stripped along with the rest of the marker by Phase 2e.\n */\nexport interface ZodDtoMarker {\n readonly type: () => typeof Object;\n readonly required: false;\n readonly __zodNestDto: true;\n readonly dtoId: string;\n readonly io: Io;\n}\n\nexport const makeZodDtoMarker = (dtoId: string, io: Io): ZodDtoMarker => ({\n type: () => Object,\n required: false,\n __zodNestDto: true,\n dtoId,\n io,\n});\n\n/** Phase 2e (and tests) use this to discriminate a marker from a real schema. */\nexport const isZodDtoMarker = (value: unknown): value is ZodDtoMarker => {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as { __zodNestDto?: unknown }).__zodNestDto === true;\n};\n","/**\n * Runtime detection marker placed on every class returned by `createZodDto`.\n * Used by the validation pipe (Phase 2c), serializer (2d), and doc merger (2e)\n * to discriminate zod-nest DTO classes from regular constructors.\n */\nexport const ZOD_DTO_SYMBOL: unique symbol = Symbol.for('zod-nest.dto');\n","import type { z } from 'zod';\nimport type { Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Cache of `parent -> output-sibling` so repeated reads of `Dto.Output` return\n * the same class instance. WeakMap so the sibling can be GC'd if the parent is.\n */\nconst outputCache = new WeakMap<ZodDto<z.ZodType>, ZodDto<z.ZodType>>();\n\n/**\n * `.Output` is always a distinct sibling class — it carries `io: 'output'` so\n * the Phase 2e doc-merger can run the output-side emission and apply the\n * suffix truth table (`Foo` alone vs `Foo` + `FooOutput`) based on actual JSON\n * Schema equality at doc-build time. The earlier \"return self when io-identical\"\n * optimization was dropped because `z.object()` already diverges at the JSON\n * Schema level (input is permissive, output sets `additionalProperties: false`),\n * which would have made the sibling reused only for non-object roots — not\n * worth the implementation complexity.\n */\nconst buildSiblingClass = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const SiblingClass = class {\n static readonly schema = schema;\n static readonly io: Io = 'output';\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return parent.id;\n }\n\n static get Output(): ZodDto<TSchema> {\n return this as unknown as ZodDto<TSchema>;\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(parent.id, 'output') };\n }\n };\n return SiblingClass as unknown as ZodDto<TSchema>;\n};\n\nexport const resolveOutput = <TSchema extends z.ZodType>(\n parent: ZodDto<TSchema>,\n schema: TSchema,\n): ZodDto<TSchema> => {\n const cached = outputCache.get(parent as ZodDto<z.ZodType>);\n if (cached !== undefined) {\n return cached as ZodDto<TSchema>;\n }\n const sibling = buildSiblingClass(parent, schema);\n outputCache.set(parent as ZodDto<z.ZodType>, sibling as ZodDto<z.ZodType>);\n return sibling;\n};\n","import type { z } from 'zod';\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { CreateZodDtoOptions, Io, ZodDto } from './dto.types.js';\n\nimport { ZOD_NEST_DTO_EXTENSION } from '../schema/constants.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { makeZodDtoMarker } from './marker.js';\nimport { resolveOutput } from './output-dto.js';\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\nlet anonCounter = 0;\nlet warnedOnAnonymous = false;\n\nconst resolveId = (\n registry: ZodNestRegistry,\n schema: z.ZodType,\n providedId: string | undefined,\n className: string,\n): string => {\n if (providedId !== undefined && providedId !== '') {\n return providedId;\n }\n const meta = registry.zodRegistry.get(schema) as { id?: string } | undefined;\n if (meta && typeof meta.id === 'string' && meta.id !== '') {\n return meta.id;\n }\n if (className !== '' && className.length > 1) {\n return className;\n }\n anonCounter += 1;\n const fallback = `_AnonZodDto_${anonCounter}`;\n if (!warnedOnAnonymous) {\n warnedOnAnonymous = true;\n // eslint-disable-next-line no-console\n console.warn(\n `[zod-nest] Could not resolve a DTO id from class name (got \"${className}\"). ` +\n `Using \"${fallback}\". Pass \\`createZodDto(schema, { id: 'Foo' })\\` to set a stable ` +\n `name — important under minification, where class names become single mangled characters.`,\n );\n }\n return fallback;\n};\n\nexport const createZodDto = <TSchema extends z.ZodType>(\n schema: TSchema,\n options?: CreateZodDtoOptions,\n): ZodDto<TSchema> => {\n const registry: ZodNestRegistry = options?.registry ?? defaultRegistry;\n const io: Io = 'input';\n let cachedId: string | undefined;\n\n const ensureRegistered = (className: string): string => {\n if (cachedId !== undefined) {\n return cachedId;\n }\n cachedId = resolveId(registry, schema, options?.id, className);\n registry.register(schema, cachedId);\n return cachedId;\n };\n\n const ZodDtoBase = class {\n static readonly schema = schema;\n static readonly io: Io = io;\n static readonly [ZOD_DTO_SYMBOL] = true as const;\n\n static get id(): string {\n return ensureRegistered(this.name);\n }\n\n static get Output(): ZodDto<TSchema> {\n return resolveOutput(this as unknown as ZodDto<TSchema>, schema);\n }\n\n static parse(input: unknown): z.infer<TSchema> {\n return schema.parse(input) as z.infer<TSchema>;\n }\n\n static safeParse(input: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return schema.safeParse(input) as z.ZodSafeParseResult<z.infer<TSchema>>;\n }\n\n static _OPENAPI_METADATA_FACTORY(): Record<string, unknown> {\n return { [ZOD_NEST_DTO_EXTENSION]: makeZodDtoMarker(ensureRegistered(this.name), io) };\n }\n };\n\n return ZodDtoBase as unknown as ZodDto<TSchema>;\n};\n","import type { ZodDto } from './dto.types.js';\n\nimport { ZOD_DTO_SYMBOL } from './symbols.js';\n\n/**\n * Runtime guard: is `value` a class returned by `createZodDto`?\n *\n * Used by the validation pipe (Phase 2c), the serializer interceptor (2d),\n * and the doc merger (2e) to discriminate zod-nest DTOs from plain\n * constructors, class-validator DTOs, primitives, and any other metatypes\n * NestJS exposes via `ArgumentMetadata`.\n */\nexport const isZodDto = (value: unknown): value is ZodDto =>\n typeof value === 'function' &&\n (value as unknown as Record<symbol, unknown>)[ZOD_DTO_SYMBOL] === true;\n","import { BadRequestException, HttpStatus } from '@nestjs/common';\nimport { z } from 'zod';\n\nimport type { ArgumentMetadata } from '@nestjs/common';\n\n/**\n * Default exception thrown by `ZodValidationPipe` when input fails to parse.\n *\n * Body shape (returned by `getResponse()`):\n * ```\n * {\n * statusCode: 400,\n * message: 'Validation failed',\n * errors: z.treeifyError(zodError),\n * }\n * ```\n *\n * Carries `zodError` and `argMetadata` so custom exception filters can\n * introspect the original validation failure.\n */\nexport class ZodValidationException extends BadRequestException {\n readonly zodError: z.ZodError;\n readonly argMetadata?: ArgumentMetadata;\n\n constructor(zodError: z.ZodError, argMetadata?: ArgumentMetadata) {\n super({\n statusCode: HttpStatus.BAD_REQUEST,\n message: 'Validation failed',\n errors: z.treeifyError(zodError),\n });\n this.zodError = zodError;\n this.argMetadata = argMetadata;\n }\n}\n","import { Injectable, Optional } from '@nestjs/common';\n\nimport type { ArgumentMetadata, PipeTransform } from '@nestjs/common';\nimport type { z } from 'zod';\nimport type {\n CreateValidationException,\n ZodValidationPipeArg,\n ZodValidationPipeOptions,\n} from './types.js';\n\nimport { isZodDto } from '../dto/predicates.js';\nimport { ZodValidationException } from '../exceptions/validation.exception.js';\n\nconst isZodSchema = (value: unknown): value is z.ZodType =>\n value !== null && typeof value === 'object' && '_zod' in value;\n\nconst isOptionsObject = (value: unknown): value is ZodValidationPipeOptions =>\n value !== null && typeof value === 'object' && !isZodSchema(value);\n\nconst defaultExceptionFactory: CreateValidationException = (zodError, argMetadata) =>\n new ZodValidationException(zodError, argMetadata);\n\n@Injectable()\nexport class ZodValidationPipe implements PipeTransform {\n private readonly explicitSchema: z.ZodType | undefined;\n private readonly createValidationException: CreateValidationException;\n\n constructor(@Optional() arg?: ZodValidationPipeArg) {\n const { schema, factory } = ZodValidationPipe.parseArg(arg);\n this.explicitSchema = schema;\n this.createValidationException = factory;\n }\n\n async transform(value: unknown, metadata: ArgumentMetadata): Promise<unknown> {\n const schema = this.resolveSchema(metadata);\n if (schema === undefined) {\n return value;\n }\n const result = await schema.safeParseAsync(value);\n if (result.success) {\n return result.data;\n }\n throw this.createValidationException(result.error, metadata);\n }\n\n private resolveSchema(metadata: ArgumentMetadata): z.ZodType | undefined {\n if (this.explicitSchema !== undefined) {\n return this.explicitSchema;\n }\n const metatype: unknown = metadata.metatype;\n if (!isZodDto(metatype)) {\n return undefined;\n }\n return metatype.schema;\n }\n\n private static parseArg(arg: ZodValidationPipeArg | undefined): {\n schema: z.ZodType | undefined;\n factory: CreateValidationException;\n } {\n if (arg === undefined) {\n return { schema: undefined, factory: defaultExceptionFactory };\n }\n if (isZodDto(arg)) {\n return { schema: arg.schema, factory: defaultExceptionFactory };\n }\n if (isZodSchema(arg)) {\n return { schema: arg, factory: defaultExceptionFactory };\n }\n if (!isOptionsObject(arg)) {\n return { schema: undefined, factory: defaultExceptionFactory };\n }\n const optionSchema = arg.schema;\n const resolvedSchema = isZodDto(optionSchema) ? optionSchema.schema : optionSchema;\n return {\n schema: resolvedSchema,\n factory: arg.createValidationException ?? defaultExceptionFactory,\n };\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod-nest",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Modern Zod v4-only NestJS + OpenAPI 3.1 integration. Successor to nestjs-zod.",
5
5
  "license": "MIT",
6
6
  "author": "Rodrigo Azevedo",
@@ -79,6 +79,7 @@
79
79
  "@semantic-release/npm": "^12.0.0",
80
80
  "@types/jest": "^29.5.14",
81
81
  "@types/node": "^22.10.0",
82
+ "@types/supertest": "^7.2.0",
82
83
  "eslint": "^9.16.0",
83
84
  "eslint-config-prettier": "^9.1.0",
84
85
  "eslint-plugin-jest": "^28.10.0",
@@ -93,6 +94,7 @@
93
94
  "reflect-metadata": "^0.2.2",
94
95
  "rxjs": "^7.8.1",
95
96
  "semantic-release": "^24.2.0",
97
+ "supertest": "^7.2.2",
96
98
  "ts-jest": "^29.2.5",
97
99
  "tsup": "^8.3.5",
98
100
  "typescript": "^5.7.2",