@brakebein/prisma-generator-nestjs-dto
Version:
Generates DTO and Entity classes from Prisma Schema for NestJS
144 lines (143 loc) • 7.64 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeEntityParams = void 0;
const node_path_1 = __importDefault(require("node:path"));
const slash_1 = __importDefault(require("slash"));
const annotations_1 = require("../annotations");
const field_classifiers_1 = require("../field-classifiers");
const helpers_1 = require("../helpers");
const api_decorator_1 = require("../api-decorator");
const computeEntityParams = ({ model, allModels, templateHelpers, }) => {
const imports = [];
const apiExtraModels = [];
const relationScalarFields = (0, helpers_1.getRelationScalars)(model.fields);
const relationScalarFieldNames = Object.keys(relationScalarFields);
const fields = model.fields.reduce((result, field) => {
const { name } = field;
const overrides = {
isRequired: true,
isNullable: !field.isRequired,
};
const decorators = {};
if ((0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_ENTITY_HIDDEN))
return result;
if ((0, field_classifiers_1.isType)(field)) {
if (field.type !== model.name &&
!(((0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_OVERRIDE_TYPE) ||
(0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_CAST_TYPE)) &&
(0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_OVERRIDE_API_PROPERTY_TYPE))) {
const modelToImportFrom = allModels.find(({ name }) => name === field.type);
if (!modelToImportFrom)
throw new Error(`related type '${field.type}' for '${model.name}.${field.name}' not found`);
const importName = templateHelpers.plainDtoName(field.type);
const importFrom = (0, slash_1.default)(`${(0, helpers_1.getRelativePath)(model.output.entity, modelToImportFrom.output.dto)}${node_path_1.default.sep}${templateHelpers.plainDtoFilename(field.type)}`);
imports.push({
destruct: [
importName,
...(templateHelpers.config.wrapRelationsAsType
? [`type ${importName} as ${importName}AsType`]
: []),
],
from: importFrom,
});
}
}
if ((0, field_classifiers_1.isRelation)(field)) {
const isRelationRequired = (0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_RELATION_REQUIRED);
overrides.isRequired = isRelationRequired;
overrides.isNullable = field.isList
? false
: field.isRequired
? false
: !isRelationRequired;
if (field.type !== model.name &&
!(((0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_OVERRIDE_TYPE) ||
(0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_CAST_TYPE)) &&
(0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_OVERRIDE_API_PROPERTY_TYPE))) {
const modelToImportFrom = allModels.find(({ name }) => name === field.type);
if (!modelToImportFrom)
throw new Error(`related model '${field.type}' for '${model.name}.${field.name}' not found`);
const importName = templateHelpers.entityName(field.type);
const importFrom = (0, slash_1.default)(`${(0, helpers_1.getRelativePath)(model.output.entity, modelToImportFrom.output.entity)}${node_path_1.default.sep}${templateHelpers.entityFilename(field.type)}`);
imports.push({
destruct: [
importName,
...(templateHelpers.config.wrapRelationsAsType
? [`type ${importName} as ${importName}AsType`]
: []),
],
from: importFrom,
});
}
}
if (relationScalarFieldNames.includes(name)) {
const { [name]: relationNames } = relationScalarFields;
const isAnyRelationRequired = relationNames.some((relationFieldName) => {
const relationField = model.fields.find((anyField) => anyField.name === relationFieldName);
if (!relationField)
return false;
return ((0, field_classifiers_1.isRequired)(relationField) ||
(0, field_classifiers_1.isAnnotatedWith)(relationField, annotations_1.DTO_RELATION_REQUIRED));
});
overrides.isRequired = true;
overrides.isNullable = !isAnyRelationRequired;
}
if (!templateHelpers.config.noDependencies) {
if ((0, field_classifiers_1.isAnnotatedWith)(field, annotations_1.DTO_API_HIDDEN)) {
decorators.apiHideProperty = true;
}
else {
decorators.apiProperties = (0, api_decorator_1.parseApiProperty)({
...field,
...overrides,
isRequired: templateHelpers.config.requiredResponseApiProperty
? !!overrides.isRequired
: false,
}, {
default: false,
type: templateHelpers.config.outputApiPropertyType,
});
const typeProperty = decorators.apiProperties.find((p) => p.name === 'type');
if ((typeProperty === null || typeProperty === void 0 ? void 0 : typeProperty.value) === field.type)
typeProperty.value =
'() => ' +
(field.type === 'Json'
? 'Object'
: (0, field_classifiers_1.isType)(field)
? templateHelpers.plainDtoName(typeProperty.value)
: templateHelpers.entityName(typeProperty.value));
}
}
if (templateHelpers.config.noDependencies) {
if (field.type === 'Json')
field.type = 'Object';
else if (field.type === 'Decimal')
field.type = 'String';
if (field.kind === 'enum') {
imports.push({
from: (0, slash_1.default)(`${(0, helpers_1.getRelativePath)(model.output.entity, templateHelpers.config.outputPath)}${node_path_1.default.sep}enums`),
destruct: [field.type],
});
}
}
return [...result, (0, helpers_1.mapDMMFToParsedField)(field, overrides, decorators)];
}, []);
const importPrismaClient = (0, helpers_1.makeImportsFromPrismaClient)(fields, templateHelpers.config.prismaClientImportPath, !templateHelpers.config.noDependencies);
const importNestjsSwagger = (0, api_decorator_1.makeImportsFromNestjsSwagger)(fields, apiExtraModels);
const customImports = (0, helpers_1.makeCustomImports)(fields);
return {
model,
fields,
imports: (0, helpers_1.zipImportStatementParams)([
...importPrismaClient,
...importNestjsSwagger,
...customImports,
...imports,
]),
apiExtraModels,
};
};
exports.computeEntityParams = computeEntityParams;