zod-nest 3.2.2 → 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +1 -0
  2. package/dist/{chunk-RAF7JGS6.mjs → chunk-47ML6LKE.mjs} +5 -5
  3. package/dist/{chunk-RAF7JGS6.mjs.map → chunk-47ML6LKE.mjs.map} +1 -1
  4. package/dist/{chunk-LXRBMFWD.js → chunk-4LOFWANL.js} +6 -6
  5. package/dist/{chunk-LXRBMFWD.js.map → chunk-4LOFWANL.js.map} +1 -1
  6. package/dist/{chunk-26E2XEJU.js → chunk-6FL3HR4I.js} +45 -45
  7. package/dist/{chunk-26E2XEJU.js.map → chunk-6FL3HR4I.js.map} +1 -1
  8. package/dist/{chunk-LHNXO52A.mjs → chunk-7IPDYJNI.mjs} +15 -26
  9. package/dist/chunk-7IPDYJNI.mjs.map +1 -0
  10. package/dist/{chunk-FKXVNCDD.js → chunk-DUQLL62I.js} +73 -84
  11. package/dist/chunk-DUQLL62I.js.map +1 -0
  12. package/dist/chunk-EV5I5HGT.js +127 -0
  13. package/dist/chunk-EV5I5HGT.js.map +1 -0
  14. package/dist/{chunk-WI4JKXT6.mjs → chunk-IMEFMJTS.mjs} +3 -3
  15. package/dist/{chunk-WI4JKXT6.mjs.map → chunk-IMEFMJTS.mjs.map} +1 -1
  16. package/dist/chunk-MPNAA53V.mjs +119 -0
  17. package/dist/chunk-MPNAA53V.mjs.map +1 -0
  18. package/dist/express/index.js +20 -20
  19. package/dist/express/index.mjs +5 -5
  20. package/dist/fastify/index.js +11 -11
  21. package/dist/fastify/index.mjs +5 -5
  22. package/dist/helpers/index.js +24 -24
  23. package/dist/helpers/index.mjs +3 -3
  24. package/dist/index.js +203 -203
  25. package/dist/index.mjs +4 -4
  26. package/package.json +1 -1
  27. package/dist/chunk-4RXGLSPP.js +0 -73
  28. package/dist/chunk-4RXGLSPP.js.map +0 -1
  29. package/dist/chunk-FKXVNCDD.js.map +0 -1
  30. package/dist/chunk-LHNXO52A.mjs.map +0 -1
  31. package/dist/chunk-ZZW54ETO.mjs +0 -67
  32. package/dist/chunk-ZZW54ETO.mjs.map +0 -1
