UNPKG

json-schema-to-sql

Version:

Convert a JSON schema into SQL DDL (create table) statements.

73 lines 2.93 kB
function resolveReference(visitedTables, unresolvedReference) { const [, ...referencePath] = unresolvedReference.reference.split('/'); const tablePath = referencePath.slice(0, -1); const referencedColumnName = referencePath.at(-1); const referencedTable = visitedTables.find((table) => table.name === tablePath.join('_')); if (!referencedTable) { return { resolvedReference: null, error: { path: [...unresolvedReference.schemaPath, unresolvedReference.name], message: `${unresolvedReference.reference} references unknown table "${tablePath}"`, }, }; } const referencedColumn = referencedTable.visitedColumns.find((column) => column.name === referencedColumnName); if (!referencedColumn) { return { resolvedReference: null, error: { path: [...unresolvedReference.schemaPath, unresolvedReference.name], message: `${unresolvedReference.reference} references unknown column "${referencedColumnName}" in table "${[tablePath].join('_')}"`, }, }; } if (referencedColumn.type === 'date' || referencedColumn.type === 'datetime' || referencedColumn.type === 'number') { return { resolvedReference: null, error: { path: [...unresolvedReference.schemaPath, unresolvedReference.name], message: `${unresolvedReference.reference} references disallowed "${referencedColumn.type}" type column "${referencedColumnName}" in table "${tablePath}"`, }, }; } return { resolvedReference: { name: unresolvedReference.name, type: referencedColumn.type, reference: { table: referencedTable.name, column: referencedColumn.name, }, oneToMany: unresolvedReference.oneToMany, }, error: null, }; } export function resolveReferences(visitedTables) { const resolvedTables = []; const validationErrors = []; for (const visitedTable of visitedTables) { const resolvedTable = { ...visitedTable, resolvedReferences: [], }; for (const unresolvedReference of visitedTable.unresolvedReferences) { const { resolvedReference, error } = resolveReference(visitedTables, unresolvedReference); if (error) { validationErrors.push(error); } else { resolvedTable.resolvedReferences.push(resolvedReference); } } resolvedTables.push(resolvedTable); } if (validationErrors.length > 0) { return { success: false, resolvedTables: null, errors: validationErrors }; } return { success: true, resolvedTables, errors: null }; } //# sourceMappingURL=reference.js.map