UNPKG

prisma-dbml-generator

Version:
102 lines (101 loc) 4.31 kB
"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 ''; };