From e977ba5ef2b6c4a2b2d11120b7f101a5e131c7d4 Mon Sep 17 00:00:00 2001 From: Guy Ben-Aharon Date: Wed, 17 Dec 2025 18:52:06 +0200 Subject: [PATCH] fix: properly merge inline refs with notes in DBML export (#1019) --- .../dbml-export/__tests__/cases/7.inline.dbml | 14 +++ .../dbml/dbml-export/__tests__/cases/7.json | 1 + .../__tests__/export-sql-dbml-cases.test.ts | 4 + src/lib/dbml/dbml-export/dbml-export.ts | 109 +++++++++++------- 4 files changed, 86 insertions(+), 42 deletions(-) create mode 100644 src/lib/dbml/dbml-export/__tests__/cases/7.inline.dbml create mode 100644 src/lib/dbml/dbml-export/__tests__/cases/7.json diff --git a/src/lib/dbml/dbml-export/__tests__/cases/7.inline.dbml b/src/lib/dbml/dbml-export/__tests__/cases/7.inline.dbml new file mode 100644 index 00000000..03cf2fb9 --- /dev/null +++ b/src/lib/dbml/dbml-export/__tests__/cases/7.inline.dbml @@ -0,0 +1,14 @@ +Table "clean"."wms_item" { + "id" int64 [note: '''| Źródło: [WMS].[dbo].[wms_items].[id] | Tabele docelowe: [BQ].[reporting].[dim_products_history].[wms_prod_id] | Czym jest dana kolumna: jest to \'WMS\'owe\' id produktu | Informacje dodatkowe: brak''', ref: < "reporting"."wms_dim_products_history"."wms_id_prod"] + "symbol" int64 [note: '''| Źródło: [WMS].[dbo].[wms_items].[symbol] | Tabele docelowe: [BQ].[reporting].[dim_products_history].[iai_prod_id] | Czym jest dana kolumna: jest to \'IAI\'owe\' id produktu | Informacje dodatkowe: brak''', ref: < "reporting"."wms_dim_products_history"."iai_id_prod"] + "ean_code" int64 [note: '| Źródło: [WMS].[dbo].[wms_items].[ean_code] | Tabele docelowe: [BQ].[reporting].[dim_products_history].[ean] | Czym jest dana kolumna: jest to kod ean produktu | Informacje dodatkowe: brak', ref: < "reporting"."wms_dim_products_history"."ean"] + "status" string + "dwh_created_at" datetime + "dwh_modified_at" datetime +} + +Table "reporting"."wms_dim_products_history" { + "iai_id_prod" int64 + "wms_id_prod" int64 + "ean" int64 +} diff --git a/src/lib/dbml/dbml-export/__tests__/cases/7.json b/src/lib/dbml/dbml-export/__tests__/cases/7.json new file mode 100644 index 00000000..068d0916 --- /dev/null +++ b/src/lib/dbml/dbml-export/__tests__/cases/7.json @@ -0,0 +1 @@ +{"id":"123456","name":"part_day","createdAt":"2025-12-17T15:59:33.112Z","updatedAt":"2025-12-17T16:08:18.946Z","databaseType":"postgresql","tables":[{"id":"4ar0wqk9p8uao27desm3uicnh","name":"wms_item","schema":"clean","x":657.6858553896849,"y":-1160.4029631833816,"fields":[{"id":"ry3l377zs3rzgw5boxt2gvfrr","name":"id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660,"comments":"| Źródło: [WMS].[dbo].[wms_items].[id]\n| Tabele docelowe: [BQ].[reporting].[dim_products_history].[wms_prod_id]\n| Czym jest dana kolumna: jest to 'WMS'owe' id produktu\n| Informacje dodatkowe: brak"},{"id":"0uc3ksoc67sobp77ky20day3k","name":"symbol","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660,"comments":"| Źródło: [WMS].[dbo].[wms_items].[symbol]\n| Tabele docelowe: [BQ].[reporting].[dim_products_history].[iai_prod_id]\n| Czym jest dana kolumna: jest to 'IAI'owe' id produktu\n| Informacje dodatkowe: brak"},{"id":"h4xw4k74c92j8we5xqyuama1h","name":"ean_code","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660,"comments":"| Źródło: [WMS].[dbo].[wms_items].[ean_code]\n| Tabele docelowe: [BQ].[reporting].[dim_products_history].[ean]\n| Czym jest dana kolumna: jest to kod ean produktu\n| Informacje dodatkowe: brak"},{"id":"atbg7uwpvmp950g7maficlfw0","name":"status","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660},{"id":"2ub0ze10x2h5nmr18jy9ld15f","name":"dwh_created_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660},{"id":"4g346zspcm0fpo8xn1k1h8di6","name":"dwh_modified_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501660}],"indexes":[],"color":"#c05dcf","isView":false,"isMaterializedView":false,"createdAt":1763990501660,"diagramId":"ee570f764e8c","parentAreaId":null},{"id":"7xpdjh6r805y1i9q52oxqp8ek","name":"v_wms_custom_purchasing_report","schema":"reporting","x":3665,"y":-1253,"fields":[{"id":"065c6gtvxf6t5z6dimrpttgni","name":"id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"fa1wr2byznk14th16wlvih16s","name":"oznaczenie_grupa","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"l11yzz2ewly3upk3nf7u58748","name":"oznaczenie_podgrupa","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"8jdn3uqwcg76jul14ov507gjd","name":"czy_ukryty","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"69r0j9y29l7d6twsqkm97ozi2","name":"symbol","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"srtnncq6mml59l9drm0nybet7","name":"ean_code","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"twrqdr8gw1bntjfey0x1hpfcv","name":"nazwa","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"4vh0skw5x2cwfq6jveuapzc3l","name":"marka","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"50z1u8kkzgpoqrmgjz7lorznp","name":"osoba_odp","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"u2iojx1ih0uz1kup8ypa0cnra","name":"liczba_sprzedanych_31","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"jgqeu8vv1xd20oyt9m432udhk","name":"wartosc_sprzedanych_31","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"n8pt4sox10okh5ewju0xg4ioc","name":"marza_netto_31","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"wvzd8gbs7qhb09ifkpgpu2z00","name":"liczba_sprzedanych_93","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"oc7jl0ttkk06azuj3vo1luvvz","name":"wartosc_sprzedanych_93","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"fro30vxy19jpzwx9kqqrzv2vz","name":"marza_netto_93","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"k3gxbt10cpmubhygoxwarrush","name":"liczba_sprzedanych_31_hurt","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"hra3tpnuyeq5tkbiit7qdrnya","name":"wartosc_marzy_netto_31_hurt","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"a3u8wm0utlkrpr2kbw79ihj5d","name":"liczba_sprzedanych_93_hurt","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"lvd1v9ydlwglj6wlptjgs7ntt","name":"wartosc_marzy_netto_93_hurt","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"j57floy0epumz26wi5tnq34mn","name":"m1","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"6m0vbr3khge0ufj4rg4zfgh2o","name":"m2","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"w48co8vku1l4rcgwpkat62wir","name":"m3","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"8t3ti2nqc4g6u0fqsl41u091x","name":"m4","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"jj69llyfwoo7uv9zbbpwkauo6","name":"m_cornery","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"tnc0ijgyvgyt77spjcxooh9mu","name":"m6","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"2twb5nf57ebi0j0s2drlwgrsc","name":"m7","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"y0iq5m63q0mevg7lbhttoh6k7","name":"m8","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"bkropk8qvmvpn11b6w3izp8fn","name":"aktualny_stan","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"83ewsvkhthzfid13l0c5cprnw","name":"stan_dyspozycyjny","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"d5z9kxdhsep9lh5cgw8hr72a3","name":"ostatnia_cena_zakupu","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"gyz640uscsw2jugo84ey7kg4t","name":"srednia_dzienna_sprzedaz_31","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"gzze6n7g7uxrh4owge9oa8rgc","name":"srednia_dzienna_sprzedaz_31_hurt","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ycccdg156ljjnv9kl7yedj3vo","name":"zapas_tygodniowy","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"wymbq25uga9ui4uukk4t1gt07","name":"ocena_stanu_zapasow","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"x0ib2b5rz4eveebpmb4hsodxh","name":"za_duzo_za_malo","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ld9phxmslceaeg9gs0rme6ds5","name":"za_duzo_za_malo_wartosc","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"96iwbopu3onncd0kcjgevvcz3","name":"zapas_bezpieczenstwa","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"an8pdap54ihqhxqmu2qlwp3ef","name":"ile_do_zamowienia","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"1m9d9x5ig1cpbb3jdhqqd6y6b","name":"ile_do_zamowienia_pomocnicza_kol","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"e2crjzm50jkbp8oavr76zhx2c","name":"ile_do_zamowienia_wartosc","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"9yw685j4mvip4obq2ej2eg46i","name":"wartosc_magazynu","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ff635dj70w71u0hwqncn4pp6f","name":"wskaznik_wyprzedania","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"klvkeq0eticf9diz9tz4cckw2","name":"sredni_czas_dostawy","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"4j1k4ouo237martkdz4f4fbjh","name":"liczba_zamowionych_towaro","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"9bgtcwc0zdlm4ht55p85ilbo1","name":"wartosc_zamowionych_towarow","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"4bl0xcqaba95wgqnbvcxli88m","name":"data_dostawy","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"0gcscmuo093bmzofge4azjt98","name":"dostepnosc_dz","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"jfvl1ohsi5zn8vrmpw9t6v85l","name":"dostepnosc_ogolem","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"dhwwaoe5lmhz048uwvbm4fea1","name":"dostepnosc_producent","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"o8700bs336cyjxzjshk9016xh","name":"dni_niedostepnosci","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"sfhlg1fryhc8nng0761w2s9k1","name":"utracona_marza_ogolem","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"zssook4kp9tkpvmt2s8lancvk","name":"utracona_marza_ogolem_hurt","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"gw07shet2jnc64yab7nms6fqm","name":"utracona_marza_producent","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"s0mbrku8yergtox5mo1e6ygne","name":"utracona_marza_dz","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"dm3jb1ueiubrw0zdh2t4zwm8l","name":"wartosc_produktow_do_wyprzedania","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"v0dgfljzbuqds2o7w1ur8w4zu","name":"czy_jest_w_cornerze","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"rsr73cpxsnf3bouuqf8sfipqs","name":"corner_liczba_do_pobrania_z_m3","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"hqnewll73uig1sj0ka9aawhvu","name":"corner_liczba_do_domowienia","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"9hs4cxn8i9z3xw1urlzm62u2k","name":"wartosc_produktow_dla_cornera","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"tm40k9zk6p4lb0j8bvhqb3s0l","name":"data_raportu","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"2dit15f4cqut1r0vgcr9eva78","name":"dostawca_id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"6ogwzd80ub8bcmp14tsdi2nu3","name":"dostawca_alternatywny_1_id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"4qyqj2mo8r8xnq040qiywieza","name":"dostawca_alternatywny_2_id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"zdgq7v8uir77lszbnpaxlsuwc","name":"dostawca_czas_dostawy","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"lcfo4jip8j80cns24edh824ny","name":"dostawca_alt_1_czas_dostawy","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"kx1sggwmo07wt2dxesjasctss","name":"dostawca_alt_2_czas_dostawy","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"bftipfp2pzqtv1jm9uq28pn0j","name":"wygladzenie","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ucotgbhs7t6l7hb780mkdbe88","name":"wms_item_id","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"i1oofehor78puprqwv5z4hejj","name":"czy_zamowiono","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ygkwptzgufqyri3fiz2qkfng9","name":"dokument_dostawy_wygenerowany","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"3gyqyhtfuqsup97e94jh1hk4p","name":"wartosc_zakupu_31","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"pjoygmnu8fjzzygjfug8g5x03","name":"wartosc_zakupu_93","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"zozcqq6uhifo2rqmlotu513x8","name":"stan_dyspozycyjny_idosell","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"cip1tnstdcz4k8g09u9xs9nw5","name":"stan_dyspozycyjny_idosell_czas_pobrania","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"gjw4h3b4vnus5zn8e572os3by","name":"planowana_data_braku_towaru","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"o3168z4bwfch177u73z794c94","name":"optymalny_zaps_szt","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"qo1nprop3r6is85wx84bt79hd","name":"optymalny_zaps_zl","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"dvh89qhfjldfetaqc9ig753jy","name":"planowana_data_przyjecia","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"h9r5ihgrlncdwpmohoxnemmfc","name":"srednia_sprzedaz_detal","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"o8pyragwx4lb8brfldwz681dw","name":"stan_dyspozycyjny_m1","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"dy4xmcw3lk588i8gl8mftz0u5","name":"stan_dyspozycyjny_m2","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"riq1swkbtifd6e2973d4q67wh","name":"stan_dyspozycyjny_m3","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"9suaobgw8qutzx1ig3xz63yt2","name":"stan_dyspozycyjny_m4","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"ocp5wpwp3lw697waos18tenvc","name":"stan_dyspozycyjny_m5","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"x75hg9frmzpf9mt1gvblw5bvm","name":"stan_dyspozycyjny_m6","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"g3bs3yzrllux70fkqwtowpsqg","name":"stan_dyspozycyjny_m7","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"73cporynhsihaz41tpzmsa24f","name":"stan_dyspozycyjny_m8","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"wnv5imrgl4mzuaythw11kwnx6","name":"stan_dyspozycyjny_m10","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"uz12waj4tn540wwe8kxfu58m5","name":"stan_dyspozycyjny_m11","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"dppywabdg4xrah5riq7cvwzhv","name":"stan_dyspozycyjny_m12","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"p5dptfc2cmglqw0y4wwnxg3r2","name":"stan_dyspozycyjny_m14","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"f15sbk382hi0a4s9ubjsj0vgk","name":"srednia_dzienna_sprzedaz_detal_v2","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"52n5mb5mz41yhw7xjnhhwszqm","name":"srednia_dzienna_sprzedaz_hurt_v2","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"1sew03l6q8k7kdy633q2sa8gf","name":"od_ilu_dni_0_dyspozycyjne_m2","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"xzgcifx7nh5q1wdfnfil7t20z","name":"od_ilu_dni_0_dyspozycyjne_m3","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"qq2djg8mxttrqigmaioxma5l4","name":"od_ilu_dni_0_dyspozycyjne_m8","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"7hr7n6y829cgs9tgwitm5sc9n","name":"sprzedane_31_detal_v2","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"pta430e3gegmjqh1u83qu8om5","name":"sprzedane_31_hurt_v2","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"5dskw6eair64zjxhavt4pozqo","name":"stan_dyspozycyjny_m16","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"81paj9okqmb2jcrsweelnqvn9","name":"dzial_zamawiajacy","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"3mifdjovaeiy2fhre9yv4vtk7","name":"dostepnosc_atrybut","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744}],"indexes":[],"color":"#b0b0b0","isView":true,"isMaterializedView":false,"createdAt":1763990501744,"diagramId":"ee570f764e8c","parentAreaId":"3c7d2957a2a0","width":224,"expanded":false},{"id":"exz2tqw57aas0lh3plykd60s5","name":"v_excel_fact_hours_worked","schema":"reporting","x":3012,"y":-744,"fields":[{"id":"blvvvw7vh0ymabk1wzzpixeei","name":"employee","type":{"id":"string","name":"string"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"0nyfomvyyegooaaeossi2c0si","name":"date","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"nckjz91k5rw4yej3wn8t9p2e0","name":"hours_worked","type":{"id":"numeric","name":"numeric"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"tma8utx5teob222hwjem7lauk","name":"dwh_created_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"u5h67tpsm90k1rqvvo2dfcrh0","name":"dwh_modified_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743}],"indexes":[],"color":"#b0b0b0","isView":true,"isMaterializedView":false,"createdAt":1763990501743,"diagramId":"ee570f764e8c","parentAreaId":"3c7d2957a2a0"},{"id":"kc981eyj8dvp79ryspcrjsfjt","name":"v_fact_history","x":2631,"y":-750,"fields":[{"id":"11vuw9tozyrlqcdwo7jh2gz1h","name":"id_stock","type":{"id":"int64","name":"int64"},"unique":true,"nullable":false,"primaryKey":true,"createdAt":1765195421482},{"id":"x2lfcqzp1vgnz41slb43pfhed","name":"id_prod","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765195624756},{"id":"1v7px8tajb2zfl4y8neipb6a5","name":"quantity","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765195638206},{"id":"gk7zvwthvz7uo0f7mpvc12nkz","name":"stock_value","type":{"id":"float64","name":"float64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765195643871},{"id":"iauxjbylvgp8hsni8vkkquy1q","name":"quantity_available","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765195650594},{"id":"y4gby1n38j26kr5h0opxoo5lp","name":"quantity_available_value","type":{"id":"float64","name":"float64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765195670377}],"indexes":[{"id":"ef8rzcdkxvx2xcsu9pjzk4yaq","name":"pk_table_104_id","fieldIds":["11vuw9tozyrlqcdwo7jh2gz1h"],"unique":true,"isPrimaryKey":true,"createdAt":1765195421482}],"color":"#b0b0b0","createdAt":1765195421482,"isView":true,"order":103,"schema":"reporting","parentAreaId":"3c7d2957a2a0","diagramId":"ee570f764e8c"},{"id":"kctanox6k2vooyeccq880l750","name":"v_limit_table","x":3349,"y":-761,"fields":[{"id":"pl6so405ptxvgvehjgjfrq5jz","name":"date","type":{"id":"date","name":"date"},"unique":true,"nullable":false,"primaryKey":true,"createdAt":1765196599539},{"id":"be83xx25u34yci0n9mvkuwl3s","name":"department","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196684872},{"id":"nxvtb7ida3x4dfxaopr9yh015","name":"wartosc_zamowien_nieoplaconych","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196690650},{"id":"vufypmo8lmypi8g0ftjzxs840","name":"wartosc_magazynu","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196697674},{"id":"qlrj1n6adzp1jr8qim3edyr0n","name":"wartosc_towarow_w_drodze","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196701511},{"id":"m8zzs6i8toyzm62b0lcbtsg5y","name":"limit","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196706551},{"id":"revkdpyc9ce33932p0bqulehq","name":"wartosc_zlozonych_zamowien","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196709415},{"id":"2fl7ioq85hyknz343k2yw54zx","name":"wykorzystanie_limitu","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765196716821}],"indexes":[{"id":"3ukfyh5ssrgvuzovtgo889fe5","name":"pk_table_104_id","fieldIds":["pl6so405ptxvgvehjgjfrq5jz"],"unique":true,"isPrimaryKey":true,"createdAt":1765196599539}],"color":"#b0b0b0","createdAt":1765196599539,"isView":true,"order":103,"schema":"reporting","diagramId":"ee570f764e8c","parentAreaId":"3c7d2957a2a0"},{"id":"kuq6rp4pcy692r81fv7gzxj66","name":"v_dim_offers","schema":"reporting","x":2677,"y":-1253,"fields":[{"id":"oj856uan2zn0ugn4ogsxwvbti","name":"id_offer","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"4z34eyttqd1qsrt2qwvqmh97r","name":"id_prod","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"8bkki8we2fpav8jsen2lsoifp","name":"shop","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"bbjaynx26kb66wbhh3cpxhlrm","name":"start_date","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"ndjn3ogkuqdyxm1iemz0v0bw1","name":"end_date","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"3jjxsel8md1n233da73sdyjmq","name":"offer_discount","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"mjqi7kde0xb46mqnifm28rdq4","name":"dwh_created_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743},{"id":"su9ey43rw0zlftxxz9grpudnm","name":"dwh_modified_at","type":{"id":"datetime","name":"datetime"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501743}],"indexes":[],"color":"#b0b0b0","isView":true,"isMaterializedView":false,"createdAt":1763990501743,"diagramId":"ee570f764e8c","parentAreaId":"3c7d2957a2a0"},{"id":"la8abk9zhcli83cdtw8xd1ecf","name":"wms_dim_products_history","schema":"reporting","x":1395,"y":-1166,"fields":[{"id":"rknfchbhxk1ujs1q1y6ew36di","name":"iai_id_prod","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"kmmzdszo23ak3xbwhoni88zdw","name":"wms_id_prod","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744},{"id":"5baaq93izkuwclwqw6r9811v5","name":"ean","type":{"id":"int64","name":"int64"},"primaryKey":false,"unique":false,"nullable":true,"increment":false,"isArray":false,"createdAt":1763990501744}],"indexes":[],"color":"#8eb7ff","isView":false,"isMaterializedView":false,"createdAt":1763990501744,"diagramId":"ee570f764e8c","parentAreaId":null,"expanded":true,"width":245},{"id":"z422yw3ofycp6wtve9p0o34sv","name":"v_dim_products","x":2684,"y":-263,"fields":[{"id":"njh0av4adz7u1aqyqs9pxxs0f","name":"store","type":{"id":"int64","name":"int64"},"unique":true,"nullable":false,"primaryKey":true,"createdAt":1765200295259},{"id":"pf0ax394h6u5vuwy98mblzf3e","name":"iai_id_prod","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200341491},{"id":"ixqpukstti25z3acg0wtcgq6x","name":"wms_id_prod","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200349152},{"id":"y8tsw57ikl80wdmiudkpgxdck","name":"prod_name","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200355586},{"id":"tw2tvh6z0ao9i7v12ok99t59n","name":"ean","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200363448},{"id":"q4zpfzu0oc9u4kyvig3pdakxo","name":"brand","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200369069},{"id":"rkd5x4s923gd0nyli0e9707f3","name":"primary_supplier","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200374925},{"id":"6sdetn3l710f18tbte6agzxhh","name":"purchaser","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200386185},{"id":"xaa7x3694g6brwvr8jlu5wjlp","name":"visibility","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200393667},{"id":"ijj3t3dt5cov4bhrkv1qinwdn","name":"wk_status","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200402158}],"indexes":[{"id":"ux6jglqcbc8xwriy40csa4r3j","name":"pk_table_105_id","fieldIds":["njh0av4adz7u1aqyqs9pxxs0f"],"unique":true,"isPrimaryKey":true,"createdAt":1765200295259}],"color":"#b0b0b0","createdAt":1765200295259,"isView":true,"order":104,"schema":"reporting","parentAreaId":"3c7d2957a2a0","diagramId":"ee570f764e8c"},{"id":"zs3va9l5vk8hpcasbk31hjbpf","name":"v_saldeo_invoices","x":3653,"y":-743,"fields":[{"id":"1rbb8m2ysqr6kx5ct4rxx98is","name":"document_id","type":{"id":"int64","name":"int64"},"unique":true,"nullable":false,"primaryKey":true,"createdAt":1765200445463},{"id":"7wlmg57z84pob10aadxnt5pt7","name":"invoice_no","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200603397},{"id":"mrf1xrfoaohacoblgp0qx9toq","name":"posting_date","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200615305},{"id":"itlcv7jmqjcylztdqqxlf0as3","name":"issue_date","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200623453},{"id":"0uqmmkeb021dne3yntsxpml94","name":"account","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200629267},{"id":"qoh0k21fhxwxz8likwygjywag","name":"value","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200633225},{"id":"ore3qf354akhxgwxbsd8viu9n","name":"description","type":{"id":"int64","name":"int64"},"unique":false,"nullable":true,"primaryKey":false,"createdAt":1765200639325}],"indexes":[{"id":"bxoy0klnlikwh0wzbga717r1v","name":"pk_table_106_id","fieldIds":["1rbb8m2ysqr6kx5ct4rxx98is"],"unique":true,"isPrimaryKey":true,"createdAt":1765200445463}],"color":"#b0b0b0","createdAt":1765200445463,"isView":true,"order":105,"schema":"reporting","parentAreaId":"3c7d2957a2a0","diagramId":"ee570f764e8c"}],"relationships":[{"id":"m8vh59qvvt1fcht0bt4plifyi","name":"wms_item_ean_code_fk","sourceSchema":"clean","sourceTableId":"4ar0wqk9p8uao27desm3uicnh","targetSchema":"reporting","targetTableId":"la8abk9zhcli83cdtw8xd1ecf","sourceFieldId":"h4xw4k74c92j8we5xqyuama1h","targetFieldId":"5baaq93izkuwclwqw6r9811v5","sourceCardinality":"one","targetCardinality":"one","createdAt":1765201247296,"diagramId":"ee570f764e8c"},{"id":"q8zjxicc5o8tmf0lcvub0qr8u","name":"wms_item_id_fk","sourceSchema":"clean","sourceTableId":"4ar0wqk9p8uao27desm3uicnh","targetSchema":"reporting","targetTableId":"la8abk9zhcli83cdtw8xd1ecf","sourceFieldId":"ry3l377zs3rzgw5boxt2gvfrr","targetFieldId":"kmmzdszo23ak3xbwhoni88zdw","sourceCardinality":"one","targetCardinality":"one","createdAt":1765201235426,"diagramId":"ee570f764e8c"},{"id":"1qyrc0xmvdunurk3fgok1znnh","name":"wms_item_symbol_fk","sourceSchema":"clean","sourceTableId":"4ar0wqk9p8uao27desm3uicnh","targetSchema":"reporting","targetTableId":"la8abk9zhcli83cdtw8xd1ecf","sourceFieldId":"0uc3ksoc67sobp77ky20day3k","targetFieldId":"rknfchbhxk1ujs1q1y6ew36di","sourceCardinality":"one","targetCardinality":"one","createdAt":1765201238826,"diagramId":"ee570f764e8c"}],"dependencies":[{"id":"9nle0dtxzzw0421t6il80ey6w","tableId":"la8abk9zhcli83cdtw8xd1ecf","dependentTableId":"z422yw3ofycp6wtve9p0o34sv","dependentSchema":"reporting","schema":"reporting","createdAt":1765200412900,"diagramId":"ee570f764e8c"}],"storageMode":"project","lastProjectSavedAt":"2025-12-17T16:08:21.398Z","areas":[],"creationMethod":"imported","customTypes":[],"notes":[]} \ No newline at end of file diff --git a/src/lib/dbml/dbml-export/__tests__/export-sql-dbml-cases.test.ts b/src/lib/dbml/dbml-export/__tests__/export-sql-dbml-cases.test.ts index 0d9c3a5b..274df289 100644 --- a/src/lib/dbml/dbml-export/__tests__/export-sql-dbml-cases.test.ts +++ b/src/lib/dbml/dbml-export/__tests__/export-sql-dbml-cases.test.ts @@ -74,4 +74,8 @@ describe('DBML Export cases', () => { testCase('6'); } ); + + it('should handle case 7 diagram', { timeout: 30000 }, async () => { + testCase('7'); + }); }); diff --git a/src/lib/dbml/dbml-export/dbml-export.ts b/src/lib/dbml/dbml-export/dbml-export.ts index 9ffd8d68..8450d4a7 100644 --- a/src/lib/dbml/dbml-export/dbml-export.ts +++ b/src/lib/dbml/dbml-export/dbml-export.ts @@ -218,6 +218,41 @@ export const sanitizeSQLforDBML = (sql: string): string => { return sanitized; }; +// Find the matching closing bracket, properly handling quoted strings within brackets +const findClosingBracket = (str: string, openBracketIndex: number): number => { + let i = openBracketIndex + 1; + const len = str.length; + + while (i < len) { + const char = str[i]; + + if (char === ']') return i; + + // Skip quoted strings (triple, single, or double) + if (char === "'" || char === '"') { + const isTriple = + char === "'" && str[i + 1] === "'" && str[i + 2] === "'"; + const quote = isTriple ? "'''" : char; + const quoteLen = quote.length; + i += quoteLen; + + while (i < len) { + if (str[i] === '\\') { + i += 2; // Skip escaped char + } else if (str.startsWith(quote, i)) { + i += quoteLen; + break; + } else { + i++; + } + } + continue; + } + i++; + } + return -1; +}; + // Post-process DBML to convert separate Ref statements to inline refs const convertToInlineRefs = (dbml: string): string => { // Extract all Ref statements - Updated pattern to handle schema.table.field format @@ -372,59 +407,49 @@ const convertToInlineRefs = (dbml: string): string => { // 2. Apply all refs to fields fieldRefs.forEach((fieldData, fieldKey) => { - // fieldKey might be "schema.table.field" or just "table.field" const lastDotIndex = fieldKey.lastIndexOf('.'); const tableName = fieldKey.substring(0, lastDotIndex); const fieldName = fieldKey.substring(lastDotIndex + 1); const tableData = tableMap.get(tableName); - if (tableData) { - // Updated pattern to capture field definition and all existing attributes in brackets - const fieldPattern = new RegExp( - `^([ \t]*"${fieldName}"[^\\n]*?)(?:\\s*(\\[[^\\]]*\\]))*\\s*(//.*)?$`, - 'gm' - ); - let newContent = tableData.content; + if (!tableData) return; - newContent = newContent.replace( - fieldPattern, - (lineMatch, fieldPart, existingBrackets, commentPart) => { - // Collect all attributes from existing brackets - const allAttributes: string[] = []; - if (existingBrackets) { - // Extract all bracket contents - const bracketPattern = /\[([^\]]*)\]/g; - let bracketMatch; - while ( - (bracketMatch = bracketPattern.exec(lineMatch)) !== - null - ) { - const content = bracketMatch[1].trim(); - if (content) { - allAttributes.push(content); - } - } - } + const fieldStartPattern = new RegExp(`^([ \\t]*)"${fieldName}"\\s+`); + const lines = tableData.content.split('\n'); + let modified = false; - // Add all refs for this field - allAttributes.push(...fieldData.refs); + const newLines = lines.map((line) => { + const match = fieldStartPattern.exec(line); + if (!match) return line; - // Combine all attributes into a single bracket - const combinedAttributes = allAttributes.join(', '); + modified = true; + const leadingSpaces = match[1]; + const bracketStart = line.indexOf('['); - // Preserve original spacing from fieldPart - const leadingSpaces = fieldPart.match(/^(\s*)/)?.[1] || ''; - const fieldDefWithoutSpaces = fieldPart.trim(); + // Extract field definition (before bracket) and existing attributes + const fieldDef = + bracketStart !== -1 + ? line.substring(0, bracketStart).trim() + : line.trim(); - return `${leadingSpaces}${fieldDefWithoutSpaces} [${combinedAttributes}]${commentPart || ''}`; - } - ); + const existingContent = + bracketStart !== -1 + ? line.substring( + bracketStart + 1, + findClosingBracket(line, bracketStart) + ) + : null; - // Update the table content if modified - if (newContent !== tableData.content) { - tableData.content = newContent; - tableMap.set(tableName, tableData); - } + const attributes = existingContent + ? [existingContent.trim(), ...fieldData.refs] + : fieldData.refs; + + return `${leadingSpaces}${fieldDef} [${attributes.join(', ')}]`; + }); + + if (modified) { + tableData.content = newLines.join('\n'); + tableMap.set(tableName, tableData); } });