prisma-dbml-generator
Version:
Prisma DBML Generator
102 lines (101 loc) • 4.31 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateTables = void 0;
const keywords_1 = require("./../keywords");
const model_1 = require("./model");
function generateTables(models, mapToDbSchema = false, includeRelationFields = true) {
return models.map((model) => {
let modelName = model.name;
if (mapToDbSchema && model.dbName) {
modelName = model.dbName;
}
return (`${keywords_1.DBMLKeywords.Table} ${modelName} {\n` +
generateFields(model.fields, models, mapToDbSchema, includeRelationFields) +
generateTableIndexes(model) +
generateTableDocumentation(model) +
'\n}');
});
}
exports.generateTables = generateTables;
const generateTableIndexes = (model) => {
var _a;
const primaryFields = (_a = model.primaryKey) === null || _a === void 0 ? void 0 : _a.fields;
const hasIdFields = primaryFields && primaryFields.length > 0;
const hasCompositeUniqueIndex = hasCompositeUniqueIndices(model.uniqueFields);
return hasIdFields || hasCompositeUniqueIndex
? `\n\n ${keywords_1.DBMLKeywords.Indexes} {\n${generateTableBlockId(primaryFields)}${hasIdFields && hasCompositeUniqueIndex ? '\n' : ''}${generateTableCompositeUniqueIndex(model.uniqueFields)}\n }`
: '';
};
const hasCompositeUniqueIndices = (uniqueFields) => {
return uniqueFields.filter((composite) => composite.length > 1).length > 0;
};
const generateTableBlockId = (primaryFields) => {
if (primaryFields === undefined || primaryFields.length === 0) {
return '';
}
return ` (${primaryFields.join(', ')}) [${keywords_1.DBMLKeywords.Pk}]`;
};
const generateTableCompositeUniqueIndex = (uniqueFields) => {
return uniqueFields
.filter((composite) => composite.length > 1)
.map((composite) => ` (${composite.join(', ')}) [${keywords_1.DBMLKeywords.Unique}]`)
.join('\n');
};
const generateTableDocumentation = (model) => {
var _a;
const doc = (_a = model.documentation) === null || _a === void 0 ? void 0 : _a.replace(/'/g, "\\'");
return doc ? `\n\n Note: '${doc}'` : '';
};
const generateFields = (fields, models, mapToDbSchema = false, includeRelationFields = true) => {
if (!includeRelationFields) {
fields = fields.filter((field) => !field.relationName);
}
return fields
.map((field) => {
var _a;
const relationToName = mapToDbSchema
? ((_a = (0, model_1.getModelByType)(models, field.type)) === null || _a === void 0 ? void 0 : _a.dbName) || field.type
: field.type;
const fieldType = field.isList && !field.relationName
? `${relationToName}[]`
: relationToName;
return ` ${field.name} ${fieldType}${generateColumnDefinition(field)}`;
})
.join('\n');
};
const generateColumnDefinition = (field) => {
var _a, _b;
const columnDefinition = [];
if (field.isId) {
columnDefinition.push(keywords_1.DBMLKeywords.Pk);
}
if (((_a = field.default) === null || _a === void 0 ? void 0 : _a.name) === 'autoincrement') {
columnDefinition.push(keywords_1.DBMLKeywords.Increment);
}
if (((_b = field.default) === null || _b === void 0 ? void 0 : _b.name) === 'now') {
columnDefinition.push('default: `now()`');
}
if (field.isUnique) {
columnDefinition.push(keywords_1.DBMLKeywords.Unique);
}
if (field.isRequired && !field.isId) {
columnDefinition.push(keywords_1.DBMLKeywords.NotNull);
}
if (field.hasDefaultValue && typeof field.default != 'object') {
if (field.type === keywords_1.PrismaScalars.String ||
field.type === keywords_1.PrismaScalars.Json ||
field.kind === 'enum') {
columnDefinition.push(`${keywords_1.DBMLKeywords.Default}: '${field.default}'`);
}
else {
columnDefinition.push(`${keywords_1.DBMLKeywords.Default}: ${field.default}`);
}
}
if (field.documentation) {
columnDefinition.push(`${keywords_1.DBMLKeywords.Note}: '${field.documentation.replace(/'/g, "\\'")}'`);
}
if (columnDefinition.length) {
return ' [' + columnDefinition.join(', ') + ']';
}
return '';
};