UNPKG

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
"use strict"; 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(''); }