UNPKG

kapix-typegraphql-prisma

Version:

![integration logo](https://raw.githubusercontent.com/MichalLytek/typegraphql-prisma/main/img/integration.png)

128 lines 6.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_morph_1 = require("ts-morph"); const path_1 = tslib_1.__importDefault(require("path")); const helpers_1 = require("../helpers"); const config_1 = require("../config"); const imports_1 = require("../imports"); function generateRelationsResolverClassesFromModel(project, baseDirPath, dmmfDocument, { model, relationFields, resolverName }, generatorOptions) { var _a, _b; const rootArgName = (0, helpers_1.camelCase)(model.typeName); const singleIdField = model.fields.find(field => field.isId); const singleUniqueField = model.fields.find(field => field.isUnique); const singleFilterField = singleIdField !== null && singleIdField !== void 0 ? singleIdField : singleUniqueField; const compositeIdFields = (_b = (_a = model.primaryKey) === null || _a === void 0 ? void 0 : _a.fields.map(idField => model.fields.find(field => idField === field.name))) !== null && _b !== void 0 ? _b : []; const compositeUniqueFields = model.uniqueIndexes[0] ? model.uniqueIndexes[0].fields.map(uniqueField => model.fields.find(field => uniqueField === field.name)) : []; const compositeFilterFields = compositeIdFields.length > 0 ? compositeIdFields : compositeUniqueFields; const resolverDirPath = path_1.default.resolve(baseDirPath, config_1.resolversFolderName, config_1.relationsResolversFolderName, model.typeName); const filePath = path_1.default.resolve(resolverDirPath, `${resolverName}.ts`); const sourceFile = project.createSourceFile(filePath, undefined, { overwrite: true, }); (0, imports_1.generateTypeGraphQLImport)(sourceFile); (0, imports_1.generateGraphQLInfoImport)(sourceFile); (0, imports_1.generateModelsImports)(sourceFile, [...relationFields.map(field => field.type), model.typeName], 3); const argTypeNames = relationFields .filter(it => it.argsTypeName !== undefined) .map(it => it.argsTypeName); (0, imports_1.generateArgsImports)(sourceFile, argTypeNames, 0); (0, imports_1.generateHelpersFileImport)(sourceFile, 3); sourceFile.addClass({ name: resolverName, isExported: true, decorators: [ { name: "TypeGraphQL.Resolver", arguments: [`_of => ${model.typeName}`], }, ], methods: relationFields.map(field => { var _a, _b, _c, _d, _e; let whereConditionString = ""; // TODO: refactor to AST if (singleFilterField) { whereConditionString = ` ${singleFilterField.name}: ${rootArgName}.${singleFilterField.name}, `; } else if (compositeFilterFields.length > 0) { const filterKeyName = (_d = (_b = (_a = model.primaryKey) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : (_c = model.uniqueIndexes[0]) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : compositeFilterFields.map(it => it.name).join("_"); whereConditionString = ` ${filterKeyName}: { ${compositeFilterFields .map(idField => `${idField.name}: ${rootArgName}.${idField.name},`) .join("\n")} }, `; } else { throw new Error(`Unexpected error happened on generating 'whereConditionString' for ${model.typeName} relation resolver`); } return { name: (_e = field.typeFieldAlias) !== null && _e !== void 0 ? _e : field.name, isAsync: true, returnType: `Promise<${field.fieldTSType}>`, decorators: [ { name: "TypeGraphQL.FieldResolver", arguments: [ `_type => ${field.typeGraphQLType}`, ts_morph_1.Writers.object({ nullable: `${!field.isRequired}`, ...(field.docs && { description: `"${field.docs}"` }), }), ], }, ], parameters: [ { name: rootArgName, type: model.typeName, decorators: [{ name: "TypeGraphQL.Root", arguments: [] }], }, { name: "ctx", // TODO: import custom `ContextType` type: "any", decorators: [{ name: "TypeGraphQL.Ctx", arguments: [] }], }, { name: "info", type: "GraphQLResolveInfo", decorators: [{ name: "TypeGraphQL.Info", arguments: [] }], }, ...(!field.argsTypeName ? [] : [ { name: "args", type: field.argsTypeName, decorators: [ { name: "TypeGraphQL.Args", arguments: generatorOptions.emitRedundantTypesInfo ? [`_type => ${field.argsTypeName}`] : [], }, ], }, ]), ], // TODO: refactor to AST statements: [ /* ts */ ` const { _count } = transformInfoIntoPrismaArgs(info); return getPrismaFromContext(ctx).${(0, helpers_1.camelCase)(model.name)}.findUniqueOrThrow({ where: {${whereConditionString}}, }).${field.name}({ ${field.argsTypeName ? "\n...args," : ""} ...(_count && transformCountFieldIntoSelectRelationsCount(_count)), });`, ], }; }), }); } exports.default = generateRelationsResolverClassesFromModel; //# sourceMappingURL=relations.js.map