@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
JavaScript
;
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;