UNPKG

kapix-typegraphql-prisma

Version:

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

241 lines 11.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DmmfDocument = void 0; const transform_1 = require("./transform"); const helpers_1 = require("../helpers"); const lodash_1 = require("lodash"); const config_1 = require("../config"); class DmmfDocument { constructor({ datamodel, schema, mappings }, options) { var _a, _b; this.options = options; const enumTypes = [ ...((_a = schema.enumTypes.prisma) !== null && _a !== void 0 ? _a : []), ...((_b = schema.enumTypes.model) !== null && _b !== void 0 ? _b : []), ]; const models = [...datamodel.models, ...datamodel.types]; // @enum not rdy for now (missing aggregation/ whereFilter etc..) // models.forEach(o => { // o.fields.forEach(field => { // const docs = field.documentation && field.documentation.split("\n"); // if (docs) { // const otherDocs: string[] = []; // docs.forEach(doc => { // if (doc.includes("@enum")) { // try { // const parsedEnumDef = JSON.parse( // doc.split("@enum")[1].trim(), // ) as { name: string; values: Array<Array<string> | string> }; // const enumDef = { // name: parsedEnumDef.name.endsWith("Enum") // ? parsedEnumDef.name // : `${parsedEnumDef.name}Enum`, // values: parsedEnumDef.values.map(enumValue => { // if (typeof enumValue === "string") { // return { // name: enumValue, // dbName: enumValue, // } as any; // } else { // const [name, dbName] = enumValue; // return { // name, // dbName, // } as any; // } // }), // }; // schema.inputObjectTypes.prisma.forEach(m => { // let isSameModel = false; // if (m.meta) { // isSameModel = m.meta.source === o.name; // } else { // const modelName = getModelNameFromInputType(m.name); // isSameModel = modelName === o.name; // } // if (isSameModel) { // m.fields.forEach(f => { // if (f.name === field.name) { // const stringInputType = f.inputTypes.find( // i => !i.isList && i.type === "String", // ); // stringInputType && // Object.assign(stringInputType, { // isList: false, // location: "enumTypes", // namespace: "model", // type: enumDef.name, // }); // // if (f.inputTypes.length === 2) { // // f.inputTypes = [ // // { // // isList: false, // // location: 'inputObjectTypes', // // namespace: 'prisma', // // type: `Enum${o.name}Filter` // // }, // // { // // isList: false, // // location: 'enumTypes', // // namespace: 'model', // // type: o.name // // } // // ] // // } else { // // } // } // }); // } // }); // enumTypes.push(enumDef); // datamodel.enums.push(enumDef); // // we dont want to overwrite type of OutputType // // field.kind = 'enum' // // field.type = enumDef.name // } catch (e: any) { // console.error(`@enum ${doc} attribute error: ${e.message}`); // } // } else { // otherDocs.push(doc); // } // }); // field.documentation = otherDocs.join("\n"); // } // }); // }); // test override name to nullable true models.forEach(o => { const modelDocs = o.documentation && o.documentation.split("\n"); if (modelDocs) { const queryActionsLine = modelDocs.find(line => line.includes("@queryActions")); const mutationActionsLine = modelDocs.find(line => line.includes("@mutationActions")); if (queryActionsLine) { const queryActions = []; options.queryActionsByModel = { ...options.queryActionsByModel, [o.name]: queryActions, }; const match = queryActionsLine.match(/@queryActions\s*=\s*"([^"]+)"/); if (match) { const actions = match[1].split(",").map(a => a.trim()); actions.forEach((action) => { if (config_1.supportedQueryActions.includes(action)) { queryActions.push(action); } }); } } if (mutationActionsLine) { const mutationActions = []; options.mutationActionsByModel = { ...options.mutationActionsByModel, [o.name]: mutationActions, }; const match = mutationActionsLine.match(/@mutationActions\s*=\s*"([^"]+)"/); if (match) { const actions = match[1].split(",").map(a => a.trim()); actions.forEach((action) => { if (config_1.supportedMutationActions.includes(action)) { mutationActions.push(action); } }); } } } o.fields.forEach(field => { if ((0, lodash_1.camelCase)(field.name) === "createdBy") { schema.inputObjectTypes.prisma.forEach(m => { let isSameModel = false; if (m.meta) { isSameModel = m.meta.source === o.name; } else { const modelName = (0, helpers_1.getModelNameFromInputType)(m.name); isSameModel = modelName === o.name; } if (isSameModel) { m.fields.forEach(f => { if (f.name === field.name) { f.isNullable = true; f.isRequired = false; } }); } }); } const docs = field.documentation && field.documentation.split("\n"); if (docs) { docs.forEach(doc => { if (doc.includes("@geometry")) { schema.inputObjectTypes.prisma.forEach(m => { let isSameModel = false; if (m.meta) { isSameModel = m.meta.source === o.name; } else { const modelName = (0, helpers_1.getModelNameFromInputType)(m.name); isSameModel = modelName === o.name; } if (isSameModel) { m.fields.forEach(f => { if (f.name === field.name) { f.isGeometry = true; } }); } }); } }); } }); }); // transform bare model without fields this.models = models.map(transform_1.transformBareModel); // transform enums before model fields to map enum types to enum values string union this.enums = enumTypes.map((0, transform_1.transformEnums)(this)); // then transform once again to map the fields (it requires mapped model type names) this.models = models.map((0, transform_1.transformModelWithFields)(this)); // transform enums again to map renamed fields this.enums = enumTypes.map((0, transform_1.transformEnums)(this)); this.datamodel = { models: this.models, enums: datamodel.enums.map((0, transform_1.transformEnums)(this)), types: [], // TODO: parse `datamodel.types` }; this.schema = { ...(0, transform_1.transformSchema)(schema, this), enums: this.enums, }; this.modelMappings = (0, transform_1.transformMappings)(mappings.modelOperations, this, options); this.relationModels = this.models .filter(model => model.fields.some(field => field.relationName !== undefined && !field.isOmitted.output)) .filter(model => { const outputType = this.schema.outputTypes.find(type => type.name === model.name); return (outputType && outputType.fields.some(outputTypeField => model.fields.some(modelField => modelField.name === outputTypeField.name && modelField.relationName !== undefined && !modelField.isOmitted.output))); }) .map((0, transform_1.generateRelationModel)(this)); } getModelTypeName(modelName) { var _a; return (_a = this.models.find(it => it.name.toLocaleLowerCase() === modelName.toLocaleLowerCase())) === null || _a === void 0 ? void 0 : _a.typeName; } isModelName(typeName) { return this.models.some(it => it.name === typeName); } isModelTypeName(typeName) { return this.models.some(it => it.typeName === typeName); } getModelFieldAlias(modelName, fieldName) { var _a; const model = this.models.find(it => it.name === modelName); return (_a = model === null || model === void 0 ? void 0 : model.fields.find(it => it.name === fieldName)) === null || _a === void 0 ? void 0 : _a.typeFieldAlias; } shouldGenerateBlock(block) { return this.options.blocksToEmit.includes(block); } } exports.DmmfDocument = DmmfDocument; //# sourceMappingURL=dmmf-document.js.map