From d8e0bc7db8881971ddaea7177bcebee13cc865f6 Mon Sep 17 00:00:00 2001 From: Guy Ben-Aharon Date: Wed, 27 Aug 2025 14:42:02 +0300 Subject: [PATCH] fix: upgrade dbml lib (#880) --- package-lock.json | 28 ++++++----- package.json | 2 +- .../import-dbml-dialog/import-dbml-dialog.tsx | 2 +- .../dbml-import/__tests__/dbml-import.test.ts | 2 +- src/lib/dbml/dbml-import/dbml-import-error.ts | 48 +++++++++++-------- src/lib/dbml/dbml-import/dbml-import.ts | 2 +- 6 files changed, 49 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index b45d29ae..3b0b63c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.15.1", "dependencies": { "@ai-sdk/openai": "^0.0.51", - "@dbml/core": "^3.9.5", + "@dbml/core": "^3.13.9", "@dnd-kit/sortable": "^8.0.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-accordion": "^1.2.0", @@ -896,12 +896,12 @@ } }, "node_modules/@dbml/core": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@dbml/core/-/core-3.9.5.tgz", - "integrity": "sha512-lX/G5qer42irufv5rvx6Y3ISV2ZLDRlxj8R+OZMdhC6wAw0VYPYIts23MdMFPY39Iay0TDtfmwsbOsVy/yjSIg==", + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/@dbml/core/-/core-3.13.9.tgz", + "integrity": "sha512-JgJ470yuTZU7tP64ZL5FpEh7zSXjSoKzkARmin8iVVhdsNM8Nq4e+FFhG6J6acPtGHtoLahOs9LqrC17B9MqYg==", "license": "Apache-2.0", "dependencies": { - "@dbml/parse": "^3.9.5", + "@dbml/parse": "^3.13.9", "antlr4": "^4.13.1", "lodash": "^4.17.15", "parsimmon": "^1.13.0", @@ -912,15 +912,15 @@ } }, "node_modules/@dbml/parse": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/@dbml/parse/-/parse-3.9.5.tgz", - "integrity": "sha512-z8MjBYDFiYf7WtsagwGATEye81xQcO9VXFzttSjdJ+wgdSFzFSex9letJPIMIcYXBkm4Fg5qLDk+G9uq/413Dg==", + "version": "3.13.9", + "resolved": "https://registry.npmjs.org/@dbml/parse/-/parse-3.13.9.tgz", + "integrity": "sha512-JMfOxWquXMZpF/MTLy2xWLImx3z9D0t67T7x/BT892WvmhM+9cnJHFA2URT1NXu9jdajbTTFuoWSyzdsfNpaRw==", "license": "Apache-2.0", "dependencies": { - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, - "peerDependencies": { - "lodash": "^4.17.21" + "engines": { + "node": ">=18" } }, "node_modules/@dnd-kit/accessibility": { @@ -8440,6 +8440,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", diff --git a/package.json b/package.json index 0f33254c..d3fb7a77 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@ai-sdk/openai": "^0.0.51", - "@dbml/core": "^3.9.5", + "@dbml/core": "^3.13.9", "@dnd-kit/sortable": "^8.0.0", "@monaco-editor/react": "^4.6.0", "@radix-ui/react-accordion": "^1.2.0", diff --git a/src/dialogs/import-dbml-dialog/import-dbml-dialog.tsx b/src/dialogs/import-dbml-dialog/import-dbml-dialog.tsx index 0e61e059..b03b4ad4 100644 --- a/src/dialogs/import-dbml-dialog/import-dbml-dialog.tsx +++ b/src/dialogs/import-dbml-dialog/import-dbml-dialog.tsx @@ -132,7 +132,7 @@ Ref: comments.user_id > users.id // Each comment is written by one user`; const preprocessedContent = preprocessDBML(content); const sanitizedContent = sanitizeDBML(preprocessedContent); const parser = new Parser(); - parser.parse(sanitizedContent, 'dbml'); + parser.parse(sanitizedContent, 'dbmlv2'); } catch (e) { const parsedError = parseDBMLError(e); if (parsedError) { diff --git a/src/lib/dbml/dbml-import/__tests__/dbml-import.test.ts b/src/lib/dbml/dbml-import/__tests__/dbml-import.test.ts index 9740ebac..694853b8 100644 --- a/src/lib/dbml/dbml-import/__tests__/dbml-import.test.ts +++ b/src/lib/dbml/dbml-import/__tests__/dbml-import.test.ts @@ -154,7 +154,7 @@ Note note_1750185617764 { // Should not throw const parser = new Parser(); - expect(() => parser.parse(sanitized, 'dbml')).not.toThrow(); + expect(() => parser.parse(sanitized, 'dbmlv2')).not.toThrow(); }); }); diff --git a/src/lib/dbml/dbml-import/dbml-import-error.ts b/src/lib/dbml/dbml-import/dbml-import-error.ts index 89114d7d..f6286f43 100644 --- a/src/lib/dbml/dbml-import/dbml-import-error.ts +++ b/src/lib/dbml/dbml-import/dbml-import-error.ts @@ -1,3 +1,5 @@ +import type { CompilerError } from '@dbml/core/types/parse/error'; + export interface DBMLError { message: string; line: number; @@ -9,28 +11,12 @@ export function parseDBMLError(error: unknown): DBMLError | null { if (typeof error === 'string') { const parsed = JSON.parse(error); if (parsed.diags?.[0]) { - const diag = parsed.diags[0]; - - return { - message: diag.message, - line: diag.location.start.line, - column: diag.location.start.column, - }; + const parsedError = parsed as CompilerError; + return getFirstErrorFromCompileError(parsedError); } } else if (error && typeof error === 'object' && 'diags' in error) { - const parsed = error as { - diags: Array<{ - message: string; - location: { start: { line: number; column: number } }; - }>; - }; - if (parsed.diags?.[0]) { - return { - message: parsed.diags[0].message, - line: parsed.diags[0].location.start.line, - column: parsed.diags[0].location.start.column, - }; - } + const parsed = error as CompilerError; + return getFirstErrorFromCompileError(parsed); } } catch (e) { console.error('Error parsing DBML error:', e); @@ -38,3 +24,25 @@ export function parseDBMLError(error: unknown): DBMLError | null { return null; } + +const getFirstErrorFromCompileError = ( + error: CompilerError +): DBMLError | null => { + const diags = (error.diags ?? []).sort((a, b) => { + if (a.location.start.line === b.location.start.line) { + return a.location.start.column - b.location.start.column; + } + return a.location.start.line - b.location.start.line; + }); + + if (diags.length > 0) { + const firstDiag = diags[0]; + return { + message: firstDiag.message, + line: firstDiag.location.start.line, + column: firstDiag.location.start.column, + }; + } + + return null; +}; diff --git a/src/lib/dbml/dbml-import/dbml-import.ts b/src/lib/dbml/dbml-import/dbml-import.ts index 10098b47..969a37ce 100644 --- a/src/lib/dbml/dbml-import/dbml-import.ts +++ b/src/lib/dbml/dbml-import/dbml-import.ts @@ -223,7 +223,7 @@ export const importDBMLToDiagram = async ( }; } - const parsedData = parser.parse(sanitizedContent, 'dbml'); + const parsedData = parser.parse(sanitizedContent, 'dbmlv2'); // Handle case where no schemas are found if (!parsedData.schemas || parsedData.schemas.length === 0) {