prisma-markdown
Version:
Prisma Markdown documents generator including ERD diagrams and comment descriptions
90 lines • 3.64 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MermaidWriter = void 0;
const PrismaUtil_1 = require("../utils/PrismaUtil");
const field_util_1 = require("../utils/field-util");
var MermaidWriter;
(function (MermaidWriter) {
MermaidWriter.write = (chapter) => [
"```mermaid",
"erDiagram",
...chapter.map(writeTable),
...chapter
.map((model) => model.fields
.filter((f) => f.kind === "object")
.map(writeRelationship({ group: chapter, model })))
.flat()
.filter((str) => !!str.length),
"```",
].join("\n");
const writeTable = (model) => {
var _a;
return [
`${JSON.stringify((_a = model.dbName) !== null && _a !== void 0 ? _a : model.name)} {`,
...model.fields
.filter((f) => f.kind !== "object")
.map(writeField(model))
.map((str) => ` ${str}`),
"}",
].join("\n");
};
const writeField = (model) => (field) => {
const isFK = model.fields.some((f) => { var _a; return f.kind === "object" && ((_a = f.relationFromFields) === null || _a === void 0 ? void 0 : _a[0]) === field.name; });
const targetField = (0, field_util_1.FieldUtil)(field, isFK);
return [
targetField.data().size
? targetField.format("t(s)")
: targetField.format("t"),
targetField.format("n"),
targetField.format("k"),
targetField.format("r"),
]
.filter((str) => !!str.length)
.join(" ");
};
const writeRelationship = (props) => (field) => {
var _a, _b, _c;
if (!((_a = field.relationFromFields) === null || _a === void 0 ? void 0 : _a.length))
return "";
const column = field.relationFromFields[0];
const scalar = props.model.fields.find((s) => column === s.dbName || column === s.name);
if (scalar === undefined)
return "";
const target = props.group.find((t) => t.name === field.type);
if (target === undefined)
return "";
const oneToOne = scalar.isId || scalar.isUnique;
const arrow = [
oneToOne ? "|" : "}",
oneToOne &&
props.group.some((m) => m.name === field.type &&
m.fields.some((f) => f.relationName === field.relationName && !f.isRequired))
? "o"
: isMandatoryMany({ model: props.model, field, target })
? "|"
: "o",
"--",
scalar.isRequired ? "|" : "o",
"|",
].join("");
return [
JSON.stringify((_b = props.model.dbName) !== null && _b !== void 0 ? _b : props.model.name),
arrow,
JSON.stringify((_c = target.dbName) !== null && _c !== void 0 ? _c : target.name),
":",
field.name,
].join(" ");
};
const isMandatoryMany = (props) => {
const opposite = props.target.fields.find((f) => f.relationName === props.field.relationName &&
f.type === props.model.name);
if (opposite === undefined)
return false;
const values = PrismaUtil_1.PrismaUtil.tagValues("minItems")(opposite);
if (values.length === 0)
return false;
const numeric = Number(values[0]);
return !isNaN(numeric) && numeric >= 1;
};
})(MermaidWriter || (exports.MermaidWriter = MermaidWriter = {}));
//# sourceMappingURL=MermaidWriter.js.map
;