prisma-dbml-generator
Version:
Prisma DBML Generator
68 lines (67 loc) • 3.3 kB
JavaScript
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);
;