package/README.md CHANGED
@@ -533,6 +533,7 @@ upload(
533
533
  | Swagger integration & custom emission | [`docs/swagger-integration.md`](docs/swagger-integration.md) |
534
534
  | File uploads (multipart/form-data) | [`docs/file-uploads.md`](docs/file-uploads.md) |
535
535
  | Composition (experimental) | [`docs/composition.md`](docs/composition.md) |
536
+ | Schema identity & clones | [`docs/schema-identity.md`](docs/schema-identity.md) |
536
537
  | Exception classes | [`docs/exceptions.md`](docs/exceptions.md) |
537
538
  | Recipes | [`docs/recipes/`](docs/recipes/) |
538
539
 
@@ -1,6 +1,6 @@
1
- import { ZodValidationException, defaultRegistry, isZodSchema, isZodObject, flattenObjectIntersection, resolveSchemaRef } from './chunk-LHNXO52A.mjs';
2
- import { binary } from './chunk-WI4JKXT6.mjs';
3
- import { singleton, __name, overrideJSONSchema } from './chunk-ZZW54ETO.mjs';
1
+ import { ZodValidationException, defaultRegistry, isZodSchema, isZodObject, flattenObjectIntersection, resolveSchemaRef } from './chunk-7IPDYJNI.mjs';
2
+ import { binary } from './chunk-IMEFMJTS.mjs';
3
+ import { singleton, __name, overrideJSONSchema } from './chunk-MPNAA53V.mjs';
4
4
  import { z } from 'zod';
5
5
  import { ApiConsumes, ApiBody } from '@nestjs/swagger';
6
6
  import { createParamDecorator } from '@nestjs/common';
@@ -282,5 +282,5 @@ var ZodUploadedFiles = createParamDecorator(resolveUploadedFiles);
282
282
  var ZodMultipartBody = createParamDecorator(resolveMultipartBody);
283
283
 
284
284
  export { MULTIPART_CONTENT_TYPE, MultipartFilesIn, ZodMultipartBody, ZodUploadedFile, ZodUploadedFiles, buildFileSchema, createZodMultipart };
285
- //# sourceMappingURL=chunk-RAF7JGS6.mjs.map
286
- //# sourceMappingURL=chunk-RAF7JGS6.mjs.map
285
+ //# sourceMappingURL=chunk-47ML6LKE.mjs.map
286
+ //# sourceMappingURL=chunk-47ML6LKE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/multipart/file-checks.ts","../src/multipart/file-marker.ts","../src/multipart/build-file-schema.ts","../src/multipart/metadata.ts","../src/multipart/zod-multipart.decorator.ts","../src/multipart/param-decorators.ts"],"names":["normalizeExtension","extension","startsWith","toLowerCase","mimeTypeCheck","accessors","options","allowed","Set","mimeTypes","map","mimeType","payload","value","has","issues","push","code","input","message","join","extensionCheck","extensions","fileName","matched","some","endsWith","sizeCheck","readSize","size","maxSize","fileSchemas","singleton","WeakSet","isZodType","innerOf","def","innerType","element","undefined","unwrapOnce","schema","inner","_zod","markFileSchema","add","isFileSchema","resolveFragment","contentMediaType","singleMimeType","binary","description","length","collectChecks","params","checks","withId","fragment","id","overrideJSONSchema","meta","buildFileSchema","base","z","custom","predicate","checked","check","MultipartFilesIn","Request","Body","ZOD_MULTIPART_METADATA_KEY","Symbol","for","MULTIPART_CONTENT_TYPE","toSchema","body","isZodSchema","object","toShape","isZodObject","shape","partitionKeys","fileKeys","textKeys","key","Object","entries","resolveBody","registry","flatten","flattenObjectIntersection","resolved","resolveSchemaRef","kind","ref","createZodMultipart","defaultFilesIn","defaultRegistry","metadata","filesIn","target","propertyKey","descriptor","handler","TypeError","Reflect","defineMetadata","swaggerDescriptor","ApiConsumes","ApiBody","required","readMetadata","ctx","decorator","getMetadata","getHandler","isMultipartMetadata","Error","requireShape","schemaFor","name","keys","pick","wanted","picked","validate","argType","result","safeParseAsync","success","data","ZodValidationException","error","type","metatype","assertFilesOnRequest","resolveUploadedFile","request","switchToHttp","getRequest","file","resolveUploadedFiles","files","resolveMultipartBody","_data","ZodUploadedFile","createParamDecorator","ZodUploadedFiles","ZodMultipartBody"],"mappings":"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","file":"chunk-RAF7JGS6.mjs","sourcesContent":["import type { z } from 'zod';\n\n/**\n * Reads the fields a check needs off a platform file object. Multer names the\n * client filename `originalname`, `@fastify/multipart` names it `filename`,\n * and only multer reports a `size` — so each platform supplies its own\n * accessors instead of the library inventing a common shape.\n */\nexport interface FileAccessors<TFile> {\n readonly mimeType: (file: TFile) => string;\n readonly fileName: (file: TFile) => string;\n readonly size?: (file: TFile) => number;\n}\n\nexport interface MimeTypeCheckOptions {\n readonly mimeTypes: readonly string[];\n}\n\nexport interface ExtensionCheckOptions {\n readonly extensions: readonly string[];\n}\n\nexport interface SizeCheckOptions {\n readonly maxSize: number;\n}\n\nexport type FileCheck<TFile> = (payload: z.core.ParsePayload<TFile>) => void;\n\nconst normalizeExtension = (extension: string): string =>\n extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\nexport const mimeTypeCheck = <TFile>(\n accessors: FileAccessors<TFile>,\n options: MimeTypeCheckOptions,\n): FileCheck<TFile> => {\n const allowed = new Set(options.mimeTypes.map((mimeType) => mimeType.toLowerCase()));\n return (payload) => {\n const mimeType = accessors.mimeType(payload.value).toLowerCase();\n if (allowed.has(mimeType)) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected one of ${options.mimeTypes.join(', ')}, received ${mimeType}`,\n });\n };\n};\n\nexport const extensionCheck = <TFile>(\n accessors: FileAccessors<TFile>,\n options: ExtensionCheckOptions,\n): FileCheck<TFile> => {\n const allowed = new Set(options.extensions.map(normalizeExtension));\n return (payload) => {\n const fileName = accessors.fileName(payload.value).toLowerCase();\n const matched = [...allowed].some((extension) => fileName.endsWith(extension));\n if (matched) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected a file ending in ${options.extensions.map(normalizeExtension).join(', ')}, received ${fileName}`,\n });\n };\n};\n\nexport const sizeCheck = <TFile>(\n readSize: (file: TFile) => number,\n options: SizeCheckOptions,\n): FileCheck<TFile> => {\n return (payload) => {\n const size = readSize(payload.value);\n if (size <= options.maxSize) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected at most ${options.maxSize} bytes, received ${size}`,\n });\n };\n};\n","import type { z } from 'zod';\n\nimport { singleton } from '../schema/singleton.js';\n\n/**\n * Per-instance tag for schemas produced by the platform file factories.\n * WeakSet rather than `z.registry` because this is transient per-instance\n * annotation, not stable id-keyed metadata (CLAUDE.md).\n */\nconst fileSchemas = singleton('file-schemas', () => new WeakSet<z.ZodType>());\n\n// Wrapper defs expose their inner schema as Zod's internal `$ZodType`, which\n// `in` narrowing widens to `unknown`. One guard converts back to the public\n// type and rejects a non-wrapper in the same step.\nconst isZodType = (value: unknown): value is z.ZodType =>\n value !== null && typeof value === 'object' && '_zod' in value;\n\nconst innerOf = (def: object): unknown => {\n if ('innerType' in def) {\n return def.innerType;\n }\n if ('element' in def) {\n return def.element;\n }\n return undefined;\n};\n\nconst unwrapOnce = (schema: z.ZodType): z.ZodType | undefined => {\n const inner = innerOf(schema._zod.def);\n return isZodType(inner) ? inner : undefined;\n};\n\nexport const markFileSchema = <T extends z.ZodType>(schema: T): T => {\n fileSchemas.add(schema);\n return schema;\n};\n\n/**\n * True for a factory-produced file schema and for `.optional()` / `.array()`\n * wrappers around one — an optional or repeated file field is still a file\n * field for the request-vs-body split.\n */\nexport const isFileSchema = (schema: z.ZodType): boolean => {\n if (fileSchemas.has(schema)) {\n return true;\n }\n const inner = unwrapOnce(schema);\n if (inner === undefined) {\n return false;\n }\n return isFileSchema(inner);\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from '../schema/openapi.types.js';\nimport type { FileAccessors, FileCheck } from './file-checks.js';\n\nimport { binary } from '../helpers/fragments.js';\nimport { overrideJSONSchema } from '../schema/custom-override.js';\nimport { extensionCheck, mimeTypeCheck, sizeCheck } from './file-checks.js';\nimport { markFileSchema } from './file-marker.js';\n\nexport interface BaseFileOptions {\n /**\n * Registry id for the schema. Set it to get a reusable\n * `components.schemas` entry that every field `$ref`s, instead of the\n * fragment being inlined at each use site. There is no `title` counterpart\n * — `overrideJSONSchema` replaces the emitted body and does not carry\n * `title` into it, so one would have no effect.\n */\n readonly id?: string;\n /** Allowed MIME types, matched case-insensitively against the client-supplied value. */\n readonly mimeTypes?: readonly string[];\n /** Allowed filename extensions, with or without a leading dot. */\n readonly extensions?: readonly string[];\n /** OpenAPI `description` for the emitted binary property. */\n readonly description?: string;\n /** Overrides the `contentMediaType` derived from a single-entry `mimeTypes`. */\n readonly contentMediaType?: string;\n}\n\nexport interface BuildFileSchemaParams<TFile> {\n readonly predicate: (value: unknown) => boolean;\n readonly accessors: FileAccessors<TFile>;\n readonly options: BaseFileOptions | undefined;\n /** Byte-size ceiling. Only platforms that report a size pass this. */\n readonly maxSize?: number;\n}\n\nconst resolveFragment = (options: BaseFileOptions | undefined): SchemaObject => {\n const contentMediaType = options?.contentMediaType ?? singleMimeType(options?.mimeTypes);\n return binary({\n ...(options?.description !== undefined ? { description: options.description } : {}),\n ...(contentMediaType !== undefined ? { contentMediaType } : {}),\n });\n};\n\nconst singleMimeType = (mimeTypes: readonly string[] | undefined): string | undefined => {\n if (mimeTypes === undefined || mimeTypes.length !== 1) {\n return undefined;\n }\n return mimeTypes[0];\n};\n\nconst collectChecks = <TFile>(params: BuildFileSchemaParams<TFile>): Array<FileCheck<TFile>> => {\n const { accessors, options, maxSize } = params;\n const checks: Array<FileCheck<TFile>> = [];\n if (options?.mimeTypes !== undefined) {\n checks.push(mimeTypeCheck(accessors, { mimeTypes: options.mimeTypes }));\n }\n if (options?.extensions !== undefined) {\n checks.push(extensionCheck(accessors, { extensions: options.extensions }));\n }\n if (maxSize !== undefined && accessors.size !== undefined) {\n checks.push(sizeCheck(accessors.size, { maxSize }));\n }\n return checks;\n};\n\nconst withId = <TFile>(\n schema: z.ZodType<TFile, TFile>,\n options: BaseFileOptions | undefined,\n fragment: SchemaObject,\n): z.ZodType<TFile, TFile> => {\n if (options?.id === undefined) {\n return schema;\n }\n return overrideJSONSchema(schema.meta({ id: options.id }), fragment);\n};\n\n/**\n * Assemble a platform file schema: duck-typing predicate, the option checks,\n * then `.meta({ id })` — re-registering the binary fragment after every step.\n *\n * Each registration is load-bearing. `overrideJSONSchema` keys its fragment on\n * the schema *instance*, and both `.check()` and `.meta()` clone. Emission\n * visits every instance in the chain, so a step left unregistered emits `{}`\n * — as a bare `{}` property in strict mode, or as an empty `components.schemas`\n * entry when the schema is named.\n */\nexport const buildFileSchema = <TFile>(\n params: BuildFileSchemaParams<TFile>,\n): z.ZodType<TFile, TFile> => {\n const fragment = resolveFragment(params.options);\n const base = overrideJSONSchema(z.custom<TFile>(params.predicate), fragment);\n const checks = collectChecks(params);\n const checked = checks.length === 0 ? base : overrideJSONSchema(base.check(...checks), fragment);\n return markFileSchema(withId(checked, params.options, fragment));\n};\n","import type { z } from 'zod';\n\n/**\n * Where the multipart parser puts uploaded files. Multer leaves them on the\n * request (`req.file` / `req.files`) with only text fields in `req.body`;\n * `@fastify/multipart` with `attachFieldsToBody: true` puts everything in\n * `req.body`.\n */\nexport const MultipartFilesIn = {\n Request: 'request',\n Body: 'body',\n} as const;\n\nexport type MultipartFilesIn = (typeof MultipartFilesIn)[keyof typeof MultipartFilesIn];\n\n/** Shape accepted by `@ZodMultipart` — one Zod schema per form field. */\nexport type MultipartShape = Readonly<Record<string, z.ZodType>>;\n\nexport interface MultipartMetadata {\n /**\n * Flat shape the param decorators validate against. `undefined` when the\n * body is a composite (`z.intersection` / `z.union`) with no single flat\n * shape to split — the document still emits, but `@ZodUploadedFile` and\n * friends have nothing to resolve and say so.\n */\n readonly shape: MultipartShape | undefined;\n readonly fileKeys: readonly string[];\n readonly textKeys: readonly string[];\n readonly filesIn: MultipartFilesIn;\n}\n\n/**\n * Metadata key for the shape declared by `@ZodMultipart`. `Symbol.for` so\n * consumers in other realms read the same registry (CLAUDE.md).\n */\nexport const ZOD_MULTIPART_METADATA_KEY = Symbol.for('zod-nest.multipart');\n","import { ApiBody, ApiConsumes } from '@nestjs/swagger';\nimport { z } from 'zod';\n\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { MultipartFilesIn, MultipartMetadata, MultipartShape } from './metadata.js';\n\nimport { flattenObjectIntersection } from '../decorators/internal/flatten-intersection.js';\nimport { isZodObject } from '../decorators/internal/zod-param-expand.js';\nimport { resolveSchemaRef } from '../decorators/internal/zod-schema-ref.js';\nimport { isZodSchema } from '../dto/predicates.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { isFileSchema } from './file-marker.js';\nimport { ZOD_MULTIPART_METADATA_KEY } from './metadata.js';\n\nexport const MULTIPART_CONTENT_TYPE = 'multipart/form-data';\n\n/**\n * Body declaration accepted by `@ZodMultipart`: a flat shape record, or any\n * Zod schema. A record is the common case; a schema covers named bodies\n * (`.meta({ id })` → `$ref`) and composites an object literal can't express.\n */\nexport type MultipartBody = MultipartShape | z.ZodType;\n\nexport interface ZodMultipartOptions {\n /**\n * Where the parser puts uploaded files. Defaults to the platform entry\n * point's convention — `'request'` from `zod-nest/express`, `'body'` from\n * `zod-nest/fastify`.\n */\n readonly filesIn?: MultipartFilesIn;\n /**\n * Forces this id, overriding any `.meta({ id })` on the schema. A named body\n * is emitted as a `$ref` to `components.schemas`, which keeps a stable name\n * for client generators — at the cost of Swagger UI's `try-it-out` form,\n * which doesn't follow `$ref` for `multipart/form-data`.\n */\n readonly id?: string;\n /**\n * Merge an intersection / union of `z.object` arms into one flat inline\n * object. Needed for composite bodies whose `try-it-out` form must render.\n * All merged properties become optional. See `@ZodBody`'s `flatten`.\n */\n readonly flatten?: boolean;\n /** Registry to register named descendants into. Defaults to `defaultRegistry`. */\n readonly registry?: ZodNestRegistry;\n /** OpenAPI `description` for the request body. */\n readonly description?: string;\n /** Whether the body is required. Defaults to `true`. */\n readonly required?: boolean;\n}\n\nconst toSchema = (body: MultipartBody): z.ZodType =>\n isZodSchema(body) ? body : z.object({ ...body });\n\n/**\n * The flat shape the param decorators split on. A record is already flat and a\n * `z.object` exposes one; a composite has none, and the decorators report that\n * rather than guessing.\n */\nconst toShape = (body: MultipartBody): MultipartShape | undefined => {\n if (!isZodSchema(body)) {\n return body;\n }\n return isZodObject(body) ? body.shape : undefined;\n};\n\nconst partitionKeys = (\n shape: MultipartShape | undefined,\n): { fileKeys: string[]; textKeys: string[] } => {\n const fileKeys: string[] = [];\n const textKeys: string[] = [];\n for (const [key, schema] of Object.entries(shape ?? {})) {\n if (isFileSchema(schema)) {\n fileKeys.push(key);\n continue;\n }\n textKeys.push(key);\n }\n return { fileKeys, textKeys };\n};\n\n/**\n * Resolves the operation's body. Anonymous bodies emit inline because Swagger\n * UI's `multipart/form-data` form generator doesn't follow `$ref` — a\n * referenced body renders one stub field instead of file pickers. Naming the\n * body (`id` or `.meta({ id })`) opts into the `$ref` and that trade-off.\n */\nconst resolveBody = (\n schema: z.ZodType,\n options: ZodMultipartOptions | undefined,\n registry: ZodNestRegistry,\n): Record<string, unknown> | { readonly $ref: string } => {\n if (options?.flatten === true) {\n return flattenObjectIntersection(schema, registry, '@ZodMultipart');\n }\n const resolved = resolveSchemaRef(schema, {\n ...(options?.id !== undefined ? { id: options.id } : {}),\n registry,\n });\n return resolved.kind === 'ref' ? resolved.ref : resolved.schema;\n};\n\nexport const createZodMultipart = (defaultFilesIn: MultipartFilesIn) => {\n /**\n * Declares an endpoint's whole `multipart/form-data` body — file fields and\n * text fields together — as the single source of truth for both the OpenAPI\n * document and the multipart param decorators.\n */\n return (body: MultipartBody, options?: ZodMultipartOptions): MethodDecorator => {\n const registry = options?.registry ?? defaultRegistry;\n const shape = toShape(body);\n const metadata: MultipartMetadata = {\n shape,\n ...partitionKeys(shape),\n filesIn: options?.filesIn ?? defaultFilesIn,\n };\n const schema = resolveBody(toSchema(body), options, registry);\n\n return (target, propertyKey, descriptor) => {\n const handler = descriptor.value;\n if (typeof handler !== 'function') {\n throw new TypeError('[zod-nest] @ZodMultipart can only be applied to methods.');\n }\n Reflect.defineMetadata(ZOD_MULTIPART_METADATA_KEY, metadata, handler);\n\n // `TypedPropertyDescriptor<unknown>` matches what the swagger decorators\n // expect; `MethodDecorator`'s parameter is `TypedPropertyDescriptor<T>`\n // for the inferred return type, structurally compatible at runtime.\n const swaggerDescriptor = descriptor as TypedPropertyDescriptor<unknown>;\n ApiConsumes(MULTIPART_CONTENT_TYPE)(target, propertyKey, swaggerDescriptor);\n ApiBody({\n schema,\n ...(options?.description !== undefined ? { description: options.description } : {}),\n required: options?.required ?? true,\n })(target, propertyKey, swaggerDescriptor);\n };\n };\n};\n","import { createParamDecorator } from '@nestjs/common';\nimport { z } from 'zod';\n\nimport type { ExecutionContext } from '@nestjs/common';\nimport type { MultipartMetadata, MultipartShape } from './metadata.js';\n\nimport { ZodValidationException } from '../exceptions/validation.exception.js';\nimport { MultipartFilesIn, ZOD_MULTIPART_METADATA_KEY } from './metadata.js';\n\ntype ArgType = 'body' | 'custom';\n\nconst readMetadata = (ctx: ExecutionContext, decorator: string): MultipartMetadata => {\n const metadata: unknown = Reflect.getMetadata(ZOD_MULTIPART_METADATA_KEY, ctx.getHandler());\n if (!isMultipartMetadata(metadata)) {\n throw new Error(\n `[zod-nest] ${decorator} requires @ZodMultipart on the same handler — it reads the declared shape from there.`,\n );\n }\n return metadata;\n};\n\nconst isMultipartMetadata = (value: unknown): value is MultipartMetadata =>\n value !== null && typeof value === 'object' && 'shape' in value && 'filesIn' in value;\n\n/**\n * The declared shape, or a pointed error when the body is a composite. An\n * intersection / union has no single flat shape to split, so there is nothing\n * for these decorators to resolve a field against.\n */\nconst requireShape = (metadata: MultipartMetadata, decorator: string): MultipartShape => {\n if (metadata.shape !== undefined) {\n return metadata.shape;\n }\n throw new Error(\n `[zod-nest] ${decorator} needs a flat body shape, but @ZodMultipart was given a composite schema (an intersection or union). Validate it with @Body(new ZodValidationPipe(schema)) instead.`,\n );\n};\n\nconst schemaFor = (metadata: MultipartMetadata, name: string, decorator: string): z.ZodType => {\n const shape = requireShape(metadata, decorator);\n const schema = shape[name];\n if (schema === undefined) {\n throw new Error(\n `[zod-nest] ${decorator}('${name}') has no matching property in the @ZodMultipart shape. Declared: ${Object.keys(shape).join(', ')}.`,\n );\n }\n return schema;\n};\n\nconst pick = (shape: MultipartShape, keys: readonly string[]): z.ZodType => {\n const wanted = new Set(keys);\n const picked: Record<string, z.ZodType> = {};\n for (const [key, schema] of Object.entries(shape)) {\n if (wanted.has(key)) {\n picked[key] = schema;\n }\n }\n return z.object(picked);\n};\n\nconst validate = async (schema: z.ZodType, value: unknown, argType: ArgType): Promise<unknown> => {\n const result = await schema.safeParseAsync(value);\n if (result.success) {\n return result.data;\n }\n throw new ZodValidationException(result.error, {\n type: argType,\n metatype: undefined,\n data: undefined,\n });\n};\n\nconst assertFilesOnRequest = (metadata: MultipartMetadata, decorator: string): void => {\n if (metadata.filesIn === MultipartFilesIn.Request) {\n return;\n }\n throw new Error(\n `[zod-nest] ${decorator} is unavailable under filesIn: 'body' — the parser puts files in the request body, so read them with @ZodMultipartBody().`,\n );\n};\n\nexport const resolveUploadedFile = async (\n name: string,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodUploadedFile');\n assertFilesOnRequest(metadata, '@ZodUploadedFile');\n const request: { file?: unknown } = ctx.switchToHttp().getRequest();\n return validate(schemaFor(metadata, name, '@ZodUploadedFile'), request.file, 'custom');\n};\n\nexport const resolveUploadedFiles = async (\n name: string | undefined,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodUploadedFiles');\n assertFilesOnRequest(metadata, '@ZodUploadedFiles');\n const request: { files?: unknown } = ctx.switchToHttp().getRequest();\n const schema =\n name === undefined\n ? pick(requireShape(metadata, '@ZodUploadedFiles'), metadata.fileKeys)\n : schemaFor(metadata, name, '@ZodUploadedFiles');\n return validate(schema, request.files, 'custom');\n};\n\nexport const resolveMultipartBody = async (\n _data: unknown,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodMultipartBody');\n const shape = requireShape(metadata, '@ZodMultipartBody');\n const request: { body?: unknown } = ctx.switchToHttp().getRequest();\n const keys = metadata.filesIn === MultipartFilesIn.Body ? Object.keys(shape) : metadata.textKeys;\n return validate(pick(shape, keys), request.body, 'body');\n};\n\n/**\n * Validates `req.file` against the named property of the `@ZodMultipart`\n * shape. The name selects a schema; it never searches the request. Match it\n * to your `FileInterceptor('<name>')` field name, as with plain Nest.\n */\nexport const ZodUploadedFile = createParamDecorator(resolveUploadedFile);\n\n/**\n * Validates `req.files` against the named property of the `@ZodMultipart`\n * shape, or against an object of every declared file property when called\n * with no name — the record shape `FileFieldsInterceptor` produces.\n */\nexport const ZodUploadedFiles = createParamDecorator(resolveUploadedFiles);\n\n/**\n * Validates `req.body` against the `@ZodMultipart` shape — the text fields\n * only under `filesIn: 'request'` (multer keeps files off the body), the\n * whole shape under `filesIn: 'body'`.\n */\nexport const ZodMultipartBody = createParamDecorator(resolveMultipartBody);\n"]}
1
+ {"version":3,"sources":["../src/multipart/file-checks.ts","../src/multipart/file-marker.ts","../src/multipart/build-file-schema.ts","../src/multipart/metadata.ts","../src/multipart/zod-multipart.decorator.ts","../src/multipart/param-decorators.ts"],"names":["normalizeExtension","extension","startsWith","toLowerCase","mimeTypeCheck","accessors","options","allowed","Set","mimeTypes","map","mimeType","payload","value","has","issues","push","code","input","message","join","extensionCheck","extensions","fileName","matched","some","endsWith","sizeCheck","readSize","size","maxSize","fileSchemas","singleton","WeakSet","isZodType","innerOf","def","innerType","element","undefined","unwrapOnce","schema","inner","_zod","markFileSchema","add","isFileSchema","resolveFragment","contentMediaType","singleMimeType","binary","description","length","collectChecks","params","checks","withId","fragment","id","overrideJSONSchema","meta","buildFileSchema","base","z","custom","predicate","checked","check","MultipartFilesIn","Request","Body","ZOD_MULTIPART_METADATA_KEY","Symbol","for","MULTIPART_CONTENT_TYPE","toSchema","body","isZodSchema","object","toShape","isZodObject","shape","partitionKeys","fileKeys","textKeys","key","Object","entries","resolveBody","registry","flatten","flattenObjectIntersection","resolved","resolveSchemaRef","kind","ref","createZodMultipart","defaultFilesIn","defaultRegistry","metadata","filesIn","target","propertyKey","descriptor","handler","TypeError","Reflect","defineMetadata","swaggerDescriptor","ApiConsumes","ApiBody","required","readMetadata","ctx","decorator","getMetadata","getHandler","isMultipartMetadata","Error","requireShape","schemaFor","name","keys","pick","wanted","picked","validate","argType","result","safeParseAsync","success","data","ZodValidationException","error","type","metatype","assertFilesOnRequest","resolveUploadedFile","request","switchToHttp","getRequest","file","resolveUploadedFiles","files","resolveMultipartBody","_data","ZodUploadedFile","createParamDecorator","ZodUploadedFiles","ZodMultipartBody"],"mappings":"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","file":"chunk-47ML6LKE.mjs","sourcesContent":["import type { z } from 'zod';\n\n/**\n * Reads the fields a check needs off a platform file object. Multer names the\n * client filename `originalname`, `@fastify/multipart` names it `filename`,\n * and only multer reports a `size` — so each platform supplies its own\n * accessors instead of the library inventing a common shape.\n */\nexport interface FileAccessors<TFile> {\n readonly mimeType: (file: TFile) => string;\n readonly fileName: (file: TFile) => string;\n readonly size?: (file: TFile) => number;\n}\n\nexport interface MimeTypeCheckOptions {\n readonly mimeTypes: readonly string[];\n}\n\nexport interface ExtensionCheckOptions {\n readonly extensions: readonly string[];\n}\n\nexport interface SizeCheckOptions {\n readonly maxSize: number;\n}\n\nexport type FileCheck<TFile> = (payload: z.core.ParsePayload<TFile>) => void;\n\nconst normalizeExtension = (extension: string): string =>\n extension.startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\nexport const mimeTypeCheck = <TFile>(\n accessors: FileAccessors<TFile>,\n options: MimeTypeCheckOptions,\n): FileCheck<TFile> => {\n const allowed = new Set(options.mimeTypes.map((mimeType) => mimeType.toLowerCase()));\n return (payload) => {\n const mimeType = accessors.mimeType(payload.value).toLowerCase();\n if (allowed.has(mimeType)) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected one of ${options.mimeTypes.join(', ')}, received ${mimeType}`,\n });\n };\n};\n\nexport const extensionCheck = <TFile>(\n accessors: FileAccessors<TFile>,\n options: ExtensionCheckOptions,\n): FileCheck<TFile> => {\n const allowed = new Set(options.extensions.map(normalizeExtension));\n return (payload) => {\n const fileName = accessors.fileName(payload.value).toLowerCase();\n const matched = [...allowed].some((extension) => fileName.endsWith(extension));\n if (matched) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected a file ending in ${options.extensions.map(normalizeExtension).join(', ')}, received ${fileName}`,\n });\n };\n};\n\nexport const sizeCheck = <TFile>(\n readSize: (file: TFile) => number,\n options: SizeCheckOptions,\n): FileCheck<TFile> => {\n return (payload) => {\n const size = readSize(payload.value);\n if (size <= options.maxSize) {\n return;\n }\n payload.issues.push({\n code: 'custom',\n input: payload.value,\n message: `Expected at most ${options.maxSize} bytes, received ${size}`,\n });\n };\n};\n","import type { z } from 'zod';\n\nimport { singleton } from '../schema/singleton.js';\n\n/**\n * Per-instance tag for schemas produced by the platform file factories.\n * WeakSet rather than `z.registry` because this is transient per-instance\n * annotation, not stable id-keyed metadata (CLAUDE.md).\n */\nconst fileSchemas = singleton('file-schemas', () => new WeakSet<z.ZodType>());\n\n// Wrapper defs expose their inner schema as Zod's internal `$ZodType`, which\n// `in` narrowing widens to `unknown`. One guard converts back to the public\n// type and rejects a non-wrapper in the same step.\nconst isZodType = (value: unknown): value is z.ZodType =>\n value !== null && typeof value === 'object' && '_zod' in value;\n\nconst innerOf = (def: object): unknown => {\n if ('innerType' in def) {\n return def.innerType;\n }\n if ('element' in def) {\n return def.element;\n }\n return undefined;\n};\n\nconst unwrapOnce = (schema: z.ZodType): z.ZodType | undefined => {\n const inner = innerOf(schema._zod.def);\n return isZodType(inner) ? inner : undefined;\n};\n\nexport const markFileSchema = <T extends z.ZodType>(schema: T): T => {\n fileSchemas.add(schema);\n return schema;\n};\n\n/**\n * True for a factory-produced file schema and for `.optional()` / `.array()`\n * wrappers around one — an optional or repeated file field is still a file\n * field for the request-vs-body split.\n */\nexport const isFileSchema = (schema: z.ZodType): boolean => {\n if (fileSchemas.has(schema)) {\n return true;\n }\n const inner = unwrapOnce(schema);\n if (inner === undefined) {\n return false;\n }\n return isFileSchema(inner);\n};\n","import { z } from 'zod';\n\nimport type { SchemaObject } from '../schema/openapi.types.js';\nimport type { FileAccessors, FileCheck } from './file-checks.js';\n\nimport { binary } from '../helpers/fragments.js';\nimport { overrideJSONSchema } from '../schema/custom-override.js';\nimport { extensionCheck, mimeTypeCheck, sizeCheck } from './file-checks.js';\nimport { markFileSchema } from './file-marker.js';\n\nexport interface BaseFileOptions {\n /**\n * Registry id for the schema. Set it to get a reusable\n * `components.schemas` entry that every field `$ref`s, instead of the\n * fragment being inlined at each use site. There is no `title` counterpart\n * — `overrideJSONSchema` replaces the emitted body and does not carry\n * `title` into it, so one would have no effect.\n */\n readonly id?: string;\n /** Allowed MIME types, matched case-insensitively against the client-supplied value. */\n readonly mimeTypes?: readonly string[];\n /** Allowed filename extensions, with or without a leading dot. */\n readonly extensions?: readonly string[];\n /** OpenAPI `description` for the emitted binary property. */\n readonly description?: string;\n /** Overrides the `contentMediaType` derived from a single-entry `mimeTypes`. */\n readonly contentMediaType?: string;\n}\n\nexport interface BuildFileSchemaParams<TFile> {\n readonly predicate: (value: unknown) => boolean;\n readonly accessors: FileAccessors<TFile>;\n readonly options: BaseFileOptions | undefined;\n /** Byte-size ceiling. Only platforms that report a size pass this. */\n readonly maxSize?: number;\n}\n\nconst resolveFragment = (options: BaseFileOptions | undefined): SchemaObject => {\n const contentMediaType = options?.contentMediaType ?? singleMimeType(options?.mimeTypes);\n return binary({\n ...(options?.description !== undefined ? { description: options.description } : {}),\n ...(contentMediaType !== undefined ? { contentMediaType } : {}),\n });\n};\n\nconst singleMimeType = (mimeTypes: readonly string[] | undefined): string | undefined => {\n if (mimeTypes === undefined || mimeTypes.length !== 1) {\n return undefined;\n }\n return mimeTypes[0];\n};\n\nconst collectChecks = <TFile>(params: BuildFileSchemaParams<TFile>): Array<FileCheck<TFile>> => {\n const { accessors, options, maxSize } = params;\n const checks: Array<FileCheck<TFile>> = [];\n if (options?.mimeTypes !== undefined) {\n checks.push(mimeTypeCheck(accessors, { mimeTypes: options.mimeTypes }));\n }\n if (options?.extensions !== undefined) {\n checks.push(extensionCheck(accessors, { extensions: options.extensions }));\n }\n if (maxSize !== undefined && accessors.size !== undefined) {\n checks.push(sizeCheck(accessors.size, { maxSize }));\n }\n return checks;\n};\n\nconst withId = <TFile>(\n schema: z.ZodType<TFile, TFile>,\n options: BaseFileOptions | undefined,\n fragment: SchemaObject,\n): z.ZodType<TFile, TFile> => {\n if (options?.id === undefined) {\n return schema;\n }\n return overrideJSONSchema(schema.meta({ id: options.id }), fragment);\n};\n\n/**\n * Assemble a platform file schema: duck-typing predicate, the option checks,\n * then `.meta({ id })` — re-registering the binary fragment after every step.\n *\n * Each registration is load-bearing. `overrideJSONSchema` keys its fragment on\n * the schema *instance*, and both `.check()` and `.meta()` clone. Emission\n * visits every instance in the chain, so a step left unregistered emits `{}`\n * — as a bare `{}` property in strict mode, or as an empty `components.schemas`\n * entry when the schema is named.\n */\nexport const buildFileSchema = <TFile>(\n params: BuildFileSchemaParams<TFile>,\n): z.ZodType<TFile, TFile> => {\n const fragment = resolveFragment(params.options);\n const base = overrideJSONSchema(z.custom<TFile>(params.predicate), fragment);\n const checks = collectChecks(params);\n const checked = checks.length === 0 ? base : overrideJSONSchema(base.check(...checks), fragment);\n return markFileSchema(withId(checked, params.options, fragment));\n};\n","import type { z } from 'zod';\n\n/**\n * Where the multipart parser puts uploaded files. Multer leaves them on the\n * request (`req.file` / `req.files`) with only text fields in `req.body`;\n * `@fastify/multipart` with `attachFieldsToBody: true` puts everything in\n * `req.body`.\n */\nexport const MultipartFilesIn = {\n Request: 'request',\n Body: 'body',\n} as const;\n\nexport type MultipartFilesIn = (typeof MultipartFilesIn)[keyof typeof MultipartFilesIn];\n\n/** Shape accepted by `@ZodMultipart` — one Zod schema per form field. */\nexport type MultipartShape = Readonly<Record<string, z.ZodType>>;\n\nexport interface MultipartMetadata {\n /**\n * Flat shape the param decorators validate against. `undefined` when the\n * body is a composite (`z.intersection` / `z.union`) with no single flat\n * shape to split — the document still emits, but `@ZodUploadedFile` and\n * friends have nothing to resolve and say so.\n */\n readonly shape: MultipartShape | undefined;\n readonly fileKeys: readonly string[];\n readonly textKeys: readonly string[];\n readonly filesIn: MultipartFilesIn;\n}\n\n/**\n * Metadata key for the shape declared by `@ZodMultipart`. `Symbol.for` so\n * consumers in other realms read the same registry (CLAUDE.md).\n */\nexport const ZOD_MULTIPART_METADATA_KEY = Symbol.for('zod-nest.multipart');\n","import { ApiBody, ApiConsumes } from '@nestjs/swagger';\nimport { z } from 'zod';\n\nimport type { ZodNestRegistry } from '../schema/registry.js';\nimport type { MultipartFilesIn, MultipartMetadata, MultipartShape } from './metadata.js';\n\nimport { flattenObjectIntersection } from '../decorators/internal/flatten-intersection.js';\nimport { isZodObject } from '../decorators/internal/zod-param-expand.js';\nimport { resolveSchemaRef } from '../decorators/internal/zod-schema-ref.js';\nimport { isZodSchema } from '../dto/predicates.js';\nimport { defaultRegistry } from '../schema/registry.js';\nimport { isFileSchema } from './file-marker.js';\nimport { ZOD_MULTIPART_METADATA_KEY } from './metadata.js';\n\nexport const MULTIPART_CONTENT_TYPE = 'multipart/form-data';\n\n/**\n * Body declaration accepted by `@ZodMultipart`: a flat shape record, or any\n * Zod schema. A record is the common case; a schema covers named bodies\n * (`.meta({ id })` → `$ref`) and composites an object literal can't express.\n */\nexport type MultipartBody = MultipartShape | z.ZodType;\n\nexport interface ZodMultipartOptions {\n /**\n * Where the parser puts uploaded files. Defaults to the platform entry\n * point's convention — `'request'` from `zod-nest/express`, `'body'` from\n * `zod-nest/fastify`.\n */\n readonly filesIn?: MultipartFilesIn;\n /**\n * Forces this id, overriding any `.meta({ id })` on the schema. A named body\n * is emitted as a `$ref` to `components.schemas`, which keeps a stable name\n * for client generators — at the cost of Swagger UI's `try-it-out` form,\n * which doesn't follow `$ref` for `multipart/form-data`.\n */\n readonly id?: string;\n /**\n * Merge an intersection / union of `z.object` arms into one flat inline\n * object. Needed for composite bodies whose `try-it-out` form must render.\n * All merged properties become optional. See `@ZodBody`'s `flatten`.\n */\n readonly flatten?: boolean;\n /** Registry to register named descendants into. Defaults to `defaultRegistry`. */\n readonly registry?: ZodNestRegistry;\n /** OpenAPI `description` for the request body. */\n readonly description?: string;\n /** Whether the body is required. Defaults to `true`. */\n readonly required?: boolean;\n}\n\nconst toSchema = (body: MultipartBody): z.ZodType =>\n isZodSchema(body) ? body : z.object({ ...body });\n\n/**\n * The flat shape the param decorators split on. A record is already flat and a\n * `z.object` exposes one; a composite has none, and the decorators report that\n * rather than guessing.\n */\nconst toShape = (body: MultipartBody): MultipartShape | undefined => {\n if (!isZodSchema(body)) {\n return body;\n }\n return isZodObject(body) ? body.shape : undefined;\n};\n\nconst partitionKeys = (\n shape: MultipartShape | undefined,\n): { fileKeys: string[]; textKeys: string[] } => {\n const fileKeys: string[] = [];\n const textKeys: string[] = [];\n for (const [key, schema] of Object.entries(shape ?? {})) {\n if (isFileSchema(schema)) {\n fileKeys.push(key);\n continue;\n }\n textKeys.push(key);\n }\n return { fileKeys, textKeys };\n};\n\n/**\n * Resolves the operation's body. Anonymous bodies emit inline because Swagger\n * UI's `multipart/form-data` form generator doesn't follow `$ref` — a\n * referenced body renders one stub field instead of file pickers. Naming the\n * body (`id` or `.meta({ id })`) opts into the `$ref` and that trade-off.\n */\nconst resolveBody = (\n schema: z.ZodType,\n options: ZodMultipartOptions | undefined,\n registry: ZodNestRegistry,\n): Record<string, unknown> | { readonly $ref: string } => {\n if (options?.flatten === true) {\n return flattenObjectIntersection(schema, registry, '@ZodMultipart');\n }\n const resolved = resolveSchemaRef(schema, {\n ...(options?.id !== undefined ? { id: options.id } : {}),\n registry,\n });\n return resolved.kind === 'ref' ? resolved.ref : resolved.schema;\n};\n\nexport const createZodMultipart = (defaultFilesIn: MultipartFilesIn) => {\n /**\n * Declares an endpoint's whole `multipart/form-data` body — file fields and\n * text fields together — as the single source of truth for both the OpenAPI\n * document and the multipart param decorators.\n */\n return (body: MultipartBody, options?: ZodMultipartOptions): MethodDecorator => {\n const registry = options?.registry ?? defaultRegistry;\n const shape = toShape(body);\n const metadata: MultipartMetadata = {\n shape,\n ...partitionKeys(shape),\n filesIn: options?.filesIn ?? defaultFilesIn,\n };\n const schema = resolveBody(toSchema(body), options, registry);\n\n return (target, propertyKey, descriptor) => {\n const handler = descriptor.value;\n if (typeof handler !== 'function') {\n throw new TypeError('[zod-nest] @ZodMultipart can only be applied to methods.');\n }\n Reflect.defineMetadata(ZOD_MULTIPART_METADATA_KEY, metadata, handler);\n\n // `TypedPropertyDescriptor<unknown>` matches what the swagger decorators\n // expect; `MethodDecorator`'s parameter is `TypedPropertyDescriptor<T>`\n // for the inferred return type, structurally compatible at runtime.\n const swaggerDescriptor = descriptor as TypedPropertyDescriptor<unknown>;\n ApiConsumes(MULTIPART_CONTENT_TYPE)(target, propertyKey, swaggerDescriptor);\n ApiBody({\n schema,\n ...(options?.description !== undefined ? { description: options.description } : {}),\n required: options?.required ?? true,\n })(target, propertyKey, swaggerDescriptor);\n };\n };\n};\n","import { createParamDecorator } from '@nestjs/common';\nimport { z } from 'zod';\n\nimport type { ExecutionContext } from '@nestjs/common';\nimport type { MultipartMetadata, MultipartShape } from './metadata.js';\n\nimport { ZodValidationException } from '../exceptions/validation.exception.js';\nimport { MultipartFilesIn, ZOD_MULTIPART_METADATA_KEY } from './metadata.js';\n\ntype ArgType = 'body' | 'custom';\n\nconst readMetadata = (ctx: ExecutionContext, decorator: string): MultipartMetadata => {\n const metadata: unknown = Reflect.getMetadata(ZOD_MULTIPART_METADATA_KEY, ctx.getHandler());\n if (!isMultipartMetadata(metadata)) {\n throw new Error(\n `[zod-nest] ${decorator} requires @ZodMultipart on the same handler — it reads the declared shape from there.`,\n );\n }\n return metadata;\n};\n\nconst isMultipartMetadata = (value: unknown): value is MultipartMetadata =>\n value !== null && typeof value === 'object' && 'shape' in value && 'filesIn' in value;\n\n/**\n * The declared shape, or a pointed error when the body is a composite. An\n * intersection / union has no single flat shape to split, so there is nothing\n * for these decorators to resolve a field against.\n */\nconst requireShape = (metadata: MultipartMetadata, decorator: string): MultipartShape => {\n if (metadata.shape !== undefined) {\n return metadata.shape;\n }\n throw new Error(\n `[zod-nest] ${decorator} needs a flat body shape, but @ZodMultipart was given a composite schema (an intersection or union). Validate it with @Body(new ZodValidationPipe(schema)) instead.`,\n );\n};\n\nconst schemaFor = (metadata: MultipartMetadata, name: string, decorator: string): z.ZodType => {\n const shape = requireShape(metadata, decorator);\n const schema = shape[name];\n if (schema === undefined) {\n throw new Error(\n `[zod-nest] ${decorator}('${name}') has no matching property in the @ZodMultipart shape. Declared: ${Object.keys(shape).join(', ')}.`,\n );\n }\n return schema;\n};\n\nconst pick = (shape: MultipartShape, keys: readonly string[]): z.ZodType => {\n const wanted = new Set(keys);\n const picked: Record<string, z.ZodType> = {};\n for (const [key, schema] of Object.entries(shape)) {\n if (wanted.has(key)) {\n picked[key] = schema;\n }\n }\n return z.object(picked);\n};\n\nconst validate = async (schema: z.ZodType, value: unknown, argType: ArgType): Promise<unknown> => {\n const result = await schema.safeParseAsync(value);\n if (result.success) {\n return result.data;\n }\n throw new ZodValidationException(result.error, {\n type: argType,\n metatype: undefined,\n data: undefined,\n });\n};\n\nconst assertFilesOnRequest = (metadata: MultipartMetadata, decorator: string): void => {\n if (metadata.filesIn === MultipartFilesIn.Request) {\n return;\n }\n throw new Error(\n `[zod-nest] ${decorator} is unavailable under filesIn: 'body' — the parser puts files in the request body, so read them with @ZodMultipartBody().`,\n );\n};\n\nexport const resolveUploadedFile = async (\n name: string,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodUploadedFile');\n assertFilesOnRequest(metadata, '@ZodUploadedFile');\n const request: { file?: unknown } = ctx.switchToHttp().getRequest();\n return validate(schemaFor(metadata, name, '@ZodUploadedFile'), request.file, 'custom');\n};\n\nexport const resolveUploadedFiles = async (\n name: string | undefined,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodUploadedFiles');\n assertFilesOnRequest(metadata, '@ZodUploadedFiles');\n const request: { files?: unknown } = ctx.switchToHttp().getRequest();\n const schema =\n name === undefined\n ? pick(requireShape(metadata, '@ZodUploadedFiles'), metadata.fileKeys)\n : schemaFor(metadata, name, '@ZodUploadedFiles');\n return validate(schema, request.files, 'custom');\n};\n\nexport const resolveMultipartBody = async (\n _data: unknown,\n ctx: ExecutionContext,\n): Promise<unknown> => {\n const metadata = readMetadata(ctx, '@ZodMultipartBody');\n const shape = requireShape(metadata, '@ZodMultipartBody');\n const request: { body?: unknown } = ctx.switchToHttp().getRequest();\n const keys = metadata.filesIn === MultipartFilesIn.Body ? Object.keys(shape) : metadata.textKeys;\n return validate(pick(shape, keys), request.body, 'body');\n};\n\n/**\n * Validates `req.file` against the named property of the `@ZodMultipart`\n * shape. The name selects a schema; it never searches the request. Match it\n * to your `FileInterceptor('<name>')` field name, as with plain Nest.\n */\nexport const ZodUploadedFile = createParamDecorator(resolveUploadedFile);\n\n/**\n * Validates `req.files` against the named property of the `@ZodMultipart`\n * shape, or against an object of every declared file property when called\n * with no name — the record shape `FileFieldsInterceptor` produces.\n */\nexport const ZodUploadedFiles = createParamDecorator(resolveUploadedFiles);\n\n/**\n * Validates `req.body` against the `@ZodMultipart` shape — the text fields\n * only under `filesIn: 'request'` (multer keeps files off the body), the\n * whole shape under `filesIn: 'body'`.\n */\nexport const ZodMultipartBody = createParamDecorator(resolveMultipartBody);\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunk4RXGLSPP_js = require('./chunk-4RXGLSPP.js');
3
+ var chunkEV5I5HGT_js = require('./chunk-EV5I5HGT.js');
4
4
 
5
5
  // src/helpers/fragments.ts
6
6
  var dateTimeFragment = {
@@ -67,15 +67,15 @@ var opaqueFragment = {
67
67
  type: "object",
68
68
  additionalProperties: true
69
69
  };
70
- var enrich = /* @__PURE__ */ chunk4RXGLSPP_js.__name((base, extras) => ({
70
+ var enrich = /* @__PURE__ */ chunkEV5I5HGT_js.__name((base, extras) => ({
71
71
  ...base,
72
72
  ...extras
73
73
  }), "enrich");
74
- var binary = /* @__PURE__ */ chunk4RXGLSPP_js.__name((opts) => ({
74
+ var binary = /* @__PURE__ */ chunkEV5I5HGT_js.__name((opts) => ({
75
75
  ...binaryFragment,
76
76
  ...opts
77
77
  }), "binary");
78
- var opaque = /* @__PURE__ */ chunk4RXGLSPP_js.__name((opts) => ({
78
+ var opaque = /* @__PURE__ */ chunkEV5I5HGT_js.__name((opts) => ({
79
79
  ...opaqueFragment,
80
80
  ...opts
81
81
  }), "opaque");
@@ -99,5 +99,5 @@ exports.opaqueFragment = opaqueFragment;
99
99
  exports.timeFragment = timeFragment;
100
100
  exports.uriFragment = uriFragment;
101
101
  exports.uuidFragment = uuidFragment;
102
- //# sourceMappingURL=chunk-LXRBMFWD.js.map
103
- //# sourceMappingURL=chunk-LXRBMFWD.js.map
102
+ //# sourceMappingURL=chunk-4LOFWANL.js.map
103
+ //# sourceMappingURL=chunk-4LOFWANL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers/fragments.ts"],"names":["dateTimeFragment","type","format","dateFragment","timeFragment","uuidFragment","emailFragment","uriFragment","hostnameFragment","ipv4Fragment","ipv6Fragment","binaryFragment","byteFragment","int32Fragment","int64Fragment","floatFragment","doubleFragment","opaqueFragment","additionalProperties","enrich","__name","base","extras","binary","opts","opaque"],"mappings":";;;;;AAsBO,IAAMA,gBAAAA,GAAmB;EAC9BC,IAAAA,EAAM,QAAA;EACNC,MAAAA,EAAQ;AACV;AACO,IAAMC,YAAAA,GAAe;EAAEF,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAME,YAAAA,GAAe;EAAEH,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMG,YAAAA,GAAe;EAAEJ,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMI,aAAAA,GAAgB;EAAEL,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAQ;AACxD,IAAMK,WAAAA,GAAc;EAAEN,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAM;AACpD,IAAMM,gBAAAA,GAAmB;EAC9BP,IAAAA,EAAM,QAAA;EACNC,MAAAA,EAAQ;AACV;AACO,IAAMO,YAAAA,GAAe;EAAER,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMQ,YAAAA,GAAe;EAAET,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AAGtD,IAAMS,cAAAA,GAAiB;EAAEV,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAS;AAC1D,IAAMU,YAAAA,GAAe;EAAEX,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AAGtD,IAAMW,aAAAA,GAAgB;EAAEZ,IAAAA,EAAM,SAAA;EAAWC,MAAAA,EAAQ;AAAQ;AACzD,IAAMY,aAAAA,GAAgB;EAAEb,IAAAA,EAAM,SAAA;EAAWC,MAAAA,EAAQ;AAAQ;AACzD,IAAMa,aAAAA,GAAgB;EAAEd,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAQ;AACxD,IAAMc,cAAAA,GAAiB;EAAEf,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAS;AAG1D,IAAMe,cAAAA,GAAiB;EAC5BhB,IAAAA,EAAM,QAAA;EACNiB,oBAAAA,EAAsB;AACxB;AAsEO,IAAMC,MAAAA,mBAASC,uBAAA,CAAA,CAAyBC,IAAAA,EAASC,MAAAA,MAAyC;EAC/F,GAAGD,IAAAA;EACH,GAAGC;AACL,CAAA,CAAA,EAHsB,QAAA;AAmBf,IAAMC,MAAAA,4CAAUC,IAAAA,MAAgD;EACrE,GAAGb,cAAAA;EACH,GAAGa;AACL,CAAA,CAAA,EAHsB,QAAA;AAcf,IAAMC,MAAAA,4CAAUD,IAAAA,MAAgD;EACrE,GAAGP,cAAAA;EACH,GAAGO;AACL,CAAA,CAAA,EAHsB,QAAA","file":"chunk-LXRBMFWD.js","sourcesContent":["import type { SchemaObject } from '../schema/openapi.types.js';\n\n/**\n * Common JSON Schema fragment catalog — reusable building blocks for assembling\n * fragments by hand: alongside `z.custom<T>()`, in `overrideJSONSchema` calls,\n * in custom override callbacks, in tests that build expected fragments.\n *\n * The catalog overlaps with what Zod constructs already emit (`z.uuid()` →\n * `uuidFragment` shape, `z.email()` → `emailFragment` shape, etc.) — the\n * helpers don't *replace* those Zod constructs; they're a parallel catalog\n * for programmatic fragment assembly.\n *\n * Each fragment is `as const satisfies SchemaObject` so its literal type\n * powers the dispatch in {@link enrich} — passing wrong-family options\n * fails at compile time.\n */\n\n// ---------------------------------------------------------------------------\n// Layer 1 — Fragment catalog\n// ---------------------------------------------------------------------------\n\n// String formats (RFC-defined)\nexport const dateTimeFragment = {\n type: 'string',\n format: 'date-time',\n} as const satisfies SchemaObject;\nexport const dateFragment = { type: 'string', format: 'date' } as const satisfies SchemaObject;\nexport const timeFragment = { type: 'string', format: 'time' } as const satisfies SchemaObject;\nexport const uuidFragment = { type: 'string', format: 'uuid' } as const satisfies SchemaObject;\nexport const emailFragment = { type: 'string', format: 'email' } as const satisfies SchemaObject;\nexport const uriFragment = { type: 'string', format: 'uri' } as const satisfies SchemaObject;\nexport const hostnameFragment = {\n type: 'string',\n format: 'hostname',\n} as const satisfies SchemaObject;\nexport const ipv4Fragment = { type: 'string', format: 'ipv4' } as const satisfies SchemaObject;\nexport const ipv6Fragment = { type: 'string', format: 'ipv6' } as const satisfies SchemaObject;\n\n// Binary / encoded payloads\nexport const binaryFragment = { type: 'string', format: 'binary' } as const satisfies SchemaObject;\nexport const byteFragment = { type: 'string', format: 'byte' } as const satisfies SchemaObject;\n\n// Numeric formats (OpenAPI 3.1)\nexport const int32Fragment = { type: 'integer', format: 'int32' } as const satisfies SchemaObject;\nexport const int64Fragment = { type: 'integer', format: 'int64' } as const satisfies SchemaObject;\nexport const floatFragment = { type: 'number', format: 'float' } as const satisfies SchemaObject;\nexport const doubleFragment = { type: 'number', format: 'double' } as const satisfies SchemaObject;\n\n// Object passthrough\nexport const opaqueFragment = {\n type: 'object',\n additionalProperties: true,\n} as const satisfies SchemaObject;\n\n// ---------------------------------------------------------------------------\n// Layer 2 — Per-family option types\n// ---------------------------------------------------------------------------\n\nexport interface StringFormatOptions {\n description?: string;\n examples?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n}\n\nexport interface BinaryFragmentOptions {\n description?: string;\n contentMediaType?: string;\n contentEncoding?: string;\n}\n\nexport interface NumberFormatOptions {\n description?: string;\n examples?: number[];\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n}\n\nexport interface OpaqueFragmentOptions {\n description?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Layer 3 — Type-strict generic enrich\n// ---------------------------------------------------------------------------\n\n// `binary` discriminates before the generic string-format branch because its\n// option set diverges (contentMediaType / contentEncoding instead of length\n// constraints). Order matters here.\ntype OptionsFor<T> = T extends { readonly format: 'binary' }\n ? BinaryFragmentOptions\n : T extends {\n readonly format:\n | 'date-time'\n | 'date'\n | 'time'\n | 'uuid'\n | 'email'\n | 'uri'\n | 'hostname'\n | 'ipv4'\n | 'ipv6'\n | 'byte';\n }\n ? StringFormatOptions\n : T extends { readonly format: 'int32' | 'int64' | 'float' | 'double' }\n ? NumberFormatOptions\n : T extends { readonly type: 'object'; readonly additionalProperties: true }\n ? OpaqueFragmentOptions\n : never;\n\n/**\n * Merge a catalog fragment with extras whose shape is dictated by the base\n * fragment's family. Passing wrong-family extras (e.g. a `contentMediaType`\n * onto `uuidFragment`) is a compile-time error.\n *\n * Returns a fresh `SchemaObject` — the original fragment is never mutated.\n */\nexport const enrich = <T extends SchemaObject>(base: T, extras: OptionsFor<T>): SchemaObject => ({\n ...base,\n ...extras,\n});\n\n// ---------------------------------------------------------------------------\n// Layer 3b — Sugar functions\n// ---------------------------------------------------------------------------\n\n/**\n * Binary-content fragment with typed enrichment. Sugar for\n * `enrich(binaryFragment, opts)` — exists because the `binary` option set\n * (`contentMediaType` / `contentEncoding`) is nuanced enough to deserve a\n * dedicated entry point and discoverable via auto-complete.\n *\n * @example\n * overrideJSONSchema(z.instanceof(File), binary());\n * overrideJSONSchema(z.instanceof(File), binary({ contentMediaType: 'application/pdf' }));\n */\nexport const binary = (opts?: BinaryFragmentOptions): SchemaObject => ({\n ...binaryFragment,\n ...opts,\n});\n\n/**\n * Opaque-object fragment with typed enrichment. Sugar for\n * `enrich(opaqueFragment, opts)` — exists for parity with {@link binary}\n * and because opaque passthrough payloads commonly carry a description\n * explaining why the API doesn't introspect them.\n *\n * @example\n * overrideJSONSchema(z.unknown(), opaque({ description: 'JWT passthrough' }));\n */\nexport const opaque = (opts?: OpaqueFragmentOptions): SchemaObject => ({\n ...opaqueFragment,\n ...opts,\n});\n"]}
1
+ {"version":3,"sources":["../src/helpers/fragments.ts"],"names":["dateTimeFragment","type","format","dateFragment","timeFragment","uuidFragment","emailFragment","uriFragment","hostnameFragment","ipv4Fragment","ipv6Fragment","binaryFragment","byteFragment","int32Fragment","int64Fragment","floatFragment","doubleFragment","opaqueFragment","additionalProperties","enrich","__name","base","extras","binary","opts","opaque"],"mappings":";;;;;AAsBO,IAAMA,gBAAAA,GAAmB;EAC9BC,IAAAA,EAAM,QAAA;EACNC,MAAAA,EAAQ;AACV;AACO,IAAMC,YAAAA,GAAe;EAAEF,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAME,YAAAA,GAAe;EAAEH,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMG,YAAAA,GAAe;EAAEJ,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMI,aAAAA,GAAgB;EAAEL,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAQ;AACxD,IAAMK,WAAAA,GAAc;EAAEN,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAM;AACpD,IAAMM,gBAAAA,GAAmB;EAC9BP,IAAAA,EAAM,QAAA;EACNC,MAAAA,EAAQ;AACV;AACO,IAAMO,YAAAA,GAAe;EAAER,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AACtD,IAAMQ,YAAAA,GAAe;EAAET,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AAGtD,IAAMS,cAAAA,GAAiB;EAAEV,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAS;AAC1D,IAAMU,YAAAA,GAAe;EAAEX,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAO;AAGtD,IAAMW,aAAAA,GAAgB;EAAEZ,IAAAA,EAAM,SAAA;EAAWC,MAAAA,EAAQ;AAAQ;AACzD,IAAMY,aAAAA,GAAgB;EAAEb,IAAAA,EAAM,SAAA;EAAWC,MAAAA,EAAQ;AAAQ;AACzD,IAAMa,aAAAA,GAAgB;EAAEd,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAQ;AACxD,IAAMc,cAAAA,GAAiB;EAAEf,IAAAA,EAAM,QAAA;EAAUC,MAAAA,EAAQ;AAAS;AAG1D,IAAMe,cAAAA,GAAiB;EAC5BhB,IAAAA,EAAM,QAAA;EACNiB,oBAAAA,EAAsB;AACxB;AAsEO,IAAMC,MAAAA,mBAASC,uBAAA,CAAA,CAAyBC,IAAAA,EAASC,MAAAA,MAAyC;EAC/F,GAAGD,IAAAA;EACH,GAAGC;AACL,CAAA,CAAA,EAHsB,QAAA;AAmBf,IAAMC,MAAAA,4CAAUC,IAAAA,MAAgD;EACrE,GAAGb,cAAAA;EACH,GAAGa;AACL,CAAA,CAAA,EAHsB,QAAA;AAcf,IAAMC,MAAAA,4CAAUD,IAAAA,MAAgD;EACrE,GAAGP,cAAAA;EACH,GAAGO;AACL,CAAA,CAAA,EAHsB,QAAA","file":"chunk-4LOFWANL.js","sourcesContent":["import type { SchemaObject } from '../schema/openapi.types.js';\n\n/**\n * Common JSON Schema fragment catalog — reusable building blocks for assembling\n * fragments by hand: alongside `z.custom<T>()`, in `overrideJSONSchema` calls,\n * in custom override callbacks, in tests that build expected fragments.\n *\n * The catalog overlaps with what Zod constructs already emit (`z.uuid()` →\n * `uuidFragment` shape, `z.email()` → `emailFragment` shape, etc.) — the\n * helpers don't *replace* those Zod constructs; they're a parallel catalog\n * for programmatic fragment assembly.\n *\n * Each fragment is `as const satisfies SchemaObject` so its literal type\n * powers the dispatch in {@link enrich} — passing wrong-family options\n * fails at compile time.\n */\n\n// ---------------------------------------------------------------------------\n// Layer 1 — Fragment catalog\n// ---------------------------------------------------------------------------\n\n// String formats (RFC-defined)\nexport const dateTimeFragment = {\n type: 'string',\n format: 'date-time',\n} as const satisfies SchemaObject;\nexport const dateFragment = { type: 'string', format: 'date' } as const satisfies SchemaObject;\nexport const timeFragment = { type: 'string', format: 'time' } as const satisfies SchemaObject;\nexport const uuidFragment = { type: 'string', format: 'uuid' } as const satisfies SchemaObject;\nexport const emailFragment = { type: 'string', format: 'email' } as const satisfies SchemaObject;\nexport const uriFragment = { type: 'string', format: 'uri' } as const satisfies SchemaObject;\nexport const hostnameFragment = {\n type: 'string',\n format: 'hostname',\n} as const satisfies SchemaObject;\nexport const ipv4Fragment = { type: 'string', format: 'ipv4' } as const satisfies SchemaObject;\nexport const ipv6Fragment = { type: 'string', format: 'ipv6' } as const satisfies SchemaObject;\n\n// Binary / encoded payloads\nexport const binaryFragment = { type: 'string', format: 'binary' } as const satisfies SchemaObject;\nexport const byteFragment = { type: 'string', format: 'byte' } as const satisfies SchemaObject;\n\n// Numeric formats (OpenAPI 3.1)\nexport const int32Fragment = { type: 'integer', format: 'int32' } as const satisfies SchemaObject;\nexport const int64Fragment = { type: 'integer', format: 'int64' } as const satisfies SchemaObject;\nexport const floatFragment = { type: 'number', format: 'float' } as const satisfies SchemaObject;\nexport const doubleFragment = { type: 'number', format: 'double' } as const satisfies SchemaObject;\n\n// Object passthrough\nexport const opaqueFragment = {\n type: 'object',\n additionalProperties: true,\n} as const satisfies SchemaObject;\n\n// ---------------------------------------------------------------------------\n// Layer 2 — Per-family option types\n// ---------------------------------------------------------------------------\n\nexport interface StringFormatOptions {\n description?: string;\n examples?: string[];\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n}\n\nexport interface BinaryFragmentOptions {\n description?: string;\n contentMediaType?: string;\n contentEncoding?: string;\n}\n\nexport interface NumberFormatOptions {\n description?: string;\n examples?: number[];\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n}\n\nexport interface OpaqueFragmentOptions {\n description?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Layer 3 — Type-strict generic enrich\n// ---------------------------------------------------------------------------\n\n// `binary` discriminates before the generic string-format branch because its\n// option set diverges (contentMediaType / contentEncoding instead of length\n// constraints). Order matters here.\ntype OptionsFor<T> = T extends { readonly format: 'binary' }\n ? BinaryFragmentOptions\n : T extends {\n readonly format:\n | 'date-time'\n | 'date'\n | 'time'\n | 'uuid'\n | 'email'\n | 'uri'\n | 'hostname'\n | 'ipv4'\n | 'ipv6'\n | 'byte';\n }\n ? StringFormatOptions\n : T extends { readonly format: 'int32' | 'int64' | 'float' | 'double' }\n ? NumberFormatOptions\n : T extends { readonly type: 'object'; readonly additionalProperties: true }\n ? OpaqueFragmentOptions\n : never;\n\n/**\n * Merge a catalog fragment with extras whose shape is dictated by the base\n * fragment's family. Passing wrong-family extras (e.g. a `contentMediaType`\n * onto `uuidFragment`) is a compile-time error.\n *\n * Returns a fresh `SchemaObject` — the original fragment is never mutated.\n */\nexport const enrich = <T extends SchemaObject>(base: T, extras: OptionsFor<T>): SchemaObject => ({\n ...base,\n ...extras,\n});\n\n// ---------------------------------------------------------------------------\n// Layer 3b — Sugar functions\n// ---------------------------------------------------------------------------\n\n/**\n * Binary-content fragment with typed enrichment. Sugar for\n * `enrich(binaryFragment, opts)` — exists because the `binary` option set\n * (`contentMediaType` / `contentEncoding`) is nuanced enough to deserve a\n * dedicated entry point and discoverable via auto-complete.\n *\n * @example\n * overrideJSONSchema(z.instanceof(File), binary());\n * overrideJSONSchema(z.instanceof(File), binary({ contentMediaType: 'application/pdf' }));\n */\nexport const binary = (opts?: BinaryFragmentOptions): SchemaObject => ({\n ...binaryFragment,\n ...opts,\n});\n\n/**\n * Opaque-object fragment with typed enrichment. Sugar for\n * `enrich(opaqueFragment, opts)` — exists for parity with {@link binary}\n * and because opaque passthrough payloads commonly carry a description\n * explaining why the API doesn't introspect them.\n *\n * @example\n * overrideJSONSchema(z.unknown(), opaque({ description: 'JWT passthrough' }));\n */\nexport const opaque = (opts?: OpaqueFragmentOptions): SchemaObject => ({\n ...opaqueFragment,\n ...opts,\n});\n"]}
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkFKXVNCDD_js = require('./chunk-FKXVNCDD.js');
4
- var chunkLXRBMFWD_js = require('./chunk-LXRBMFWD.js');
5
- var chunk4RXGLSPP_js = require('./chunk-4RXGLSPP.js');
3
+ var chunkDUQLL62I_js = require('./chunk-DUQLL62I.js');
4
+ var chunk4LOFWANL_js = require('./chunk-4LOFWANL.js');
5
+ var chunkEV5I5HGT_js = require('./chunk-EV5I5HGT.js');
6
6
  var zod = require('zod');
7
7
  var swagger = require('@nestjs/swagger');
8
8
  var common = require('@nestjs/common');
9
9
 
10
10
  // src/multipart/file-checks.ts
11
- var normalizeExtension = /* @__PURE__ */ chunk4RXGLSPP_js.__name((extension) => extension.startsWith(".") ? extension.toLowerCase() : `.${extension.toLowerCase()}`, "normalizeExtension");
12
- var mimeTypeCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((accessors, options) => {
11
+ var normalizeExtension = /* @__PURE__ */ chunkEV5I5HGT_js.__name((extension) => extension.startsWith(".") ? extension.toLowerCase() : `.${extension.toLowerCase()}`, "normalizeExtension");
12
+ var mimeTypeCheck = /* @__PURE__ */ chunkEV5I5HGT_js.__name((accessors, options) => {
13
13
  const allowed = new Set(options.mimeTypes.map((mimeType) => mimeType.toLowerCase()));
14
14
  return (payload) => {
15
15
  const mimeType = accessors.mimeType(payload.value).toLowerCase();
@@ -23,7 +23,7 @@ var mimeTypeCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((accessors, options)
23
23
  });
24
24
  };
25
25
  }, "mimeTypeCheck");
26
- var extensionCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((accessors, options) => {
26
+ var extensionCheck = /* @__PURE__ */ chunkEV5I5HGT_js.__name((accessors, options) => {
27
27
  const allowed = new Set(options.extensions.map(normalizeExtension));
28
28
  return (payload) => {
29
29
  const fileName = accessors.fileName(payload.value).toLowerCase();
@@ -40,7 +40,7 @@ var extensionCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((accessors, options
40
40
  });
41
41
  };
42
42
  }, "extensionCheck");
43
- var sizeCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((readSize, options) => {
43
+ var sizeCheck = /* @__PURE__ */ chunkEV5I5HGT_js.__name((readSize, options) => {
44
44
  return (payload) => {
45
45
  const size = readSize(payload.value);
46
46
  if (size <= options.maxSize) {
@@ -55,9 +55,9 @@ var sizeCheck = /* @__PURE__ */ chunk4RXGLSPP_js.__name((readSize, options) => {
55
55
  }, "sizeCheck");
56
56
 
57
57
  // src/multipart/file-marker.ts
58
- var fileSchemas = chunk4RXGLSPP_js.singleton("file-schemas", () => /* @__PURE__ */ new WeakSet());
59
- var isZodType = /* @__PURE__ */ chunk4RXGLSPP_js.__name((value) => value !== null && typeof value === "object" && "_zod" in value, "isZodType");
60
- var innerOf = /* @__PURE__ */ chunk4RXGLSPP_js.__name((def) => {
58
+ var fileSchemas = chunkEV5I5HGT_js.singleton("file-schemas", () => /* @__PURE__ */ new WeakSet());
59
+ var isZodType = /* @__PURE__ */ chunkEV5I5HGT_js.__name((value) => value !== null && typeof value === "object" && "_zod" in value, "isZodType");
60
+ var innerOf = /* @__PURE__ */ chunkEV5I5HGT_js.__name((def) => {
61
61
  if ("innerType" in def) {
62
62
  return def.innerType;
63
63
  }
@@ -66,15 +66,15 @@ var innerOf = /* @__PURE__ */ chunk4RXGLSPP_js.__name((def) => {
66
66
  }
67
67
  return void 0;
68
68
  }, "innerOf");
69
- var unwrapOnce = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema) => {
69
+ var unwrapOnce = /* @__PURE__ */ chunkEV5I5HGT_js.__name((schema) => {
70
70
  const inner = innerOf(schema._zod.def);
71
71
  return isZodType(inner) ? inner : void 0;
72
72
  }, "unwrapOnce");
73
- var markFileSchema = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema) => {
73
+ var markFileSchema = /* @__PURE__ */ chunkEV5I5HGT_js.__name((schema) => {
74
74
  fileSchemas.add(schema);
75
75
  return schema;
76
76
  }, "markFileSchema");
77
- var isFileSchema = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema) => {
77
+ var isFileSchema = /* @__PURE__ */ chunkEV5I5HGT_js.__name((schema) => {
78
78
  if (fileSchemas.has(schema)) {
79
79
  return true;
80
80
  }
@@ -86,9 +86,9 @@ var isFileSchema = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema) => {
86
86
  }, "isFileSchema");
87
87
 
88
88
  // src/multipart/build-file-schema.ts
89
- var resolveFragment = /* @__PURE__ */ chunk4RXGLSPP_js.__name((options) => {
89
+ var resolveFragment = /* @__PURE__ */ chunkEV5I5HGT_js.__name((options) => {
90
90
  const contentMediaType = options?.contentMediaType ?? singleMimeType(options?.mimeTypes);
91
- return chunkLXRBMFWD_js.binary({
91
+ return chunk4LOFWANL_js.binary({
92
92
  ...options?.description !== void 0 ? {
93
93
  description: options.description
94
94
  } : {},
@@ -97,13 +97,13 @@ var resolveFragment = /* @__PURE__ */ chunk4RXGLSPP_js.__name((options) => {
97
97
  } : {}
98
98
  });
99
99
  }, "resolveFragment");
100
- var singleMimeType = /* @__PURE__ */ chunk4RXGLSPP_js.__name((mimeTypes) => {
100
+ var singleMimeType = /* @__PURE__ */ chunkEV5I5HGT_js.__name((mimeTypes) => {
101
101
  if (mimeTypes === void 0 || mimeTypes.length !== 1) {
102
102
  return void 0;
103
103
  }
104
104
  return mimeTypes[0];
105
105
  }, "singleMimeType");
106
- var collectChecks = /* @__PURE__ */ chunk4RXGLSPP_js.__name((params) => {
106
+ var collectChecks = /* @__PURE__ */ chunkEV5I5HGT_js.__name((params) => {
107
107
  const { accessors, options, maxSize } = params;
108
108
  const checks = [];
109
109
  if (options?.mimeTypes !== void 0) {
@@ -123,19 +123,19 @@ var collectChecks = /* @__PURE__ */ chunk4RXGLSPP_js.__name((params) => {
123
123
  }
124
124
  return checks;
125
125
  }, "collectChecks");
126
- var withId = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema, options, fragment) => {
126
+ var withId = /* @__PURE__ */ chunkEV5I5HGT_js.__name((schema, options, fragment) => {
127
127
  if (options?.id === void 0) {
128
128
  return schema;
129
129
  }
130
- return chunk4RXGLSPP_js.overrideJSONSchema(schema.meta({
130
+ return chunkEV5I5HGT_js.overrideJSONSchema(schema.meta({
131
131
  id: options.id
132
132
  }), fragment);
133
133
  }, "withId");
134
- var buildFileSchema = /* @__PURE__ */ chunk4RXGLSPP_js.__name((params) => {
134
+ var buildFileSchema = /* @__PURE__ */ chunkEV5I5HGT_js.__name((params) => {
135
135
  const fragment = resolveFragment(params.options);
136
- const base = chunk4RXGLSPP_js.overrideJSONSchema(zod.z.custom(params.predicate), fragment);
136
+ const base = chunkEV5I5HGT_js.overrideJSONSchema(zod.z.custom(params.predicate), fragment);
137
137
  const checks = collectChecks(params);
138
- const checked = checks.length === 0 ? base : chunk4RXGLSPP_js.overrideJSONSchema(base.check(...checks), fragment);
138
+ const checked = checks.length === 0 ? base : chunkEV5I5HGT_js.overrideJSONSchema(base.check(...checks), fragment);
139
139
  return markFileSchema(withId(checked, params.options, fragment));
140
140
  }, "buildFileSchema");
141
141
 
@@ -146,16 +146,16 @@ var MultipartFilesIn = {
146
146
  };
147
147
  var ZOD_MULTIPART_METADATA_KEY = /* @__PURE__ */ Symbol.for("zod-nest.multipart");
148
148
  var MULTIPART_CONTENT_TYPE = "multipart/form-data";
149
- var toSchema = /* @__PURE__ */ chunk4RXGLSPP_js.__name((body) => chunkFKXVNCDD_js.isZodSchema(body) ? body : zod.z.object({
149
+ var toSchema = /* @__PURE__ */ chunkEV5I5HGT_js.__name((body) => chunkDUQLL62I_js.isZodSchema(body) ? body : zod.z.object({
150
150
  ...body
151
151
  }), "toSchema");
152
- var toShape = /* @__PURE__ */ chunk4RXGLSPP_js.__name((body) => {
153
- if (!chunkFKXVNCDD_js.isZodSchema(body)) {
152
+ var toShape = /* @__PURE__ */ chunkEV5I5HGT_js.__name((body) => {
153
+ if (!chunkDUQLL62I_js.isZodSchema(body)) {
154
154
  return body;
155
155
  }
156
- return chunkFKXVNCDD_js.isZodObject(body) ? body.shape : void 0;
156
+ return chunkDUQLL62I_js.isZodObject(body) ? body.shape : void 0;
157
157
  }, "toShape");
158
- var partitionKeys = /* @__PURE__ */ chunk4RXGLSPP_js.__name((shape) => {
158
+ var partitionKeys = /* @__PURE__ */ chunkEV5I5HGT_js.__name((shape) => {
159
159
  const fileKeys = [];
160
160
  const textKeys = [];
161
161
  for (const [key, schema] of Object.entries(shape ?? {})) {
@@ -170,11 +170,11 @@ var partitionKeys = /* @__PURE__ */ chunk4RXGLSPP_js.__name((shape) => {
170
170
  textKeys
171
171
  };
172
172
  }, "partitionKeys");
173
- var resolveBody = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema, options, registry) => {
173
+ var resolveBody = /* @__PURE__ */ chunkEV5I5HGT_js.__name((schema, options, registry) => {
174
174
  if (options?.flatten === true) {
175
- return chunkFKXVNCDD_js.flattenObjectIntersection(schema, registry, "@ZodMultipart");
175
+ return chunkDUQLL62I_js.flattenObjectIntersection(schema, registry, "@ZodMultipart");
176
176
  }
177
- const resolved = chunkFKXVNCDD_js.resolveSchemaRef(schema, {
177
+ const resolved = chunkDUQLL62I_js.resolveSchemaRef(schema, {
178
178
  ...options?.id !== void 0 ? {
179
179
  id: options.id
180
180
  } : {},
@@ -182,9 +182,9 @@ var resolveBody = /* @__PURE__ */ chunk4RXGLSPP_js.__name((schema, options, regi
182
182
  });
183
183
  return resolved.kind === "ref" ? resolved.ref : resolved.schema;
184
184
  }, "resolveBody");
185
- var createZodMultipart = /* @__PURE__ */ chunk4RXGLSPP_js.__name((defaultFilesIn) => {
185
+ var createZodMultipart = /* @__PURE__ */ chunkEV5I5HGT_js.__name((defaultFilesIn) => {
186
186
  return (body, options) => {
187
- const registry = options?.registry ?? chunkFKXVNCDD_js.defaultRegistry;
187
+ const registry = options?.registry ?? chunkDUQLL62I_js.defaultRegistry;
188
188
  const shape = toShape(body);
189
189
  const metadata = {
190
190
  shape,
@@ -210,21 +210,21 @@ var createZodMultipart = /* @__PURE__ */ chunk4RXGLSPP_js.__name((defaultFilesIn
210
210
  };
211
211
  };
212
212
  }, "createZodMultipart");
213
- var readMetadata = /* @__PURE__ */ chunk4RXGLSPP_js.__name((ctx, decorator) => {
213
+ var readMetadata = /* @__PURE__ */ chunkEV5I5HGT_js.__name((ctx, decorator) => {
214
214
  const metadata = Reflect.getMetadata(ZOD_MULTIPART_METADATA_KEY, ctx.getHandler());
215
215
  if (!isMultipartMetadata(metadata)) {
216
216
  throw new Error(`[zod-nest] ${decorator} requires @ZodMultipart on the same handler \u2014 it reads the declared shape from there.`);
217
217
  }
218
218
  return metadata;
219
219
  }, "readMetadata");
220
- var isMultipartMetadata = /* @__PURE__ */ chunk4RXGLSPP_js.__name((value) => value !== null && typeof value === "object" && "shape" in value && "filesIn" in value, "isMultipartMetadata");
221
- var requireShape = /* @__PURE__ */ chunk4RXGLSPP_js.__name((metadata, decorator) => {
220
+ var isMultipartMetadata = /* @__PURE__ */ chunkEV5I5HGT_js.__name((value) => value !== null && typeof value === "object" && "shape" in value && "filesIn" in value, "isMultipartMetadata");
221
+ var requireShape = /* @__PURE__ */ chunkEV5I5HGT_js.__name((metadata, decorator) => {
222
222
  if (metadata.shape !== void 0) {
223
223
  return metadata.shape;
224
224
  }
225
225
  throw new Error(`[zod-nest] ${decorator} needs a flat body shape, but @ZodMultipart was given a composite schema (an intersection or union). Validate it with @Body(new ZodValidationPipe(schema)) instead.`);
226
226
  }, "requireShape");
227
- var schemaFor = /* @__PURE__ */ chunk4RXGLSPP_js.__name((metadata, name, decorator) => {
227
+ var schemaFor = /* @__PURE__ */ chunkEV5I5HGT_js.__name((metadata, name, decorator) => {
228
228
  const shape = requireShape(metadata, decorator);
229
229
  const schema = shape[name];
230
230
  if (schema === void 0) {
@@ -232,7 +232,7 @@ var schemaFor = /* @__PURE__ */ chunk4RXGLSPP_js.__name((metadata, name, decorat
232
232
  }
233
233
  return schema;
234
234
  }, "schemaFor");
235
- var pick = /* @__PURE__ */ chunk4RXGLSPP_js.__name((shape, keys) => {
235
+ var pick = /* @__PURE__ */ chunkEV5I5HGT_js.__name((shape, keys) => {
236
236
  const wanted = new Set(keys);
237
237
  const picked = {};
238
238
  for (const [key, schema] of Object.entries(shape)) {
@@ -242,37 +242,37 @@ var pick = /* @__PURE__ */ chunk4RXGLSPP_js.__name((shape, keys) => {
242
242
  }
243
243
  return zod.z.object(picked);
244
244
  }, "pick");
245
- var validate = /* @__PURE__ */ chunk4RXGLSPP_js.__name(async (schema, value, argType) => {
245
+ var validate = /* @__PURE__ */ chunkEV5I5HGT_js.__name(async (schema, value, argType) => {
246
246
  const result = await schema.safeParseAsync(value);
247
247
  if (result.success) {
248
248
  return result.data;
249
249
  }
250
- throw new chunkFKXVNCDD_js.ZodValidationException(result.error, {
250
+ throw new chunkDUQLL62I_js.ZodValidationException(result.error, {
251
251
  type: argType,
252
252
  metatype: void 0,
253
253
  data: void 0
254
254
  });
255
255
  }, "validate");
256
- var assertFilesOnRequest = /* @__PURE__ */ chunk4RXGLSPP_js.__name((metadata, decorator) => {
256
+ var assertFilesOnRequest = /* @__PURE__ */ chunkEV5I5HGT_js.__name((metadata, decorator) => {
257
257
  if (metadata.filesIn === MultipartFilesIn.Request) {
258
258
  return;
259
259
  }
260
260
  throw new Error(`[zod-nest] ${decorator} is unavailable under filesIn: 'body' \u2014 the parser puts files in the request body, so read them with @ZodMultipartBody().`);
261
261
  }, "assertFilesOnRequest");
262
- var resolveUploadedFile = /* @__PURE__ */ chunk4RXGLSPP_js.__name(async (name, ctx) => {
262
+ var resolveUploadedFile = /* @__PURE__ */ chunkEV5I5HGT_js.__name(async (name, ctx) => {
263
263
  const metadata = readMetadata(ctx, "@ZodUploadedFile");
264
264
  assertFilesOnRequest(metadata, "@ZodUploadedFile");
265
265
  const request = ctx.switchToHttp().getRequest();
266
266
  return validate(schemaFor(metadata, name, "@ZodUploadedFile"), request.file, "custom");
267
267
  }, "resolveUploadedFile");
268
- var resolveUploadedFiles = /* @__PURE__ */ chunk4RXGLSPP_js.__name(async (name, ctx) => {
268
+ var resolveUploadedFiles = /* @__PURE__ */ chunkEV5I5HGT_js.__name(async (name, ctx) => {
269
269
  const metadata = readMetadata(ctx, "@ZodUploadedFiles");
270
270
  assertFilesOnRequest(metadata, "@ZodUploadedFiles");
271
271
  const request = ctx.switchToHttp().getRequest();
272
272
  const schema = name === void 0 ? pick(requireShape(metadata, "@ZodUploadedFiles"), metadata.fileKeys) : schemaFor(metadata, name, "@ZodUploadedFiles");
273
273
  return validate(schema, request.files, "custom");
274
274
  }, "resolveUploadedFiles");
275
- var resolveMultipartBody = /* @__PURE__ */ chunk4RXGLSPP_js.__name(async (_data, ctx) => {
275
+ var resolveMultipartBody = /* @__PURE__ */ chunkEV5I5HGT_js.__name(async (_data, ctx) => {
276
276
  const metadata = readMetadata(ctx, "@ZodMultipartBody");
277
277
  const shape = requireShape(metadata, "@ZodMultipartBody");
278
278
  const request = ctx.switchToHttp().getRequest();
@@ -290,5 +290,5 @@ exports.ZodUploadedFile = ZodUploadedFile;
290
290
  exports.ZodUploadedFiles = ZodUploadedFiles;
291
291
  exports.buildFileSchema = buildFileSchema;
292
292
  exports.createZodMultipart = createZodMultipart;
293
- //# sourceMappingURL=chunk-26E2XEJU.js.map
294
- //# sourceMappingURL=chunk-26E2XEJU.js.map
293
+ //# sourceMappingURL=chunk-6FL3HR4I.js.map
294
+ //# sourceMappingURL=chunk-6FL3HR4I.js.map