UNPKG

@weverson_na/prisma-generator-nestjs-dto

Version:

Advanced Prisma Generator with Smart Merge v2: Creates DTO and Entity classes with AST-based preservation, intelligent import management, and modular architecture for NestJS

111 lines (110 loc) 4.73 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.run = exports.NestJsDtoGenerator = void 0; const internals_1 = require("@prisma/internals"); const case_1 = require("case"); const node_path_1 = __importDefault(require("node:path")); const annotations_1 = require("./annotations"); const compute_model_params_1 = require("./compute-model-params"); const field_classifiers_1 = require("./field-classifiers"); const generate_connect_dto_1 = require("./generate-connect-dto"); const generate_create_dto_1 = require("./generate-create-dto"); const generate_entity_1 = require("./generate-entity"); const generate_update_dto_1 = require("./generate-update-dto"); const template_helpers_1 = require("./template-helpers"); class NestJsDtoGenerator { constructor(params) { this.params = params; const { fileNamingStyle = 'camel', ...preAndSuffixes } = params; const transformers = { camel: case_1.camel, kebab: case_1.kebab, pascal: case_1.pascal, snake: case_1.snake, }; this.templateHelpers = new template_helpers_1.TemplateHelpers({ transformFileNameCase: transformers[fileNamingStyle], transformClassNameCase: case_1.pascal, ...preAndSuffixes, }); } run() { const models = this.getFilteredModels(); return models.flatMap((model) => this.generateFilesForModel(model, models)); } getFilteredModels() { const { dmmf, output, outputToNestJsResourceStructure } = this.params; return dmmf.datamodel.models .filter((m) => !(0, field_classifiers_1.isAnnotatedWith)(m, annotations_1.DTO_IGNORE_MODEL)) .map((model) => ({ ...model, output: this.buildOutputPaths(model.name, output, outputToNestJsResourceStructure), })); } generateFilesForModel(model, allModels) { internals_1.logger.info(`Processing Model ${model.name}`); const { addExposePropertyDecorator, exportRelationModifierClasses } = this.params; const modelParams = (0, compute_model_params_1.computeModelParams)({ model, allModels, templateHelpers: this.templateHelpers, addExposePropertyDecorator, }); const configs = [ { key: 'connect', dir: 'dto', fn: generate_connect_dto_1.generateConnectDto, fileName: this.templateHelpers.connectDtoFilename.bind(this.templateHelpers), }, { key: 'create', dir: 'dto', fn: generate_create_dto_1.generateCreateDto, fileName: this.templateHelpers.createDtoFilename.bind(this.templateHelpers), extra: { exportRelationModifierClasses, addExposePropertyDecorator }, }, { key: 'update', dir: 'dto', fn: generate_update_dto_1.generateUpdateDto, fileName: this.templateHelpers.updateDtoFilename.bind(this.templateHelpers), extra: { exportRelationModifierClasses, addExposePropertyDecorator }, }, { key: 'entity', dir: 'entity', fn: generate_entity_1.generateEntity, fileName: this.templateHelpers.entityFilename.bind(this.templateHelpers), }, ]; return configs .map((config) => { const { key, dir, fn, fileName, extra } = config; const content = fn({ ...modelParams[key], templateHelpers: this.templateHelpers, ...(extra !== null && extra !== void 0 ? extra : {}), }); return { fileName: node_path_1.default.join(model.output[dir], fileName(model.name, true)), content, }; }) .filter((file) => file !== null); } buildOutputPaths(modelName, baseOutput, nested) { const segment = this.templateHelpers.transformFileNameCase(modelName); const dtoDir = nested ? node_path_1.default.join(baseOutput, segment, 'dto') : baseOutput; const entityDir = nested ? node_path_1.default.join(baseOutput, segment, 'entities') : baseOutput; return { dto: dtoDir, entity: entityDir }; } } exports.NestJsDtoGenerator = NestJsDtoGenerator; const run = (params) => new NestJsDtoGenerator(params).run(); exports.run = run;