quick-erd
Version:
quick and easy text-based ERD + code generator for migration, query, typescript types and orm entity
83 lines (82 loc) • 2.59 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.textToTypes = textToTypes;
exports.trimCode = trimCode;
exports.toTypeName = toTypeName;
const util_1 = require("util");
const ast_1 = require("../core/ast");
const ts_type_1 = require("../core/ts-type");
const sort_tables_1 = require("./sort-tables");
function textToTypes(text) {
const result = (0, ast_1.parse)(text);
const table_list = (0, sort_tables_1.sortTables)(result.table_list);
let tableTypes = '';
let proxyFields = '';
let schemaFields = '';
table_list.forEach(table => {
const typeName = toTypeName(table.name);
let virtualFields = '';
tableTypes += `
export type ${typeName} = {`;
table.field_list.forEach(field => {
const type = (0, ts_type_1.toTsType)(field.type);
if (field.is_primary_key) {
tableTypes += `
${field.name}?: null | ${type}`;
}
else if (field.is_null) {
tableTypes += `
${field.name}: null | ${type}`;
}
else {
tableTypes += `
${field.name}: ${type}`;
}
if (field.default_value) {
tableTypes += ` // default: ${field.default_value}`;
}
if (field.references) {
const typeName = toTypeName(field.references.table);
let name = field.name.replace(/_id$/, '');
if (name === 'id') {
name = field.references.table;
}
tableTypes += `
${name}?: ${typeName}`;
name = (0, util_1.inspect)(name);
const refField = (0, util_1.inspect)(field.name);
const table = (0, util_1.inspect)(field.references.table);
virtualFields += `
[${name}, { field: ${refField}, table: ${table} }],`;
}
});
tableTypes += `
}
`;
proxyFields += `
${table.name}: ${typeName}[]`;
if (virtualFields) {
schemaFields += `
${table.name}: [
/* foreign references */${virtualFields}
],`;
}
else {
schemaFields += `
${table.name}: [],`;
}
});
return { tableTypes, proxyFields, schemaFields };
}
function trimCode(code) {
return code
.replace(/{\n\n/g, '{\n')
.replace(/\n\n\n/g, '\n\n')
.trim();
}
function toTypeName(name) {
return name
.split('_')
.map(part => part[0].toLocaleUpperCase() + part.slice(1))
.join('');
}
;