kapix-typegraphql-prisma
Version:

241 lines • 11.7 kB
JavaScript
;
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