UNPKG

prisma-dbml-generator

Version:
68 lines (67 loc) 3.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateRelations = exports.manyToOne = exports.oneToMany = exports.oneToOne = void 0; const model_1 = require("./model"); exports.oneToOne = '-'; exports.oneToMany = '<'; exports.manyToOne = '>'; function generateRelations(models, mapToDbSchema = false) { const refs = []; models.forEach((model) => { model.fields .filter((field) => { var _a, _b; return field.relationName && ((_a = field.relationToFields) === null || _a === void 0 ? void 0 : _a.length) && ((_b = field.relationFromFields) === null || _b === void 0 ? void 0 : _b.length); }) .forEach((field) => { var _a; const relationFrom = model.name; const relationTo = field.type; const relationOperator = getRelationOperator(models, relationFrom, relationTo); const relationFormName = mapToDbSchema && model.dbName ? model.dbName : model.name; const relationToName = mapToDbSchema ? ((_a = (0, model_1.getModelByType)(models, relationTo)) === null || _a === void 0 ? void 0 : _a.dbName) || relationTo : relationTo; const ref = `Ref: ${relationFormName}.${combineKeys(field.relationFromFields)} ${relationOperator} ${relationToName}.${combineKeys(field.relationToFields)}`; const referentialActions = getReferentialActions(models, relationFrom, relationTo); refs.push(`${ref}${referentialActions}`); }); }); return refs; } exports.generateRelations = generateRelations; const getRelationOperator = (models, from, to) => { const model = models.find((model) => model.name === to); const field = model === null || model === void 0 ? void 0 : model.fields.find((field) => field.type === from); return (field === null || field === void 0 ? void 0 : field.isList) ? exports.manyToOne : exports.oneToOne; }; // Composite foreign keys: // Ref: merchant_periods.(merchant_id, country_code) > merchants.(id, country_code) const combineKeys = (keys) => { return keys.length > 1 ? `(${keys.join(', ')})` : keys[0]; }; const getReferentialActions = (models, from, to) => { const model = models.find((model) => model.name === from); const field = model === null || model === void 0 ? void 0 : model.fields.find((field) => field.type === to); const referentialActions = []; if (field === null || field === void 0 ? void 0 : field.relationOnDelete) { referentialActions.push(`delete: ${referentialActionsMap.get(field.relationOnDelete) || field.relationOnDelete}`); } if (referentialActions.length) { return ' [' + referentialActions.join(', ') + ']'; } return ''; }; var ReferentialAction; (function (ReferentialAction) { ReferentialAction["Cascade"] = "Cascade"; ReferentialAction["Restrict"] = "Restrict"; ReferentialAction["NoAction"] = "No Action"; ReferentialAction["SetNull"] = "Set Null"; ReferentialAction["SetDefault"] = "Set Default"; })(ReferentialAction || (ReferentialAction = {})); const referentialEntries = Object.entries(ReferentialAction); const referentialActionsMap = new Map(referentialEntries);