typegraphql-prisma-nestjs
Version:
This project is a fork of another with minor changes, created for personal use.
228 lines • 9.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateOutputTypeClassFromType = generateOutputTypeClassFromType;
exports.generateInputTypeClassFromType = generateInputTypeClassFromType;
const tslib_1 = require("tslib");
const path_1 = tslib_1.__importDefault(require("path"));
const ts_morph_1 = require("ts-morph");
const config_1 = require("./config");
const helpers_1 = require("./helpers");
const imports_1 = require("./imports");
function generateOutputTypeClassFromType(project, dirPath, type, dmmfDocument) {
const fileDirPath = path_1.default.resolve(dirPath, config_1.outputsFolderName);
const filePath = path_1.default.resolve(fileDirPath, `${type.typeName}.ts`);
const sourceFile = project.createSourceFile(filePath, undefined, {
overwrite: true,
});
const fieldArgsTypeNames = type.fields
.filter(it => it.argsTypeName)
.map(it => it.argsTypeName);
const outputObjectTypes = type.fields.filter(field => field.outputType.location === "outputObjectTypes");
const outputObjectModelTypes = outputObjectTypes.filter(field => dmmfDocument.isModelTypeName(field.outputType.type));
(0, imports_1.generateTypeGraphQLImport)(sourceFile);
(0, imports_1.generateGraphQLScalarsImport)(sourceFile);
(0, imports_1.generatePrismaNamespaceImport)(sourceFile, dmmfDocument.options, 2);
(0, imports_1.generateCustomScalarsImport)(sourceFile, 2);
(0, imports_1.generateArgsImports)(sourceFile, fieldArgsTypeNames, 0);
(0, imports_1.generateOutputsImports)(sourceFile, outputObjectTypes
.filter(field => !outputObjectModelTypes.includes(field))
.map(field => field.outputType.type), 1);
(0, imports_1.generateModelsImports)(sourceFile, outputObjectModelTypes.map(field => field.outputType.type), 2);
(0, imports_1.generateEnumsImports)(sourceFile, type.fields
.map(field => field.outputType)
.filter(fieldType => fieldType.location === "enumTypes")
.map(fieldType => fieldType.type), 2);
sourceFile.addClass({
name: type.typeName,
isExported: true,
decorators: [
{
name: "ObjectType",
arguments: [
`"${[dmmfDocument.options.objectTypePrefix, type.typeName]
.filter(Boolean)
.join("")}"`,
ts_morph_1.Writers.object({
...(dmmfDocument.options.emitIsAbstract && {
isAbstract: "true",
}),
...(dmmfDocument.options.simpleResolvers && {
simpleResolvers: "true",
}),
}),
],
},
],
properties: [
...type.fields
.filter(field => !field.argsTypeName)
.map(field => ({
name: field.name,
type: field.fieldTSType,
hasExclamationToken: true,
hasQuestionToken: false,
trailingTrivia: "\r\n",
decorators: [
{
name: "Field",
arguments: [
`_type => ${field.typeGraphQLType}`,
ts_morph_1.Writers.object({
nullable: `${!field.isRequired}`,
}),
],
},
],
})),
...type.fields
.filter(field => field.argsTypeName)
.map(field => ({
name: field.name,
type: field.fieldTSType,
hasExclamationToken: true,
hasQuestionToken: false,
})),
],
methods: type.fields
.filter(field => field.argsTypeName)
.map(field => ({
name: `get${(0, helpers_1.pascalCase)(field.name)}`,
returnType: field.fieldTSType,
trailingTrivia: "\r\n",
decorators: [
{
name: "Field",
arguments: [
`_type => ${field.typeGraphQLType}`,
ts_morph_1.Writers.object({
name: `"${field.name}"`,
nullable: `${!field.isRequired}`,
// fix for https://github.com/EndyKaufman/typegraphql-prisma-nestjs/issues/49
...(field.typeGraphQLType === "Int" &&
type.typeName.endsWith("Count")
? {
middleware: `[
async (ctx) => {
return ctx.source.${field.name} || 0;
},
]`,
}
: {}),
}),
],
},
],
parameters: [
{
name: "root",
type: type.typeName,
decorators: [{ name: "Root", arguments: [] }],
},
{
name: "args",
type: field.argsTypeName,
decorators: [{ name: "Args", arguments: [] }],
},
],
statements: [ts_morph_1.Writers.returnStatement(`root.${field.name}`)],
})),
});
}
function generateInputTypeClassFromType(project, dirPath, inputType, options) {
const filePath = path_1.default.resolve(dirPath, config_1.inputsFolderName, `${inputType.typeName}.ts`);
const sourceFile = project.createSourceFile(filePath, undefined, {
overwrite: true,
});
(0, imports_1.generateTypeGraphQLImport)(sourceFile);
(0, imports_1.generateGraphQLScalarsImport)(sourceFile);
(0, imports_1.generatePrismaNamespaceImport)(sourceFile, options, 2);
(0, imports_1.generateCustomScalarsImport)(sourceFile, 2);
(0, imports_1.generateInputsImports)(sourceFile, inputType.fields
.filter(f => !options.emitPropertyMethods?.includes(f.name))
.filter(field => field.selectedInputType.location === "inputObjectTypes")
.map(field => field.selectedInputType.type)
.filter(fieldType => fieldType !== inputType.typeName));
(0, imports_1.generateEnumsImports)(sourceFile, inputType.fields
.filter(f => !options.emitPropertyMethods?.includes(f.name))
.map(field => field.selectedInputType)
.filter(fieldType => fieldType.location === "enumTypes")
.map(fieldType => fieldType.type), 2);
const fieldsToEmit = inputType.fields
.filter(f => !options.emitPropertyMethods?.includes(f.name))
.filter(field => !field.isOmitted);
const mappedFields = fieldsToEmit.filter(field => field.hasMappedName);
sourceFile.addClass({
name: inputType.typeName,
isExported: true,
decorators: [
{
name: "InputType",
arguments: [
`"${[options.inputTypePrefix, inputType.typeName]
.filter(Boolean)
.join("")}"`,
ts_morph_1.Writers.object({
...(options.emitIsAbstract && {
isAbstract: "true",
}),
}),
],
},
],
properties: fieldsToEmit.map(field => {
return {
name: field.name,
type: field.fieldTSType,
hasExclamationToken: !!field.isRequired,
hasQuestionToken: !field.isRequired,
trailingTrivia: "\r\n",
decorators: field.hasMappedName
? []
: [
{
name: "Field",
arguments: [
`_type => ${field.typeGraphQLType}`,
ts_morph_1.Writers.object({
nullable: `${!!field.isOptional || !field.isRequired}`,
}),
],
},
],
};
}),
getAccessors: mappedFields.map(field => {
return {
name: field.typeName,
type: field.fieldTSType,
hasExclamationToken: field.isRequired,
hasQuestionToken: !field.isRequired,
trailingTrivia: "\r\n",
statements: [`return this.${field.name};`],
decorators: [
{
name: "Field",
arguments: [
`_type => ${field.typeGraphQLType}`,
ts_morph_1.Writers.object({
nullable: `${!field.isRequired}`,
}),
],
},
],
};
}),
setAccessors: mappedFields.map(field => {
return {
name: field.typeName,
type: field.fieldTSType,
hasExclamationToken: field.isRequired,
hasQuestionToken: !field.isRequired,
trailingTrivia: "\r\n",
parameters: [{ name: field.name, type: field.fieldTSType }],
statements: [`this.${field.name} = ${field.name};`],
};
}),
});
}
//# sourceMappingURL=type-class.js.map