@tommasomeli/prisma-generator-nestjs-dto 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/annotations.ts","../src/constants.ts","../src/utility.ts","../src/base-generator.ts","../src/config-loader.ts","../src/generators/entity-generator.ts","../src/generators/create-dto-generator.ts","../src/generators/update-dto-generator.ts","../src/generators/manifest-generator.ts","../src/generator.ts"],"names":["from","fs","defaultValue","path"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Annotation } from './types';\n\n// Model level annotations\nexport const DTO_IGNORE_MODEL = 'DtoIgnoreModel';\nexport const DTO_API_EXTRA_MODELS = 'DtoApiExtraModels';\n\n// Field visibility annotations\nexport const DTO_READ_ONLY = 'DtoReadOnly';\nexport const DTO_CREATE_HIDDEN = 'DtoCreateHidden';\nexport const DTO_UPDATE_HIDDEN = 'DtoUpdateHidden';\nexport const DTO_ENTITY_HIDDEN = 'DtoEntityHidden';\nexport const DTO_API_HIDDEN = 'DtoApiHidden';\nexport const DTO_HIDDEN = 'DtoHidden';\nexport const DTO_CREATED_AT = 'createdAt';\n\n// Field requirement annotations\nexport const DTO_CREATE_OPTIONAL = 'DtoCreateOptional';\nexport const DTO_CREATE_REQUIRED = 'DtoCreateRequired';\nexport const DTO_UPDATE_OPTIONAL = 'DtoUpdateOptional';\nexport const DTO_UPDATE_REQUIRED = 'DtoUpdateRequired';\n\n// Type handling annotations\nexport const DTO_OVERRIDE_TYPE = 'DtoOverrideType';\nexport const DTO_OVERRIDE_API_PROPERTY_TYPE = 'DtoOverrideApiPropertyType';\n\n// Validation annotations\nexport const DTO_CREATE_VALIDATE_IF = 'DtoCreateValidateIf';\nexport const DTO_UPDATE_VALIDATE_IF = 'DtoUpdateValidateIf';\n\n/** Annotations that hide a field from the Entity DTO surface (and therefore from API responses). */\nexport const ENTITY_HIDDEN_ANNOTATIONS = [DTO_HIDDEN, DTO_ENTITY_HIDDEN, DTO_API_HIDDEN];\nconst ENTITY_HIDDEN_SET = new Set(ENTITY_HIDDEN_ANNOTATIONS);\n\n/** Accepts both parsed annotations and raw `documentation` strings (used pre-pipeline). */\nexport function isEntityHidden(field: { annotations?: Annotation[]; documentation?: string | null }): boolean {\n if (field.annotations) return field.annotations.some((a) => ENTITY_HIDDEN_SET.has(a.name));\n if (!field.documentation) return false;\n return ENTITY_HIDDEN_ANNOTATIONS.some((name) => new RegExp(`@${name}\\\\b`).test(field.documentation as string));\n}\n","export const ANNOTATION_NAME_REGEX = /@([A-Za-z][A-Za-z0-9_]*)/g;\n\nexport const ANNOTATION_PARAMS_REGEX = /\\(\\s*((?:[^()]*|\\([^()]*\\))*)\\s*\\)/;\n\nexport const ANNOTATION_PARAMS_SPLIT_REGEX = /,(?![^{]*})/;\n\nexport const PRISMA_SCALAR: Record<string, string> = {\n String: 'string',\n Boolean: 'boolean',\n Int: 'number',\n BigInt: 'bigint',\n Float: 'number',\n Decimal: 'Prisma.Decimal',\n DateTime: 'Date',\n Bytes: 'Buffer',\n Json: 'Prisma.JsonValue',\n Object: '{ [key: string]: any }'\n};\n\nexport const PRISMA_SCALAR_TYPE: Record<string, string> = {\n ...PRISMA_SCALAR,\n Decimal: 'number',\n DateTime: '() => Date',\n Bytes: '() => Buffer',\n Json: '() => Object',\n Object: '() => Object'\n};\n\nexport const PRISMA_SCALAR_FORMAT: Record<string, { type: string; format?: string }> = {\n String: { type: 'string' },\n Boolean: { type: 'boolean' },\n Int: { type: 'integer', format: 'int32' },\n BigInt: { type: 'integer', format: 'int64' },\n Float: { type: 'number', format: 'float' },\n Decimal: { type: 'string', format: 'Decimal.js' },\n DateTime: { type: 'string', format: 'date-time' }\n};\n\nexport const SWAGGER_DECORATORS = ['ApiHideProperty', 'ApiProperty', 'ApiPropertyOptional', 'ApiPropertyRequired', 'ApiExtraModels'];\n\nexport const SWAGGER_API_PROPERTY_DECORATORS = ['description', 'minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'minLength', 'maxLength', 'minItems', 'maxItems', 'example'];\n\nexport const CLASS_TRANSFORMER_DECORATORS = ['Type', 'Transform'];\n\nexport const CLASS_VALIDATOR_DECORATORS = [\n 'Allow',\n 'ArrayContains',\n 'ArrayMaxSize',\n 'ArrayMinSize',\n 'ArrayNotContains',\n 'ArrayNotEmpty',\n 'ArrayUnique',\n 'Contains',\n 'Equals',\n 'IsAlpha',\n 'IsAlphanumeric',\n 'IsArray',\n 'IsAscii',\n 'IsBIC',\n 'IsBase32',\n 'IsBase58',\n 'IsBase64',\n 'IsBoolean',\n 'IsBooleanString',\n 'IsBtcAddress',\n 'IsByteLength',\n 'IsCreditCard',\n 'IsCurrency',\n 'IsDataURI',\n 'IsDate',\n 'IsDateString',\n 'IsDecimal',\n 'IsDefined',\n 'IsDivisibleBy',\n 'IsEAN',\n 'IsEmail',\n 'IsEmpty',\n 'IsEthereumAddress',\n 'IsFQDN',\n 'IsFirebasePushId',\n 'IsFullWidth',\n 'IsHash',\n 'IsHSLColor',\n 'IsHexadecimal',\n 'IsIBAN',\n 'IsISIN',\n 'IsISO31661Alpha2',\n 'IsISO31661Alpha3',\n 'IsISO4217CurrencyCode',\n 'IsISO8601',\n 'IsISRC',\n 'IsISSN',\n 'IsIdentityCard',\n 'IsImage',\n 'IsIn',\n 'IsInstance',\n 'IsInt',\n 'IsIP',\n 'IsISBN',\n 'IsIsHalfWidth',\n 'IsIsHexColor',\n 'IsIsVariableWidth',\n 'IsJWT',\n 'IsJSON',\n 'IsLatLong',\n 'IsLatitude',\n 'IsLocale',\n 'IsLongitude',\n 'IsLowercase',\n 'IsMACAddress',\n 'IsMagnetURI',\n 'IsMilitaryTime',\n 'IsMimeType',\n 'IsMobilePhone',\n 'IsMongoId',\n 'IsMultiByte',\n 'IsNegative',\n 'IsNotEmpty',\n 'IsNotEmptyObject',\n 'IsNotIn',\n 'IsNumber',\n 'IsNumberString',\n 'IsObject',\n 'IsOctal',\n 'IsOptional',\n 'IsPassportNumber',\n 'IsPhoneNumber',\n 'IsPort',\n 'IsPositive',\n 'IsPostalCode',\n 'IsRFC3339',\n 'IsRgbColor',\n 'IsSemVer',\n 'IsString',\n 'IsStrongPassword',\n 'IsSurrogatePair',\n 'IsTaxId',\n 'IsTimeZone',\n 'IsUppercase',\n 'IsUrl',\n 'IsUUID',\n 'Length',\n 'Max',\n 'MaxDate',\n 'MaxLength',\n 'Matches',\n 'Min',\n 'MinDate',\n 'MinLength',\n 'NotContains',\n 'NotEquals',\n 'ValidateIf',\n 'ValidateNested'\n];\n","import chalk from 'chalk';\nimport { ImportType } from './types';\n\n/**\n * Stateless helpers used by the generator pipeline: leveled logger with a\n * configurable prefix, boolean parsing, and the import-statement parser used by\n * every `extra*` config option.\n */\nexport class Utility {\n private static prefix = 'prisma-generator-nestjs-dto';\n\n /** Override the global log prefix (defaults to the package name). */\n static setLogPrefix(prefix: string): void {\n this.prefix = prefix;\n }\n\n static log(message: any, ...data: any[]): void {\n console.info(`${chalk.cyan(this.prefix)} ${message}`, ...data);\n }\n\n static warn(message: any, ...data: any[]): void {\n console.info(chalk.yellowBright(`${this.prefix} ${message}`), ...data);\n }\n\n static error(message: any, ...data: any[]): void {\n console.error(chalk.redBright(`${this.prefix} ${message}`), ...data);\n }\n\n /**\n * Parses a string into a boolean. Accepts native booleans and the Prisma-style\n * stringified values that come from `schema.prisma` config options.\n */\n static parseBoolean(value: string | boolean | undefined): boolean {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') return value === 'true' || value === '1' || value === 'yes' || value === 'on';\n return false;\n }\n\n /**\n * Parses one or more import declarations from the value of an `extra*` config option.\n * The only supported syntax is the compact inline form:\n *\n * ```prisma\n * extraValidators = \"IsUnique,IsBool:src/common/validators|IsAdult:src/common/validators/is-adult\"\n * ```\n *\n * - `Foo,Bar:path` — named imports.\n * - `* as Foo:path` — namespace import.\n * - `default as Foo:path` — default import.\n * - `|` — separator for multiple groups (different paths).\n *\n * For anything more elaborate (rename, default + named, type-safe paths, ...) use a\n * `configFile` with `ImportDescriptor` or the `from()` / `fromNamespace()` / `fromDefault()`\n * helpers.\n *\n * Also accepts an array of strings, with each entry already containing one or more\n * `|`-separated groups.\n */\n static parseImports(value: string | string[] | undefined): ImportType[] {\n if (value === undefined || value === null) return [];\n const items: string[] = Array.isArray(value) ? value : [value];\n const out: ImportType[] = [];\n for (const item of items) {\n const trimmed = item.trim();\n if (!trimmed) continue;\n if (trimmed.startsWith('import')) {\n this.warn(\n `ES import syntax is no longer supported in extra* options. Use \"Name:path|Other:path2\" or move to a configFile with ImportDescriptor / from() helpers. Got: ${trimmed}`\n );\n continue;\n }\n for (const entry of this.parseInlineImport(trimmed)) this.mergeInto(out, entry);\n }\n return out;\n }\n\n /**\n * Parses `extraAnnotations` into a deduplicated list of annotation names.\n * Accepts a single comma/whitespace-separated string, a string array, or a mix:\n * `\"@DtoFoo, DtoBar\"`, `[\"DtoFoo\", \"DtoBar\"]`, `\"DtoFoo DtoBar\"`. Leading `@`\n * characters are stripped so plugin authors can refer to them either way.\n */\n static parseAnnotationNames(value: string | string[] | undefined): string[] {\n if (value === undefined || value === null) return [];\n const raw = Array.isArray(value) ? value : [value];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const entry of raw) {\n if (typeof entry !== 'string') continue;\n for (const piece of entry.split(/[,\\s]+/)) {\n const name = piece.replace(/^@/, '').trim();\n if (!name || seen.has(name)) continue;\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n }\n\n /**\n * Parses the `extraScalars` config value. Accepts a JSON string (the form emitted by\n * {@link applyConfigFile}) or an already-parsed `Record<string, ScalarOverride>` object.\n * Invalid entries are skipped with a warning rather than throwing.\n */\n static parseExtraScalars(value: unknown): Record<string, { ts: string; from?: string; apiType?: string; format?: string }> {\n if (!value) return {};\n let parsed: unknown = value;\n if (typeof value === 'string') {\n try { parsed = JSON.parse(value); }\n catch (error) {\n Utility.warn('Failed to parse extraScalars JSON, ignoring.', error);\n return {};\n }\n }\n if (!parsed || typeof parsed !== 'object') return {};\n const out: Record<string, { ts: string; from?: string; apiType?: string; format?: string }> = {};\n for (const [scalar, raw] of Object.entries(parsed as Record<string, unknown>)) {\n if (!raw || typeof raw !== 'object') continue;\n const override = raw as { ts?: unknown; from?: unknown; apiType?: unknown; format?: unknown };\n if (typeof override.ts !== 'string') {\n Utility.warn(`extraScalars[\"${scalar}\"] is missing a string \\`ts\\` field, ignoring.`);\n continue;\n }\n out[scalar] = {\n ts: override.ts,\n from: typeof override.from === 'string' ? override.from : undefined,\n apiType: typeof override.apiType === 'string' ? override.apiType : undefined,\n format: typeof override.format === 'string' ? override.format : undefined\n };\n }\n return out;\n }\n\n /**\n * @deprecated Use {@link parseImports} instead. Kept for sub-generators that\n * relied on the public name in earlier releases.\n */\n static stringToImports(value: string | string[] | undefined): ImportType[] {\n return this.parseImports(value);\n }\n\n /** Parses the inline `Name1,Name2:path|Other:path2` syntax. */\n private static parseInlineImport(value: string): ImportType[] {\n const out: ImportType[] = [];\n for (const group of value.split('|')) {\n const lastColonIndex = group.lastIndexOf(':');\n if (lastColonIndex === -1) {\n this.warn(`Invalid import format: ${group}. Missing path after colon.`);\n continue;\n }\n const from = group.substring(lastColonIndex + 1).trim();\n const names = group.substring(0, lastColonIndex).trim();\n if (names.includes('* as ') || names.includes('default as ')) {\n out.push({ from, alias: names });\n continue;\n }\n const destruct = names\n .split(',')\n .map((n) => n.trim())\n .filter(Boolean);\n if (destruct.length === 0) {\n this.warn(`Invalid import format: ${group}. No import names found.`);\n continue;\n }\n out.push({ from, destruct });\n }\n return out;\n }\n\n /** Merges a new entry into an existing array, deduplicating named imports on the same path. */\n private static mergeInto(imports: ImportType[], next: ImportType): void {\n if (next.alias) {\n const existing = imports.find((i) => i.from === next.from && i.alias);\n if (existing) {\n existing.alias = next.alias;\n return;\n }\n imports.push({ from: next.from, alias: next.alias });\n return;\n }\n if (next.destruct && next.destruct.length) {\n const existing = imports.find((i) => i.from === next.from && i.destruct);\n if (existing) {\n existing.destruct = Array.from(new Set([...(existing.destruct || []), ...next.destruct]));\n return;\n }\n imports.push({ from: next.from, destruct: [...next.destruct] });\n }\n }\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport {\n DTO_API_EXTRA_MODELS,\n DTO_API_HIDDEN,\n DTO_IGNORE_MODEL,\n DTO_OVERRIDE_API_PROPERTY_TYPE,\n DTO_OVERRIDE_TYPE,\n DTO_READ_ONLY\n} from './annotations';\nimport {\n ANNOTATION_NAME_REGEX,\n ANNOTATION_PARAMS_REGEX,\n ANNOTATION_PARAMS_SPLIT_REGEX,\n CLASS_TRANSFORMER_DECORATORS,\n CLASS_VALIDATOR_DECORATORS,\n PRISMA_SCALAR,\n PRISMA_SCALAR_FORMAT,\n PRISMA_SCALAR_TYPE,\n SWAGGER_API_PROPERTY_DECORATORS,\n SWAGGER_DECORATORS\n} from './constants';\nimport { Annotation, Field, File, GeneratorConfig, GeneratorOptions, ImportType, Model, NamingStrategy, OutputStructure, OutputType, RawGeneratorConfig } from './types';\nimport { Utility } from './utility';\n\n/**\n * Base class for every sub-generator. Concrete generators describe how their files\n * are named (prefix/suffix) and contribute a `generate()` that yields `File[]`.\n * Subclasses normally only override `generate()` and rely on `getTemplate()` to\n * render the class body (imports, decorators, validators, field declarations).\n */\nexport abstract class BaseGenerator {\n protected options: GeneratorOptions;\n protected config: GeneratorConfig;\n public models: Model[];\n\n constructor(options: GeneratorOptions) {\n this.options = options;\n const raw = options.generator.config as RawGeneratorConfig;\n const asString = (value: unknown): string | undefined => (typeof value === 'string' ? value : undefined);\n this.config = {\n provider: options.generator.provider?.value || '',\n output: options.generator.output?.value || '',\n outputType: (asString(raw.outputType) as OutputType) || 'class',\n outputStructure: (asString(raw.outputStructure) as OutputStructure) || 'nestjs',\n reExport: Utility.parseBoolean(asString(raw.reExport)),\n fileNamingStrategy: (asString(raw.fileNamingStrategy) as NamingStrategy) || 'camel',\n classValidator: Utility.parseBoolean(asString(raw.classValidator)),\n swaggerDocs: Utility.parseBoolean(asString(raw.swaggerDocs)),\n prettier: Utility.parseBoolean(asString(raw.prettier)),\n schemaDir: asString(raw.schemaDir),\n emitManifest: Utility.parseBoolean(asString(raw.emitManifest)),\n extraDecorators: Utility.parseImports(raw.extraDecorators),\n extraValidators: Utility.parseImports(raw.extraValidators),\n extraImports: Utility.parseImports(raw.extraImports),\n extraGenerators: raw.extraGenerators,\n extraScalars: Utility.parseExtraScalars(raw.extraScalars),\n extraAnnotations: Utility.parseAnnotationNames(raw.extraAnnotations)\n };\n this.models = this.options.dmmf.datamodel.models\n .map<Model>((model) => ({\n name: model.name,\n dbName: model.dbName,\n documentation: model.documentation,\n primaryKey: model.primaryKey,\n uniqueFields: model.uniqueFields as readonly (readonly string[])[],\n uniqueIndexes: model.uniqueIndexes,\n isGenerated: model.isGenerated,\n annotations: this.extractAnnotations(model.documentation || ''),\n outputType: this.config.outputType,\n fields: [\n ...model.fields.map<Field>((field) => ({\n name: field.name,\n type: field.type,\n kind: field.kind as Field['kind'],\n isList: field.isList,\n isRequired: field.isRequired,\n isUnique: field.isUnique,\n isId: field.isId,\n isReadOnly: field.isReadOnly,\n isGenerated: field.isGenerated,\n isUpdatedAt: field.isUpdatedAt,\n hasDefaultValue: field.hasDefaultValue,\n default: field.default,\n relationName: field.relationName,\n relationFromFields: field.relationFromFields as readonly string[] | string[],\n relationToFields: field.relationToFields as readonly string[] | string[],\n relationOnDelete: field.relationOnDelete,\n documentation: field.documentation,\n isNullable: !field.isRequired || field.isList,\n annotations: this.extractAnnotations(field.documentation || '')\n })),\n ...this.getIgnoredFields(model.name)\n ]\n }))\n .filter((model) => !model.annotations.some((a) => a.name === DTO_IGNORE_MODEL));\n }\n\n abstract filePrefix: string;\n abstract fileSuffix: string;\n abstract classPrefix: string;\n abstract classSuffix: string;\n\n /** Produces the list of files this generator wants to emit. */\n abstract generate(): Promise<File[]>;\n\n /**\n * Optional pre-pass invoked once before any built-in or plugin `generate()` runs.\n * Receives the **shared** `Model[]` array (already filtered for `@DtoIgnoreModel`);\n * mutating it (e.g. injecting synthetic fields, rewriting annotations) is supported\n * and visible to every generator that runs afterwards. Defaults to no-op.\n */\n async beforeAll(_models: Model[]): Promise<void> {}\n\n /**\n * Optional post-pass invoked once after every generator's `generate()` completes,\n * receiving the **complete** list of files produced in the run (built-ins + plugins).\n * Return a non-empty `File[]` to append extra files (e.g. an aggregated barrel,\n * audit report, schema export); return `void` to leave the run untouched. Defaults to no-op.\n */\n async afterAll(_files: File[]): Promise<File[] | void> {}\n\n /**\n * Reads `@ignore` fields from `.prisma` files inside `schemaDir`. Prisma\n * strips ignored fields from the DMMF but we still want them visible to\n * annotations like `@DtoApiHidden`, so we re-parse the raw schema.\n */\n private getIgnoredFields(modelName: string): Field[] {\n try {\n if (!this.config.schemaDir) return [];\n const schemaDir = path.resolve(process.cwd(), this.config.schemaDir);\n if (!fs.existsSync(schemaDir)) {\n Utility.warn(`Configured schemaDir does not exist: ${schemaDir}`);\n return [];\n }\n const findPrismaFilesRecursively = (dir: string): string[] => {\n const files: string[] = [];\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) files.push(...findPrismaFilesRecursively(fullPath));\n else if (entry.isFile() && entry.name.endsWith('.prisma') && entry.name !== 'schema.prisma') files.push(fullPath);\n }\n } catch (error) {\n Utility.warn(`Could not read directory ${dir}:`, error);\n }\n return files;\n };\n const schemaFiles = findPrismaFilesRecursively(schemaDir);\n const ignoredFields: Field[] = [];\n for (const schemaFile of schemaFiles) {\n const schemaContent = fs.readFileSync(schemaFile, 'utf8');\n const modelRegex = new RegExp(`model\\\\s+${modelName}\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}`, 'g');\n const modelMatch = modelRegex.exec(schemaContent);\n if (!modelMatch) continue;\n const modelContent = modelMatch[1];\n const fieldRegex = /((?:[ \\t]*\\/\\/\\/[^\\n]*\\n)*)([ \\t]*)([a-zA-Z_][a-zA-Z0-9_]*)\\s+([a-zA-Z0-9\\[\\]?]+)([^@\\n]*@ignore)/g;\n let fieldMatch;\n while ((fieldMatch = fieldRegex.exec(modelContent)) !== null) {\n const documentation = fieldMatch[1]?.trim() || '';\n const fieldName = fieldMatch[3];\n const fieldType = fieldMatch[4];\n const isOptional = fieldType.includes('?');\n const isList = fieldType.includes('[]');\n const cleanType = fieldType.replace(/[\\[\\]?]/g, '');\n const kind: 'scalar' | 'object' | 'enum' = ['String', 'Int', 'Float', 'Boolean', 'DateTime', 'Json', 'Decimal', 'BigInt', 'Bytes'].includes(cleanType) ? 'scalar' : 'object';\n ignoredFields.push({\n name: fieldName,\n type: cleanType,\n kind,\n isList,\n isRequired: !isOptional,\n isNullable: isOptional || isList,\n annotations: this.extractAnnotations(documentation),\n isId: false,\n isUnique: false,\n isReadOnly: false,\n hasDefaultValue: false\n });\n }\n }\n return ignoredFields;\n } catch (error) {\n Utility.warn(`Could not read ignored fields for model ${modelName}:`, error);\n return [];\n }\n }\n\n /** Parses `/// @Foo(arg, {object})` documentation strings into structured annotations. */\n private extractAnnotations(documentation: string): Annotation[] {\n const annotations: Annotation[] = [];\n let nameMatch;\n while ((nameMatch = ANNOTATION_NAME_REGEX.exec(documentation)) !== null) {\n const annotationName = nameMatch[1];\n const startPosition = nameMatch.index + ('@' + annotationName).length;\n const remainingText = documentation.substring(startPosition);\n if (!remainingText.startsWith('(')) {\n annotations.push({ name: annotationName, params: [] });\n continue;\n }\n ANNOTATION_PARAMS_REGEX.lastIndex = 0;\n const paramsMatch = ANNOTATION_PARAMS_REGEX.exec(remainingText);\n let params: any[] = [];\n if (paramsMatch && paramsMatch[1]) {\n const paramsString = paramsMatch[1].trim();\n params = paramsString\n .split(ANNOTATION_PARAMS_SPLIT_REGEX)\n .map((param) => param.trim())\n .map((param) => {\n if (param.startsWith('{') && param.endsWith('}')) return param;\n return isNaN(Number(param)) ? param : Number(param);\n })\n .filter(Boolean);\n }\n annotations.push({ name: annotationName, params });\n }\n return annotations;\n }\n\n /**\n * Returns the first annotation matching `name` on a field or model, or `undefined`.\n * Use from custom sub-generators to react to user-defined annotations declared via\n * `extraAnnotations` (or any built-in `@Dto*` name).\n */\n public getAnnotation(target: { annotations: Annotation[] }, name: string): Annotation | undefined {\n return target.annotations.find((a) => a.name === name);\n }\n\n /** Convenience boolean form of {@link getAnnotation}. */\n public hasAnnotation(target: { annotations: Annotation[] }, name: string): boolean {\n return this.getAnnotation(target, name) !== undefined;\n }\n\n /**\n * Adds (and merges) an import descriptor into an `ImportType[]` array, honouring\n * the same dedup/merge rules used by the built-in pipeline. Repeated calls with\n * the same `from` collapse named imports together; `alias` entries are stored\n * separately from `destruct` entries on the same path.\n */\n protected addImport(imports: ImportType[], next: ImportType): void {\n this.mergeImport(imports, next);\n }\n\n /**\n * Renders an `ImportType[]` array as a multi-line `import ... from '...'` block.\n * Absolute paths (e.g. produced by `getPath(relatedModel, outputPath)`) are rewritten\n * as POSIX-style relative paths anchored at `outputPath`; TypeScript file extensions\n * (`.ts` / `.mts` / `.cts` / `.tsx`) on the `from` path are stripped automatically\n * since they are never desired in import statements.\n */\n protected formatImports(imports: ImportType[], outputPath?: string): string {\n return imports\n .map((i) => {\n const from = this.stripTsExtension(this.rewriteImportPath(i.from, outputPath));\n return `import ${i.alias ? i.alias : `{ ${(i.destruct || []).join(', ')} }`} from '${from}';`;\n })\n .join('\\n');\n }\n\n /**\n * Returns the output path of a `model` formatted for use as an `import` specifier:\n * same as {@link getPath} but with the TypeScript file extension stripped and a\n * `./` prefix added when the result would otherwise look like a bare module specifier\n * (`flat` outputStructure case). Use this when a custom sub-generator needs to\n * reference a peer-generated file (e.g. for relations between models) and you would\n * otherwise hand-strip `.ts` from `getPath`.\n */\n protected getImportPath(model: Model, fromOutputPath?: string): string {\n const stripped = this.stripTsExtension(this.getPath(model, fromOutputPath));\n if (fromOutputPath && !stripped.startsWith('.') && !path.isAbsolute(stripped)) return `./${stripped}`;\n return stripped;\n }\n\n /** Strips `.ts` / `.mts` / `.cts` / `.tsx` suffixes from an `import` specifier. */\n private stripTsExtension(from: string): string {\n return from.replace(/\\.(ts|mts|cts|tsx)$/, '');\n }\n\n /** File / class name transformer. Defaults to camelCase. */\n protected getModelName(name: string): string {\n switch (this.config.fileNamingStrategy) {\n case 'snake':\n return name.charAt(0).toLowerCase() + name.slice(1).replace(/[A-Z]/g, (char) => '_' + char.toLowerCase());\n case 'kebab':\n return (\n name.charAt(0).toLowerCase() +\n name\n .slice(1)\n .replace(/[A-Z]/g, (char) => '-' + char.toLowerCase())\n .replace(/_/g, '-')\n );\n default:\n case 'camel':\n return name.charAt(0).toLowerCase() + name.slice(1).replace(/_(\\w)/g, (_, char) => char.toUpperCase());\n }\n }\n\n /**\n * Applies `@DtoOverrideType(<type>)` non-destructively. The original `model`\n * is left untouched; callers receive a model with cloned fields whose `kind`\n * and `type` reflect the override.\n */\n private applyOverrides(model: Model): Model {\n const fields = model.fields.map((field) => {\n const overrideType = field.annotations.find((a) => a.name === DTO_OVERRIDE_TYPE);\n if (overrideType && overrideType.params?.[0]) {\n const clone: Field = { ...field };\n delete (clone as { kind?: unknown }).kind;\n clone.type = String(overrideType.params[0]);\n return clone;\n }\n return field;\n });\n return { ...model, fields };\n }\n\n /**\n * Merges a new `ImportType` into the existing array. Distinct concerns are kept\n * as separate entries (i.e. an `alias` import and a `destruct` import from the\n * same path will not collide).\n */\n private mergeImport(imports: ImportType[], next: ImportType): void {\n if (next.alias) {\n const existing = imports.find((i) => i.from === next.from && i.alias);\n if (existing) {\n existing.alias = next.alias;\n return;\n }\n imports.push({ from: next.from, alias: next.alias });\n return;\n }\n if (next.destruct && next.destruct.length) {\n const existing = imports.find((i) => i.from === next.from && i.destruct);\n if (existing) {\n existing.destruct = Array.from(new Set([...(existing.destruct || []), ...next.destruct]));\n return;\n }\n imports.push({ from: next.from, destruct: [...next.destruct] });\n }\n }\n\n /** Collects every import the rendered class will need. */\n private getImports(args: { model: Model; classValidator?: boolean; swaggerDocs?: boolean }): ImportType[] {\n const { model, classValidator = Utility.parseBoolean(this.config.classValidator) || false, swaggerDocs = Utility.parseBoolean(this.config.swaggerDocs) || false } = args;\n const imports: ImportType[] = [];\n // Any descriptor in extraValidators / extraDecorators / extraImports that exports\n // a name colliding with a built-in import (`class-validator`, `@nestjs/swagger`,\n // `class-transformer`, `@prisma/client`, ...) wins: the symbol is routed through\n // the user module instead of the default one.\n const findOverride = (name: string): ImportType | undefined =>\n [...this.config.extraValidators, ...this.config.extraDecorators, ...this.config.extraImports]\n .find((v) => v.destruct?.includes(name));\n const addImport = (importParams: ImportType) => {\n if (!importParams.destruct?.length || importParams.alias) {\n this.mergeImport(imports, importParams);\n return;\n }\n const grouped = new Map<string, string[]>();\n importParams.destruct.forEach((name) => {\n const from = findOverride(name)?.from ?? importParams.from;\n grouped.set(from, [...(grouped.get(from) ?? []), name]);\n });\n grouped.forEach((destruct, from) => this.mergeImport(imports, { from, destruct }));\n };\n const scalarOverrides = this.config.extraScalars ?? {};\n model.fields.forEach((field: Field) => {\n if (field.kind === 'object' && field.type && field.type !== `${this.classPrefix}${model.name}${this.classSuffix}`) {\n const relationModel = this.models.find((m) => m.name === field.type);\n if (relationModel) {\n const importPath = this.getPath(relationModel, this.getPath(model));\n addImport({ from: Utility.parseBoolean(this.config.reExport) ? path.dirname(importPath) : importPath, destruct: [relationModel.name] });\n }\n }\n if (field.kind === 'enum') addImport({ from: '@prisma/client', destruct: [field.type] });\n const override = scalarOverrides[field.type];\n if (override && override.from) addImport({ from: override.from, destruct: [override.ts] });\n // Built-in `Prisma.Json` / `Prisma.Decimal` are only needed when the user has NOT overridden the scalar.\n else if (field.type === 'Json' || field.type === 'Decimal') addImport({ from: '@prisma/client', destruct: ['Prisma'] });\n });\n if (this.config.outputType === 'class' && swaggerDocs) {\n const addSwaggerDecorator = (decorator: string) => addImport({ from: '@nestjs/swagger', destruct: [decorator] });\n addSwaggerDecorator('ApiProperty');\n const extraModelsAnnotation = model.annotations.find((a) => a.name === DTO_API_EXTRA_MODELS);\n if (extraModelsAnnotation?.params?.length) addSwaggerDecorator('ApiExtraModels');\n model.fields.forEach((field: Field) => {\n field.annotations.forEach((annotation) => {\n if (SWAGGER_DECORATORS.includes(annotation.name)) addSwaggerDecorator(annotation.name);\n });\n });\n }\n if (this.config.outputType === 'class' && classValidator) {\n const addValidator = (decorator: string) => addImport({ from: 'class-validator', destruct: [decorator] });\n model.fields.forEach((field: Field) => {\n if (!field.isRequired) addValidator('IsOptional');\n if (!field.isNullable) addValidator('IsNotEmpty');\n if (field.isList) addValidator('IsArray');\n switch (field.type) {\n case 'String':\n addValidator('IsString');\n break;\n case 'Int':\n addValidator('IsInt');\n break;\n case 'Float':\n addValidator('IsNumber');\n break;\n case 'Boolean':\n addValidator('IsBoolean');\n break;\n case 'DateTime':\n addValidator('IsDateString');\n break;\n case 'Json':\n addValidator('IsObject');\n break;\n }\n if (field.kind === 'object') {\n addValidator('ValidateNested');\n addImport({ from: 'class-transformer', destruct: ['Type'] });\n }\n field.annotations.forEach((annotation) => {\n if (CLASS_VALIDATOR_DECORATORS.includes(annotation.name)) addValidator(annotation.name);\n });\n field.annotations.forEach((annotation) => {\n if (CLASS_TRANSFORMER_DECORATORS.includes(annotation.name)) addImport({ from: 'class-transformer', destruct: [annotation.name] });\n });\n if (this.config.extraValidators.length) {\n field.annotations.forEach((annotation) => {\n this.config.extraValidators.forEach((validatorImport) => {\n if (annotation.name === validatorImport.alias || (validatorImport.destruct && validatorImport.destruct.includes(annotation.name))) {\n if (validatorImport.alias) addImport({ from: validatorImport.from, alias: validatorImport.alias });\n else if (validatorImport.destruct) addImport({ from: validatorImport.from, destruct: [annotation.name] });\n }\n });\n });\n }\n });\n }\n if (this.config.extraDecorators.length) {\n model.fields.forEach((field: Field) => {\n field.annotations.forEach((annotation) => {\n this.config.extraDecorators.forEach((decoratorImport) => {\n if (annotation.name === decoratorImport.alias || (decoratorImport.destruct && decoratorImport.destruct.includes(annotation.name))) {\n if (decoratorImport.alias) addImport({ from: decoratorImport.from, alias: decoratorImport.alias });\n else if (decoratorImport.destruct) addImport({ from: decoratorImport.from, destruct: [annotation.name] });\n }\n });\n });\n });\n }\n if (this.config.extraImports.length) {\n model.fields.forEach((field: Field) => {\n field.annotations.forEach((annotation) => {\n const isValidatorAnnotation =\n CLASS_VALIDATOR_DECORATORS.includes(annotation.name) ||\n CLASS_TRANSFORMER_DECORATORS.includes(annotation.name) ||\n this.config.extraValidators.some((v) => annotation.name === v.alias || (v.destruct && v.destruct.includes(annotation.name)));\n const isSwaggerAnnotation = SWAGGER_DECORATORS.includes(annotation.name) || SWAGGER_API_PROPERTY_DECORATORS.includes(annotation.name);\n if ((isValidatorAnnotation && !classValidator) || (isSwaggerAnnotation && !swaggerDocs)) return;\n if (!annotation.params) return;\n this.config.extraImports.forEach((importConfig) => {\n if (importConfig.alias) {\n const aliasName = importConfig.alias.split(' as ')[1] || importConfig.alias;\n const isUsed = annotation.params.some((param: any) => typeof param === 'string' && param.includes(aliasName));\n if (isUsed) addImport({ from: importConfig.from, alias: importConfig.alias });\n } else if (importConfig.destruct) {\n importConfig.destruct.forEach((item) => {\n const isUsed = annotation.params.some((param: any) => typeof param === 'string' && param.includes(item));\n if (isUsed) addImport({ from: importConfig.from, destruct: [item] });\n });\n }\n });\n });\n });\n const extraModelsAnnotation = model.annotations.find((a) => a.name === DTO_API_EXTRA_MODELS);\n if (extraModelsAnnotation?.params?.length) {\n extraModelsAnnotation.params.forEach((param: any) => {\n if (typeof param !== 'string') return;\n const typeName = param.trim();\n this.config.extraImports.forEach((importConfig) => {\n if (importConfig.destruct && importConfig.destruct.includes(typeName)) addImport({ from: importConfig.from, destruct: [typeName] });\n });\n });\n }\n }\n model.fields.forEach((field: Field) => {\n const overrideType = field.annotations.find((a) => a.name === DTO_OVERRIDE_TYPE);\n if (overrideType && overrideType.params?.[0]) {\n const overrideModel = this.models.find((m) => m.name === String(overrideType.params[0]));\n if (overrideModel) {\n const importPath = this.getPath(overrideModel, this.getPath(model));\n addImport({ from: Utility.parseBoolean(this.config.reExport) ? path.dirname(importPath) : importPath, destruct: [overrideModel.name] });\n }\n }\n const overrideApiPropertyType = field.annotations.find((a) => a.name === DTO_OVERRIDE_API_PROPERTY_TYPE);\n if (overrideApiPropertyType && overrideApiPropertyType.params?.[0]) {\n const overrideModel = this.models.find((m) => m.name === String(overrideApiPropertyType.params[0]));\n if (overrideModel) {\n const importPath = this.getPath(overrideModel, this.getPath(model));\n addImport({ from: Utility.parseBoolean(this.config.reExport) ? path.dirname(importPath) : importPath, destruct: [overrideModel.name] });\n }\n }\n });\n return imports;\n }\n\n /**\n * Resolves an import `from` value for the file being emitted. Absolute paths\n * (typically produced when a relative `from` was declared in the external config file)\n * are rewritten as POSIX-style relative paths anchored at the output file's directory.\n */\n private rewriteImportPath(from: string, outputPath?: string): string {\n if (!outputPath || !path.isAbsolute(from)) return from;\n const absoluteOutput = path.resolve(outputPath);\n let relative = path.relative(path.dirname(absoluteOutput), from);\n if (!relative.startsWith('.') && !path.isAbsolute(relative)) relative = `./${relative}`;\n return relative.split(path.sep).join('/');\n }\n\n /** Renders the `import ... from ...` block. */\n private getImportsTemplate(args: { model: Model; classValidator?: boolean; swaggerDocs?: boolean; outputPath?: string }): string {\n return this.formatImports(this.getImports(args), args.outputPath);\n }\n\n /**\n * Renders the full class body (imports + class declaration with decorators and fields).\n * Sub-generators usually feed it a `model` they already pre-filtered.\n */\n public getTemplate(args: { model: Model; classValidator?: boolean; swaggerDocs?: boolean; outputPath?: string }): string {\n const classValidator = Utility.parseBoolean(args.classValidator ?? this.config.classValidator) || false;\n const swaggerDocs = Utility.parseBoolean(args.swaggerDocs ?? this.config.swaggerDocs) || false;\n const model = this.applyOverrides(args.model);\n const scalarOverrides = this.config.extraScalars ?? {};\n const getPropertyType = (field: Field, isDecorator = false): string => {\n const override = field.kind === 'scalar' ? scalarOverrides[field.type] : undefined;\n if (override) {\n if (!isDecorator) return override.ts;\n if (override.apiType) return override.apiType;\n // No explicit `apiType`: assume `ts` is a class identifier when it has a source module,\n // otherwise treat it as a primitive name ('string', 'number', ...).\n return override.from ? `() => ${override.ts}` : `'${override.ts}'`;\n }\n const SCALAR_TYPE = isDecorator ? Object.fromEntries(Object.entries(PRISMA_SCALAR_TYPE).map(([key, value]) => [key, value.startsWith('() =>') ? value : `'${value}'`])) : PRISMA_SCALAR;\n if (field.kind === 'scalar') return SCALAR_TYPE[field.type] || 'any';\n else if ((field.kind === 'enum' || field.kind === 'object') && isDecorator) return `() => ${field.type}`;\n return field.type;\n };\n const getDefaultValue = (field: Field): any => {\n if (!field.hasDefaultValue) return undefined;\n if (Array.isArray(field.default)) return JSON.stringify(field.default);\n switch (typeof field.default) {\n case 'string':\n case 'number':\n case 'boolean':\n if (field.type === 'Decimal' && typeof field.default === 'number') return `new Prisma.Decimal(${field.default})`;\n return field.default;\n case 'object':\n if (field.default && typeof field.default === 'object' && 'name' in field.default) {\n if (field.default.name === 'now' && field.type === 'DateTime') return undefined;\n if (field.default.name === 'autoincrement') return undefined;\n return field.default.name;\n }\n return undefined;\n default:\n return undefined;\n }\n };\n const encapsulateString = (value: string): string => {\n if (value === 'true' || value === 'false' || value === 'null' || /^-?\\d+(?:\\.\\d+)?$/.test(value) || /^\\[.*]$/.test(value)) return value;\n return `'${value.replace(/'/g, \"\\\\'\")}'`;\n };\n const fields = model.fields\n .map((field: Field) => {\n const decorators: string[] = [];\n if (this.config.outputType === 'class' && swaggerDocs) {\n if (field.annotations.some((a) => a.name === DTO_API_HIDDEN)) {\n decorators.push('@ApiHideProperty()');\n } else {\n const apiPropertyParams: string[] = [];\n if (field.kind === 'enum') {\n apiPropertyParams.push(`enum: ${field.type}`);\n apiPropertyParams.push(`enumName: ${encapsulateString(field.type)}`);\n } else {\n const overrideApiPropertyType = field.annotations.find((a) => a.name === DTO_OVERRIDE_API_PROPERTY_TYPE);\n if (overrideApiPropertyType && overrideApiPropertyType.params && overrideApiPropertyType.params.length > 0) {\n apiPropertyParams.push(`type: () => ${overrideApiPropertyType.params[0]}`);\n } else {\n apiPropertyParams.push(`type: ${getPropertyType(field, true)}`);\n }\n }\n if (field.isList) apiPropertyParams.push(`isArray: true`);\n apiPropertyParams.push(`required: ${!field.isList && field.isRequired}`);\n if (field.isNullable) apiPropertyParams.push(`nullable: ${field.isNullable}`);\n const formatOverride = scalarOverrides[field.type]?.format;\n const scalarFormat = formatOverride ?? PRISMA_SCALAR_FORMAT[field.type]?.format;\n if (scalarFormat) apiPropertyParams.push(`format: ${encapsulateString(scalarFormat)}`);\n const defaultValue = getDefaultValue(field);\n if (defaultValue !== undefined) apiPropertyParams.push(`default: ${typeof defaultValue === 'string' ? encapsulateString(defaultValue) : defaultValue}`);\n SWAGGER_API_PROPERTY_DECORATORS.forEach((prop) => {\n const annotation = field.annotations.find((a) => a.name === prop);\n if (annotation) {\n const value = annotation.params ? annotation.params[0] : '';\n apiPropertyParams.push(`${prop}: ${encapsulateString(String(value))}`);\n }\n });\n decorators.push(`@ApiProperty({ ${apiPropertyParams.join(', ')} })`);\n field.annotations\n .filter((annotation) => SWAGGER_DECORATORS.includes(annotation.name))\n .forEach((annotation) => {\n const params = annotation.params ? `(${annotation.params.join(', ')})` : '';\n decorators.push(`@${annotation.name}${params}`);\n });\n }\n }\n if (this.config.outputType === 'class' && classValidator) {\n if (field.isList || !field.isRequired) decorators.push('@IsOptional()');\n if (!field.isNullable) decorators.push('@IsNotEmpty()');\n if (field.isList) decorators.push('@IsArray()');\n switch (field.type) {\n case 'String':\n decorators.push(field.isList ? '@IsString({ each: true })' : '@IsString()');\n break;\n case 'Int':\n decorators.push(field.isList ? '@IsInt({ each: true })' : '@IsInt()');\n break;\n case 'Float':\n decorators.push(field.isList ? '@IsNumber({}, { each: true })' : '@IsNumber()');\n break;\n case 'Boolean':\n decorators.push(field.isList ? '@IsBoolean({ each: true })' : '@IsBoolean()');\n break;\n case 'DateTime':\n decorators.push(field.isList ? '@IsDateString({}, { each: true })' : '@IsDateString()');\n break;\n case 'Json':\n decorators.push(field.isList ? '@IsObject({ each: true })' : '@IsObject()');\n break;\n }\n if (field.kind === 'object') {\n decorators.push(field.isList ? '@ValidateNested({ each: true })' : '@ValidateNested()');\n decorators.push(`@Type(() => ${field.type})`);\n }\n field.annotations\n .filter((annotation) => CLASS_VALIDATOR_DECORATORS.includes(annotation.name) || CLASS_TRANSFORMER_DECORATORS.includes(annotation.name))\n .forEach((annotation) => {\n const params = annotation.params ? `(${annotation.params.join(', ')})` : '';\n decorators.push(`@${annotation.name}${params}`);\n });\n if (this.config.extraValidators.length) {\n field.annotations.forEach((annotation) => {\n const validator = this.config.extraValidators.find((d) => annotation.name === d.alias || (d.destruct ? d.destruct.includes(annotation.name) : false));\n if (validator) decorators.push(`@${annotation.name}(${annotation.params})`);\n });\n }\n }\n if (this.config.extraDecorators.length) {\n field.annotations.forEach((annotation) => {\n const decorator = this.config.extraDecorators.find((d) => annotation.name === d.alias || (d.destruct ? d.destruct.includes(annotation.name) : false));\n if (decorator) decorators.push(`@${annotation.name}(${annotation.params})`);\n });\n }\n const isReadOnly = field.annotations.some((a) => a.name === DTO_READ_ONLY);\n const defaultValue = getDefaultValue(field);\n const hasDefault = defaultValue !== undefined && this.config.outputType === 'class';\n let fieldType = getPropertyType(field);\n if (field.isList) fieldType += '[]';\n if (field.isNullable && !hasDefault) fieldType += ' | null';\n return `\\t${decorators.length ? decorators.join('\\n\\t') + '\\n' : ''}\\t${isReadOnly ? ' readonly' : ''} ${field.name}${!field.isRequired || (field.isNullable && !hasDefault) || hasDefault ? '?' : this.config.outputType === 'class' ? '!' : ''}: ${fieldType}${hasDefault ? ` = ${typeof defaultValue === 'string' && !defaultValue.startsWith('new') ? `'${defaultValue}'` : defaultValue}` : ''};\\n`;\n })\n .join('\\n');\n const className = `${this.classPrefix}${model.name}${this.classSuffix}`;\n const classDecorators: string[] = [];\n if (swaggerDocs) {\n const extraModelsAnnotation = model.annotations.find((a) => a.name === DTO_API_EXTRA_MODELS);\n if (extraModelsAnnotation?.params?.length) classDecorators.push(`@ApiExtraModels(${extraModelsAnnotation.params.join(', ')})`);\n }\n const decoratorsString = classDecorators.length ? `${classDecorators.join('\\n')}\\n` : '';\n return `${this.getImportsTemplate({ model, classValidator, swaggerDocs, outputPath: args.outputPath })}\\n\\n${decoratorsString}export ${this.config.outputType} ${className.charAt(0).toUpperCase() + className.slice(1).replace(/_(\\w)/g, (_, char) => char.toUpperCase())} {\\n${fields}}`;\n }\n\n /** Returns the absolute (or relative-to-`relativeFrom`) output path for `model`. */\n public getPath(model: Model, relativeFrom?: string): string {\n const modelName = this.getModelName(model.name);\n const fileName = `${this.filePrefix}${modelName}${this.fileSuffix}`;\n let outputPath = '';\n switch (this.config.outputStructure) {\n case 'nestjs':\n outputPath = `${this.config.output}/${modelName}/${fileName}.ts`;\n break;\n default:\n case 'flat':\n outputPath = `${this.config.output}/${fileName}.ts`;\n break;\n }\n return relativeFrom ? path.relative(path.dirname(relativeFrom), outputPath) : outputPath;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { ExtraImportConfig, GeneratorConfigFile, GeneratorOptions, ImportDescriptor, RawGeneratorConfig } from './types';\nimport { Utility } from './utility';\n\n/** Keys whose values support {@link ImportDescriptor} forms and need serialization. */\nconst EXTRA_IMPORT_KEYS = new Set(['extraDecorators', 'extraValidators', 'extraImports', 'extraGenerators']);\n\n/** File extensions handled directly by Node's `require` without a TS loader. */\nconst NATIVE_EXTS = new Set(['.js', '.cjs', '.mjs', '.json']);\n\n/** Extensions requiring a TypeScript-aware loader (jiti). */\nconst TS_EXTS = new Set(['.ts', '.cts', '.mts']);\n\n/**\n * Resolves the `configFile` option from `schema.prisma` to an absolute filesystem path.\n * The value is interpreted relative to the schema file when possible, falling back to\n * the current working directory so users running `prisma generate` from anywhere still work.\n */\nfunction resolveConfigFilePath(value: string, options: GeneratorOptions): string | null {\n if (path.isAbsolute(value)) return fs.existsSync(value) ? value : null;\n const candidates: string[] = [];\n const schemaPath = (options as { schemaPath?: string }).schemaPath;\n if (schemaPath) {\n // Prisma 7 multi-file schemas point `schemaPath` to a directory; single-file schemas\n // point to the `.prisma` file. Resolve `value` against the directory in both cases.\n let schemaDir = path.dirname(schemaPath);\n try {\n if (fs.statSync(schemaPath).isDirectory()) schemaDir = schemaPath;\n } catch {\n // schemaPath does not exist on disk; fall back to dirname semantics.\n }\n candidates.push(path.resolve(schemaDir, value));\n }\n candidates.push(path.resolve(process.cwd(), value));\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/** Dynamically imports a file using a TypeScript-aware loader. */\nasync function importWithJiti(filePath: string): Promise<unknown> {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(filePath, { interopDefault: true, moduleCache: false });\n return jiti.import(filePath, { default: true });\n}\n\n/** Extracts the configuration object from a module. Accepts both `export default` and named `config`. */\nfunction pickConfig(mod: unknown): GeneratorConfigFile | null {\n if (!mod || typeof mod !== 'object') return null;\n const candidate = (mod as { default?: unknown }).default ?? (mod as { config?: unknown }).config ?? mod;\n if (!candidate || typeof candidate !== 'object') return null;\n return candidate as GeneratorConfigFile;\n}\n\n/**\n * Result of {@link loadConfigFile}: the parsed configuration object and the absolute\n * directory of the file it came from. The directory is used downstream to resolve\n * relative `from` paths declared inside the config file.\n */\nexport type LoadedConfigFile = {\n config: GeneratorConfigFile;\n dir: string;\n file: string;\n};\n\n/**\n * Loads the configuration object referenced by `configFile`. Returns `null` when the\n * option is unset or the file fails to load; all error paths are logged and non-fatal\n * so misconfigurations never crash `prisma generate`.\n */\nexport async function loadConfigFile(options: GeneratorOptions): Promise<LoadedConfigFile | null> {\n const rawConfig = options.generator.config as RawGeneratorConfig;\n const configFile = typeof rawConfig.configFile === 'string' ? rawConfig.configFile : undefined;\n if (!configFile) return null;\n\n const resolved = resolveConfigFilePath(configFile, options);\n if (!resolved) {\n Utility.error(`configFile not found: ${configFile}`);\n return null;\n }\n const ext = path.extname(resolved).toLowerCase();\n try {\n let mod: unknown;\n if (TS_EXTS.has(ext)) {\n mod = await importWithJiti(resolved);\n } else if (NATIVE_EXTS.has(ext)) {\n delete require.cache[resolved];\n mod = require(resolved);\n } else {\n Utility.error(`Unsupported configFile extension: ${ext}`);\n return null;\n }\n const config = pickConfig(mod);\n if (!config) {\n Utility.error(`configFile ${resolved} did not export a configuration object`);\n return null;\n }\n Utility.log(`Loaded configFile from ${resolved}`);\n return { config, dir: path.dirname(resolved), file: resolved };\n } catch (error) {\n Utility.error(`Failed to load configFile ${resolved}:`, error);\n return null;\n }\n}\n\n/** Type guard: detects the structured form `{ from, names?, default?, namespace? }`. */\nfunction isImportDescriptor(value: unknown): value is ImportDescriptor {\n return typeof value === 'object' && value !== null && typeof (value as ImportDescriptor).from === 'string';\n}\n\n/** Detects relative `from` paths that should be resolved against the config file directory. */\nfunction isRelativePath(value: string): boolean {\n return value.startsWith('./') || value.startsWith('../');\n}\n\n/**\n * Resolves a `from` value: relative paths (`./x`, `../x`) become absolute, anchored at the\n * config file directory; everything else (bare specifiers, aliases, absolute paths) is left untouched.\n */\nfunction resolveFrom(from: string, configFileDir?: string): string {\n if (!configFileDir || !isRelativePath(from)) return from;\n return path.resolve(configFileDir, from);\n}\n\n/**\n * Rewrites relative paths embedded in a raw inline-syntax string so they become\n * absolute, anchored at the config file directory. Each `|`-separated group is parsed\n * as `<names>:<path>`; only paths starting with `./` or `../` are rewritten.\n */\nfunction rewriteRelativeInline(statement: string, configFileDir?: string): string {\n if (!configFileDir) return statement;\n return statement\n .split('|')\n .map((group) => {\n const idx = group.lastIndexOf(':');\n if (idx === -1) return group;\n const fromPath = group.substring(idx + 1).trim();\n if (!isRelativePath(fromPath)) return group;\n return `${group.substring(0, idx)}:${path.resolve(configFileDir, fromPath)}`;\n })\n .join('|');\n}\n\n/**\n * Serializes an {@link ImportDescriptor} into the inline `Name:path` syntax that\n * {@link Utility.parseImports} consumes downstream. Default + named combinations become\n * two `|`-joined groups (`default as Foo:path|Bar,Baz:path`); rename aliases collapse to\n * the local name since the generator only uses local names for annotation matching and\n * destruct emission. When `configFileDir` is provided, relative paths are resolved\n * against it so the resulting absolute path can later be rewritten per output file.\n */\nexport function descriptorToImportStatement(descriptor: ImportDescriptor, configFileDir?: string): string {\n const fromPath = resolveFrom(descriptor.from, configFileDir);\n const groups: string[] = [];\n if (descriptor.default) groups.push(`default as ${descriptor.default}:${fromPath}`);\n if (descriptor.namespace) groups.push(`* as ${descriptor.namespace}:${fromPath}`);\n if (descriptor.names && descriptor.names.length > 0) {\n const named = descriptor.names\n .map((entry) => (typeof entry === 'string' ? entry : entry.as))\n .join(',');\n groups.push(`${named}:${fromPath}`);\n }\n if (groups.length === 0) {\n Utility.warn(`Empty ImportDescriptor for '${descriptor.from}' — no names/default/namespace provided.`);\n return '';\n }\n return groups.join('|');\n}\n\n/** Coerces any accepted `extra*` form into the string/string[] shape consumed downstream. */\nfunction serializeExtraImport(value: ExtraImportConfig | undefined, configFileDir?: string): string | string[] | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return rewriteRelativeInline(value, configFileDir);\n if (isImportDescriptor(value)) return descriptorToImportStatement(value, configFileDir);\n if (Array.isArray(value)) {\n const out: string[] = [];\n for (const entry of value) {\n if (typeof entry === 'string') out.push(rewriteRelativeInline(entry, configFileDir));\n else if (isImportDescriptor(entry)) out.push(descriptorToImportStatement(entry, configFileDir));\n }\n return out;\n }\n return undefined;\n}\n\n/**\n * Merges a {@link GeneratorConfigFile} on top of the raw schema config. Values from the\n * config file override schema values for the keys it declares; everything else passes\n * through untouched. {@link ImportDescriptor} values are serialized into the inline\n * `Name:path` syntax; arrays and booleans are coerced into the string-shaped values\n * that the downstream pipeline expects.\n *\n * When `configFileDir` is provided, relative paths in descriptors and inline strings\n * are anchored to that directory and emitted as absolute paths. The generator later\n * rewrites them as relative to each output file at emit time.\n */\nexport function applyConfigFile(rawConfig: RawGeneratorConfig, configFile: GeneratorConfigFile | null, configFileDir?: string): RawGeneratorConfig {\n if (!configFile) return rawConfig;\n const merged: RawGeneratorConfig = { ...rawConfig };\n const stringify = (value: unknown): string | string[] | undefined => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === 'string') return value;\n if (typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return value.map(String);\n return String(value);\n };\n for (const [key, value] of Object.entries(configFile)) {\n let coerced: string | string[] | undefined;\n if (EXTRA_IMPORT_KEYS.has(key)) coerced = serializeExtraImport(value as ExtraImportConfig | undefined, configFileDir);\n else if (key === 'extraScalars' && value && typeof value === 'object') coerced = serializeExtraScalars(value as Record<string, { from?: string }>, configFileDir);\n else coerced = stringify(value);\n if (coerced !== undefined) merged[key] = coerced;\n }\n return merged;\n}\n\n/**\n * JSON-serializes the `extraScalars` map, resolving any relative `from` path against\n * the config file directory. The parser on the receiving side ({@link Utility.parseExtraScalars})\n * accepts both raw JSON and pre-parsed objects, so this stays interchangeable with the\n * inline `extraScalars` form (currently unsupported in `schema.prisma`).\n */\nfunction serializeExtraScalars(value: Record<string, { from?: string }>, configFileDir?: string): string {\n const out: Record<string, unknown> = {};\n for (const [scalar, override] of Object.entries(value)) {\n if (!override || typeof override !== 'object') continue;\n out[scalar] = { ...override, from: override.from ? resolveFrom(override.from, configFileDir) : undefined };\n }\n return JSON.stringify(out);\n}\n\n/**\n * Builds an {@link ImportDescriptor} for named exports of a module. The `symbols` argument\n * is expected to use ES shorthand property syntax (`{ IsBool, IsUnique }`); only the keys\n * are read, but the IDE will still flag misspellings and propagate refactor renames.\n *\n * @example\n * ```ts\n * import { IsBool, IsUnique } from 'src/common/validators';\n * import { fromModule } from '@tommasomeli/prisma-generator-nestjs-dto';\n *\n * fromModule('src/common/validators', { IsBool, IsUnique });\n * // → { from: 'src/common/validators', names: ['IsBool', 'IsUnique'] }\n * ```\n */\nexport function fromModule(from: string, symbols: Record<string, unknown>): ImportDescriptor {\n return { from, names: Object.keys(symbols) };\n}\n\n/** Extracts the module specifier from a `() => import('...')` closure source. */\nconst MODULE_PATH_REGEX = /(?:\\bimport|\\brequire|\\bjitiImport|\\b__webpack_require__|\\b__nccwpck_require__|\\b_?_importDefault)\\s*\\(\\s*['\"`]([^'\"`]+)['\"`]\\s*\\)/;\n\nfunction extractModulePath(importer: () => unknown): string {\n const source = importer.toString();\n const match = MODULE_PATH_REGEX.exec(source);\n if (match && match[1]) return match[1];\n const fallback = source.match(/['\"`]([^'\"`]+)['\"`]/);\n if (fallback && fallback[1]) return fallback[1];\n throw new Error(`Could not extract module path from importer function. Source: ${source.slice(0, 200)}`);\n}\n\n/** Module shape inferred from a `() => import('...')` closure type. */\nexport type ModuleOf<F> = F extends () => Promise<infer M> ? M : never;\n\n/** Internal: resolves the source argument to a module specifier string. */\nfunction resolveSource(source: string | (() => unknown)): string {\n return typeof source === 'function' ? extractModulePath(source) : source;\n}\n\n/** Internal: normalizes a `string | string[]` value into an array. */\nfunction toArray<T extends string>(value: T | readonly T[]): T[] {\n return Array.isArray(value) ? [...value] : [value as T];\n}\n\n/**\n * Descriptor builder for named imports. Accepts two forms:\n *\n * 1. **Type-safe** — pass a `() => import('path')` callback. TypeScript infers the module\n * type from the dynamic import, validates `names` against its keys, and the callback\n * is never invoked at runtime (no side effects). The module path is recovered from\n * the closure source.\n * 2. **Concise** — pass the module specifier as a plain string. `names` are not validated\n * by TypeScript, but the result is identical at runtime.\n *\n * @example\n * ```ts\n * from(() => import('src/common/validators'), ['IsBool', 'IsUnique']); // type-safe\n * from(() => import('src/common/validators'), 'IsBool'); // type-safe single\n * from('class-validator', ['IsEmail', 'IsString']); // string form\n * ```\n */\nexport function from(modulePath: string, names: string | readonly string[]): ImportDescriptor;\nexport function from<F extends () => Promise<unknown>>(\n importer: F,\n names: (keyof ModuleOf<F> & string) | readonly (keyof ModuleOf<F> & string)[]\n): ImportDescriptor;\nexport function from(source: string | (() => unknown), names: string | readonly string[]): ImportDescriptor {\n return { from: resolveSource(source), names: toArray(names) };\n}\n\n/**\n * Descriptor builder for `import * as alias from 'path'`. Accepts the same dual form as\n * {@link from}: a `() => import('path')` callback (path validated by TS) or a plain string.\n *\n * @example\n * ```ts\n * fromNamespace(() => import('src/common/constants'), 'CONSTANTS');\n * fromNamespace('lodash', 'Lodash');\n * ```\n */\nexport function fromNamespace(modulePath: string, alias: string): ImportDescriptor;\nexport function fromNamespace<F extends () => Promise<unknown>>(importer: F, alias: string): ImportDescriptor;\nexport function fromNamespace(source: string | (() => unknown), alias: string): ImportDescriptor {\n return { from: resolveSource(source), namespace: alias };\n}\n\n/**\n * Descriptor builder for `import Default[, { named }] from 'path'`. Accepts the dual\n * form (closure or string) and an optional `names` payload validated against the module\n * type when the closure form is used.\n *\n * @example\n * ```ts\n * fromDefault(() => import('lodash'), 'Lodash');\n * fromDefault(() => import('src/lib'), 'Lib', ['helperA', 'helperB']);\n * fromDefault('lodash', 'Lodash');\n * ```\n */\nexport function fromDefault(modulePath: string, defaultName: string, names?: string | readonly string[]): ImportDescriptor;\nexport function fromDefault<F extends () => Promise<{ default: unknown }>>(\n importer: F,\n defaultName: string,\n names?: (keyof ModuleOf<F> & string) | readonly (keyof ModuleOf<F> & string)[]\n): ImportDescriptor;\nexport function fromDefault(\n source: string | (() => unknown),\n defaultName: string,\n names?: string | readonly string[]\n): ImportDescriptor {\n return {\n from: resolveSource(source),\n default: defaultName,\n names: names === undefined ? undefined : toArray(names)\n };\n}\n\n/** Convenience for `import * as Alias from 'path'`. */\nexport function namespaceFrom(from: string, namespaceAlias: string): ImportDescriptor {\n return { from, namespace: namespaceAlias };\n}\n\n/** Convenience for `import Default from 'path'`, optionally with named imports. */\nexport function defaultFrom(from: string, defaultName: string, namedSymbols?: Record<string, unknown>): ImportDescriptor {\n return { from, default: defaultName, names: namedSymbols ? Object.keys(namedSymbols) : undefined };\n}\n","import { isEntityHidden } from '../annotations';\nimport { BaseGenerator } from '../base-generator';\nimport { Field, File, Model } from '../types';\n\nexport default class EntityDtoGenerator extends BaseGenerator {\n filePrefix = '';\n fileSuffix = '.entity';\n classPrefix = '';\n classSuffix = '';\n\n async generate(): Promise<File[]> {\n return this.models.map((model) => {\n const filteredFields = model.fields.filter((field: Field) => !isEntityHidden(field));\n const processedModel: Model = { ...model, fields: filteredFields as Field[] };\n const outputPath = this.getPath(model);\n return {\n path: outputPath,\n content: this.getTemplate({ model: processedModel, classValidator: false, outputPath })\n };\n });\n }\n}\n","import { DTO_CREATE_HIDDEN, DTO_CREATE_OPTIONAL, DTO_CREATE_REQUIRED, DTO_CREATE_VALIDATE_IF, DTO_CREATED_AT, DTO_HIDDEN } from '../annotations';\nimport { BaseGenerator } from '../base-generator';\nimport { Field, File } from '../types';\n\nexport default class CreateDtoGenerator extends BaseGenerator {\n filePrefix = 'create-';\n fileSuffix = '.dto';\n classPrefix = 'Create';\n classSuffix = 'Dto';\n\n async generate(): Promise<File[]> {\n return this.models.map((model) => {\n const filteredFields = model.fields.filter((field: Field) => {\n if (field.annotations.some((a) => a.name === DTO_HIDDEN)) return false;\n if (field.annotations.some((a) => a.name === DTO_CREATE_HIDDEN)) return false;\n if (field.annotations.some((a) => a.name === DTO_CREATED_AT)) return false;\n const isRelationField = model.fields.some((f) => f.relationFromFields?.includes?.(field.name));\n if (isRelationField) return false;\n if (field.isId) return false;\n if (field.isUpdatedAt) return false;\n return true;\n });\n const processedFields = filteredFields.map((f: Field) => {\n const field = { ...f, annotations: [...f.annotations] };\n if (field.annotations.some((a) => a.name === DTO_CREATE_OPTIONAL)) {\n field.isRequired = false;\n field.isNullable = true;\n }\n if (field.annotations.some((a) => a.name === DTO_CREATE_REQUIRED)) field.isRequired = true;\n const validateIfAnnotation = field.annotations.find((a) => a.name === DTO_CREATE_VALIDATE_IF);\n if (validateIfAnnotation && validateIfAnnotation.params && validateIfAnnotation.params.length > 0) {\n const validateIfParams = validateIfAnnotation.params.join(', ');\n field.annotations.push({ name: 'ValidateIf', params: [validateIfParams] });\n }\n return field;\n });\n const processedModel = { ...model, fields: processedFields };\n const outputPath = this.getPath(model);\n return {\n path: outputPath,\n content: this.getTemplate({ model: processedModel, outputPath })\n };\n });\n }\n}\n","import { DTO_CREATED_AT, DTO_HIDDEN, DTO_UPDATE_HIDDEN, DTO_UPDATE_OPTIONAL, DTO_UPDATE_REQUIRED, DTO_UPDATE_VALIDATE_IF } from '../annotations';\nimport { BaseGenerator } from '../base-generator';\nimport { Field, File } from '../types';\n\nexport default class UpdateDtoGenerator extends BaseGenerator {\n filePrefix = 'update-';\n fileSuffix = '.dto';\n classPrefix = 'Update';\n classSuffix = 'Dto';\n\n async generate(): Promise<File[]> {\n return this.models.map((model) => {\n const filteredFields = model.fields.filter((field: Field) => {\n if (field.annotations.some((a) => a.name === DTO_HIDDEN)) return false;\n if (field.annotations.some((a) => a.name === DTO_UPDATE_HIDDEN)) return false;\n if (field.annotations.some((a) => a.name === DTO_CREATED_AT)) return false;\n const isRelationField = model.fields.some((f) => f.relationFromFields?.includes?.(field.name));\n if (isRelationField) return false;\n if (field.isId) return true;\n if (field.isUpdatedAt) return false;\n return true;\n });\n const processedFields = filteredFields.map((f: Field) => {\n const field = { ...f, annotations: [...f.annotations] };\n field.isRequired = field.isId ? true : false;\n if (field.annotations.some((a) => a.name === DTO_UPDATE_OPTIONAL)) {\n field.isRequired = false;\n field.isNullable = true;\n }\n if (field.annotations.some((a) => a.name === DTO_UPDATE_REQUIRED)) field.isRequired = true;\n const validateIfAnnotation = field.annotations.find((a) => a.name === DTO_UPDATE_VALIDATE_IF);\n if (validateIfAnnotation && validateIfAnnotation.params && validateIfAnnotation.params.length > 0) {\n const validateIfParams = validateIfAnnotation.params.join(', ');\n field.annotations.push({ name: 'ValidateIf', params: [validateIfParams] });\n }\n return field;\n });\n const processedModel = { ...model, fields: processedFields };\n const outputPath = this.getPath(model);\n return {\n path: outputPath,\n content: this.getTemplate({ model: processedModel, outputPath })\n };\n });\n }\n}\n","import { isEntityHidden } from '../annotations';\nimport { BaseGenerator } from '../base-generator';\nimport { Field, File } from '../types';\n\n/**\n * Emits runtime-side artifacts that the Prisma DMMF does not surface directly:\n *\n * - `manifest.ts`: per-model `primaryKey`, `entityFields` (mirrors `isEntityHidden`)\n * and `relations.{type,isList}`. Useful for select builders, audit logs, etc.\n * - `model-entity-map.ts`: a type-only map `Prisma.ModelName -> generated Entity class`,\n * handy for typing dynamic `select` paths.\n *\n * Opt-in via the `emitManifest` config option (defaults to `false`).\n */\nexport default class ManifestGenerator extends BaseGenerator {\n filePrefix = '';\n fileSuffix = '';\n classPrefix = '';\n classSuffix = '';\n\n async generate(): Promise<File[]> {\n const map: Record<string, { primaryKey: string; entityFields: string[]; relations: Record<string, { type: string; isList: boolean }> }> = {};\n for (const model of this.models) {\n const relations: Record<string, { type: string; isList: boolean }> = {};\n for (const f of model.fields as Field[]) {\n if (f.kind !== 'object') continue;\n relations[f.name] = { type: f.type, isList: Boolean(f.isList) };\n }\n map[model.name] = {\n primaryKey: model.fields.find((f: Field) => f.isId)?.name || 'id',\n entityFields: model.fields.filter((f: Field) => !isEntityHidden(f)).map((f: Field) => f.name),\n relations\n };\n }\n const manifestContent = `import type { Prisma } from '@prisma/client';\n\nexport interface RelationDescriptor {\n type: string;\n isList: boolean;\n}\n\nexport interface ModelManifest {\n primaryKey: string;\n entityFields: string[];\n relations: Record<string, RelationDescriptor>;\n}\n\nexport const PrismaManifest: Record<Prisma.ModelName, ModelManifest> = ${JSON.stringify(map, null, 4)};\n`;\n\n const modelNames = this.models.map((m) => m.name);\n const isFlat = this.config.outputStructure === 'flat';\n const importLines = modelNames\n .map((name) => {\n const fileName = this.getModelName(name);\n const importPath = isFlat ? `./${fileName}.entity` : `./${fileName}/${fileName}.entity`;\n return `import type { ${name} as ${name}Entity } from '${importPath}';`;\n })\n .join('\\n');\n const mapLines = modelNames.map((name) => ` ${name}: ${name}Entity;`).join('\\n');\n const entityMapContent = `${importLines}\n\nexport interface ModelEntityMap {\n${mapLines}\n}\n`;\n return [\n { path: `${this.config.output}/manifest.ts`, content: manifestContent },\n { path: `${this.config.output}/model-entity-map.ts`, content: entityMapContent }\n ];\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport prettier from 'prettier';\nimport { BaseGenerator } from './base-generator';\nimport { applyConfigFile, loadConfigFile } from './config-loader';\nimport { CreateDtoGenerator, EntityGenerator, ManifestGenerator, UpdateDtoGenerator } from './generators';\nimport { GeneratorOptions, RawGeneratorConfig } from './types';\nimport { Utility } from './utility';\n\n/**\n * Built-in generators that always participate in the pipeline. The iteration order\n * matters: it determines the order of `export *` statements emitted in per-model\n * `index.ts` barrels.\n */\nconst BuiltInGenerators = { CreateDtoGenerator, EntityGenerator, UpdateDtoGenerator };\n\n/** Constructor signature shared by every concrete generator extending `BaseGenerator`. */\ntype GeneratorCtor = new (options: GeneratorOptions) => BaseGenerator;\n\n/**\n * Resolves Prettier config once for the whole run. Returns `null` if Prettier\n * is disabled or unavailable so the caller can skip formatting cleanly.\n */\nasync function resolvePrettierConfig(enabled: boolean): Promise<prettier.Options | null> {\n if (!enabled) return null;\n try {\n const prettierConfigFile = await prettier.resolveConfigFile();\n let config: prettier.Options = {};\n if (!prettierConfigFile) {\n Utility.log('Stylizing output DTOs with the default Prettier config.');\n } else {\n Utility.log(`Stylizing output DTOs with found Prettier config. (${prettierConfigFile})`);\n const resolved = await prettier.resolveConfig(prettierConfigFile, { config: prettierConfigFile });\n if (resolved) config = resolved;\n }\n config.parser = 'typescript';\n return config;\n } catch (error) {\n Utility.warn('Failed to resolve Prettier config:', error);\n return null;\n }\n}\n\n/** TypeScript-aware extensions: handled via jiti instead of plain `require`. */\nconst TS_PLUGIN_EXTENSIONS = new Set(['.ts', '.cts', '.mts', '.tsx']);\n\n/**\n * Loads a plugin module from disk. Routes `.ts` / `.cts` / `.mts` / `.tsx` paths\n * through [`jiti`](https://github.com/unjs/jiti) so users do not have to precompile,\n * and falls back to the native `require` for everything else.\n */\nasync function importPluginModule(absolutePath: string): Promise<Record<string, unknown>> {\n const ext = path.extname(absolutePath).toLowerCase();\n if (TS_PLUGIN_EXTENSIONS.has(ext)) {\n const { createJiti } = await import('jiti');\n const jiti = createJiti(absolutePath, { interopDefault: true, moduleCache: false });\n const mod = (await jiti.import(absolutePath)) as Record<string, unknown> | { default?: Record<string, unknown> };\n if (mod && typeof mod === 'object' && 'default' in mod && mod.default && typeof mod.default === 'object') {\n return { ...(mod.default as Record<string, unknown>), ...(mod as Record<string, unknown>) };\n }\n return mod as Record<string, unknown>;\n }\n return require(absolutePath);\n}\n\n/** Dynamically loads `extraGenerators` provided via the `extraGenerators` config option. */\nasync function loadExtraGenerators(options: GeneratorOptions): Promise<Record<string, GeneratorCtor>> {\n const extra: Record<string, GeneratorCtor> = {};\n const raw = (options.generator.config as RawGeneratorConfig).extraGenerators;\n if (!raw) return extra;\n try {\n const imports = Utility.parseImports(raw);\n for (const importInfo of imports) {\n try {\n const modulePath = path.isAbsolute(importInfo.from) ? importInfo.from : path.resolve(process.cwd(), importInfo.from);\n const importedModule = await importPluginModule(modulePath);\n if (importInfo.destruct && importInfo.destruct.length > 0) {\n for (const generatorName of importInfo.destruct) {\n if (importedModule[generatorName]) {\n extra[generatorName] = importedModule[generatorName] as GeneratorCtor;\n Utility.log(`Loaded generator ${generatorName} from ${importInfo.from}`);\n } else {\n Utility.warn(`Generator ${generatorName} not found in ${importInfo.from}`);\n }\n }\n } else if (importInfo.alias) {\n extra[importInfo.alias] = importedModule as unknown as GeneratorCtor;\n Utility.log(`Loaded generator ${importInfo.alias} from ${importInfo.from}`);\n } else {\n Object.entries(importedModule).forEach(([name, exported]) => {\n extra[name] = exported as GeneratorCtor;\n Utility.log(`Loaded generator ${name} from ${importInfo.from}`);\n });\n }\n } catch (error) {\n Utility.error(`Failed to load generators from ${importInfo.from}:`, error);\n }\n }\n } catch (error) {\n Utility.error(`Failed to parse extraGenerators:`, error);\n }\n return extra;\n}\n\n/**\n * Instantiates a registry of generator constructors, skipping invalid entries with a warning.\n * Duck-typing is intentional: plugins loaded from a separately-bundled copy of this package\n * fail an `instanceof BaseGenerator` check even though they are structurally compatible.\n */\nfunction instantiateGenerators(registry: Record<string, unknown>, options: GeneratorOptions): BaseGenerator[] {\n return Object.entries(registry)\n .map(([name, Ctor]) => {\n try {\n if (typeof Ctor !== 'function') {\n Utility.warn(`Skipping ${name}: not a constructor function`);\n return null;\n }\n const instance = new (Ctor as GeneratorCtor)(options);\n if (typeof (instance as BaseGenerator).generate === 'function' && typeof (instance as BaseGenerator).getPath === 'function') return instance as BaseGenerator;\n Utility.warn(`Skipping ${name}: not a BaseGenerator-shaped object (missing generate/getPath)`);\n } catch (error) {\n Utility.error(`Error initializing generator ${name}:`, error);\n }\n return null;\n })\n .filter((instance): instance is BaseGenerator => instance !== null);\n}\n\n/** Optionally formats `content` with Prettier; falls back to the original content on failure. */\nasync function maybeFormat(content: string, config: prettier.Options | null, label: string): Promise<string> {\n if (!config) return content;\n try {\n return await prettier.format(content, config);\n } catch (error) {\n Utility.warn(`Failed to format ${label} with Prettier:`, error);\n return content;\n }\n}\n\n/**\n * Entry point used by `@prisma/generator-helper`. Executes every registered\n * generator (built-in + user-provided), writes the resulting files to disk\n * and, when enabled, emits `index.ts` barrels for re-exports.\n */\nexport async function generate(options: GeneratorOptions): Promise<void> {\n const outputDir = options.generator.output?.value;\n if (!outputDir) {\n Utility.error('Output directory is not set. Add `output = \"...\"` to the generator block in schema.prisma.');\n return;\n }\n\n const externalConfig = await loadConfigFile(options);\n const mergedConfig = applyConfigFile(options.generator.config as RawGeneratorConfig, externalConfig?.config ?? null, externalConfig?.dir);\n (options.generator as { config: RawGeneratorConfig }).config = mergedConfig;\n const rawConfig = mergedConfig;\n\n const extraGenerators = await loadExtraGenerators(options);\n const allGenerators = { ...BuiltInGenerators, ...extraGenerators };\n const generators = instantiateGenerators(allGenerators, options);\n\n // Make every generator instance share the same `models` reference so that\n // mutations done by one plugin's `beforeAll` are visible to every later\n // `beforeAll` and to every `generate()` call.\n const sharedModels = generators[0]?.models ?? [];\n for (const generator of generators) generator.models = sharedModels;\n\n const applyPrettier = Utility.parseBoolean(typeof rawConfig.prettier === 'string' ? rawConfig.prettier : undefined);\n const prettierConfig = await resolvePrettierConfig(applyPrettier);\n const outputStructure = typeof rawConfig.outputStructure === 'string' ? rawConfig.outputStructure : 'nestjs';\n\n for (const generator of generators) {\n try {\n await generator.beforeAll(sharedModels);\n } catch (error) {\n Utility.error(`Error in ${generator.constructor.name}#beforeAll:`, error);\n }\n }\n\n const exports: Record<string, string> = {};\n const emittedFiles: { path: string; content: string }[] = [];\n const persistFile = async (file: { path: string; content: string }, label: string): Promise<void> => {\n const content = await maybeFormat(file.content, prettierConfig, label);\n fs.mkdirSync(path.dirname(file.path), { recursive: true });\n fs.writeFileSync(file.path, content);\n const exportPath = outputStructure === 'flat' ? file.path : path.dirname(file.path);\n const exportLine = `export * from './${path.basename(file.path).replace('.ts', '')}';`;\n exports[exportPath] = exports[exportPath] ? `${exports[exportPath]}\\n${exportLine}` : exportLine;\n emittedFiles.push(file);\n };\n\n for (const generator of generators) {\n try {\n Utility.log(`Executing generator: ${generator.constructor.name}`);\n const files = await generator.generate();\n for (const file of files) await persistFile(file, path.basename(file.path));\n } catch (error) {\n Utility.error(`Error while executing ${generator.constructor.name}:`, error);\n }\n }\n\n for (const generator of generators) {\n try {\n const extra = await generator.afterAll(emittedFiles);\n if (Array.isArray(extra)) for (const file of extra) await persistFile(file, path.basename(file.path));\n } catch (error) {\n Utility.error(`Error in ${generator.constructor.name}#afterAll:`, error);\n }\n }\n\n if (Utility.parseBoolean(typeof rawConfig.reExport === 'string' ? rawConfig.reExport : undefined)) {\n if (outputStructure !== 'flat') {\n for (const [exportPath, content] of Object.entries(exports)) {\n const indexContent = await maybeFormat(content, prettierConfig, 'index file');\n fs.writeFileSync(`${exportPath}/index.ts`, indexContent);\n }\n }\n const mainIndexContent = await maybeFormat(\n Object.keys(exports)\n .map((exportPath) => `export * from './${path.basename(exportPath).replace('.ts', '')}';`)\n .join('\\n'),\n prettierConfig,\n 'main index file'\n );\n fs.writeFileSync(`${outputDir}/index.ts`, mainIndexContent);\n }\n\n if (Utility.parseBoolean(typeof rawConfig.emitManifest === 'string' ? rawConfig.emitManifest : undefined)) {\n const manifestFiles = await new ManifestGenerator(options).generate();\n for (const file of manifestFiles) {\n const content = await maybeFormat(file.content, prettierConfig, path.basename(file.path));\n fs.writeFileSync(file.path, content);\n }\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@tommasomeli/prisma-generator-nestjs-dto",
3
+ "version": "0.1.3",
4
+ "description": "A pluggable Prisma generator that produces NestJS DTOs (Create/Update/Entity), Swagger metadata and class-validator decorators. Bring your own annotations and custom sub-generators.",
5
+ "keywords": [
6
+ "prisma",
7
+ "prisma-generator",
8
+ "nestjs",
9
+ "dto",
10
+ "swagger",
11
+ "openapi",
12
+ "class-validator",
13
+ "class-transformer",
14
+ "code-generation",
15
+ "typescript"
16
+ ],
17
+ "license": "MIT",
18
+ "author": "tommasomeli",
19
+ "homepage": "https://github.com/tommasomeli/prisma-generator-nestjs-dto#readme",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/tommasomeli/prisma-generator-nestjs-dto.git"
23
+ },
24
+ "bugs": {
25
+ "url": "https://github.com/tommasomeli/prisma-generator-nestjs-dto/issues"
26
+ },
27
+ "main": "./dist/index.cjs",
28
+ "module": "./dist/index.mjs",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.mjs",
34
+ "require": "./dist/index.cjs"
35
+ }
36
+ },
37
+ "bin": {
38
+ "prisma-generator-nestjs-dto": "./dist/bin.cjs"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md",
43
+ "LICENSE",
44
+ "CHANGELOG.md"
45
+ ],
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "dependencies": {
53
+ "chalk": "^4.1.2",
54
+ "jiti": "^2"
55
+ },
56
+ "peerDependencies": {
57
+ "@prisma/generator-helper": ">=5",
58
+ "prettier": ">=3"
59
+ },
60
+ "peerDependenciesMeta": {
61
+ "prettier": {
62
+ "optional": true
63
+ }
64
+ },
65
+ "devDependencies": {
66
+ "@prisma/generator-helper": "^7.8.0",
67
+ "@types/node": "^22.13.1",
68
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
69
+ "@typescript-eslint/parser": "^6.21.0",
70
+ "@vitest/coverage-v8": "^2",
71
+ "eslint": "^8.57.0",
72
+ "prettier": "^3.4.2",
73
+ "prisma": "^7.8.0",
74
+ "tsup": "^8.3.5",
75
+ "typescript": "^5.7.3",
76
+ "vitest": "^2.1.8"
77
+ },
78
+ "scripts": {
79
+ "build": "tsup",
80
+ "dev": "tsup --watch",
81
+ "test": "vitest run",
82
+ "test:watch": "vitest",
83
+ "test:coverage": "vitest run --coverage",
84
+ "typecheck": "tsc --noEmit",
85
+ "lint": "eslint . --ext .ts",
86
+ "lint:fix": "eslint . --ext .ts --fix",
87
+ "format": "prettier --write .",
88
+ "pack-package": "npm pack"
89
+ }
90
+ }