From 021dda1e9b6c88c1cd92441c30846748e998a856 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 14:37:48 +0800 Subject: [PATCH 1/7] build: add @zenuml/core dependency --- package.json | 1 + pnpm-lock.yaml | 897 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 893 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ccbe52b..f6576e7 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@lezer/common": "^1.2.1", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.4.0", + "@zenuml/core": "3.43.3", "thememirror": "^2.0.1" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c852c..6f1d903 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@lezer/lr': specifier: ^1.4.0 version: 1.4.2 + '@zenuml/core': + specifier: 3.43.3 + version: 3.43.3(yaml@2.7.1) thememirror: specifier: ^2.0.1 version: 2.0.1(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.5) @@ -71,16 +74,20 @@ importers: version: 5.7.3 vite: specifier: ^6.2.0 - version: 6.3.2(@types/node@20.17.30)(yaml@2.7.1) + version: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(yaml@2.7.1) vite-plugin-dts: specifier: ^3.7.2 - version: 3.9.1(@types/node@20.17.30)(rollup@4.40.0)(typescript@5.7.3)(vite@6.3.2(@types/node@20.17.30)(yaml@2.7.1)) + version: 3.9.1(@types/node@20.17.30)(rollup@4.40.0)(typescript@5.7.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(yaml@2.7.1)) vitest: specifier: ^1.4.0 version: 1.6.1(@types/node@20.17.30)(happy-dom@17.4.4) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -460,13 +467,63 @@ packages: cpu: [x64] os: [win32] + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.16': + resolution: {integrity: sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@headlessui/react@2.2.9': + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + '@headlessui/tailwindcss@0.2.2': + resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} + engines: {node: '>=10'} + peerDependencies: + tailwindcss: ^3.0 || ^4.0 + '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@lezer/common@1.2.3': resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} @@ -496,6 +553,55 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@react-aria/focus@3.21.3': + resolution: {integrity: sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.26.0': + resolution: {integrity: sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.32.0': + resolution: {integrity: sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.11.0': + resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.32.1': + resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@rollup/pluginutils@5.1.4': resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} engines: {node: '>=14.0.0'} @@ -630,6 +736,18 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tanstack/react-virtual@3.13.14': + resolution: {integrity: sha512-WG0d7mBD54eA7dgA3+sO5csS0B49QKqM6Gy5Rf31+Oq/LTKROQSao9m2N/vz1IqVragOKU5t5k1LAcqh/DfTxw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.14': + resolution: {integrity: sha512-b5Uvd8J2dc7ICeX9SRb/wkCxWk7pUwN214eEPAQsqrsktSKTCmyLxOQWSMgogBByXclZeAdgZ3k4o0fIYUIBqQ==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -639,6 +757,9 @@ packages: '@types/node@20.17.30': resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@vitest/expect@1.6.1': resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} @@ -680,6 +801,14 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@zenuml/core@3.43.3': + resolution: {integrity: sha512-GcjQ73YAR/NAKIJDC3NAueQQ/5EbJOYVpnHjpVIXaLPqs8b046dqwV8q/7q2+E4EIfZGKER2HvC3BRc3JprQ7Q==} + engines: {node: '>=20'} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -708,19 +837,36 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + antlr4@4.11.0: + resolution: {integrity: sha512-GUGlpE2JUjAN+G8G5vY+nOoeyNhHsXoIJwP1XF1oRw89vifA1K46T6SEkwLwr7drihN7I/lf0DIjKc4OZvBX8w==} + engines: {node: '>=14'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -735,10 +881,17 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} @@ -754,6 +907,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -762,9 +918,21 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + codemirror@6.0.1: resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -772,6 +940,10 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -792,6 +964,11 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -808,10 +985,19 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -839,9 +1025,17 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -849,9 +1043,20 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fdir@6.4.4: resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -891,6 +1096,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -914,6 +1123,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + html-to-image@1.11.13: + resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -923,9 +1138,15 @@ packages: engines: {node: '>=18'} hasBin: true + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -965,9 +1186,31 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jotai@2.16.1: + resolution: {integrity: sha512-vrHcAbo3P7Br37C8Bv6JshMtlKMPqqmx0DDREtTjT4nf3QChDrYdbH+4ik/9V0cXA57dK28RkJ5dctYvavcIlg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@babel/core': '>=7.0.0' + '@babel/template': '>=7.0.0' + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@babel/template': + optional: true + '@types/react': + optional: true + react: + optional: true + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -984,6 +1227,9 @@ packages: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lint-staged@15.5.1: resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} @@ -1022,9 +1268,18 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1056,6 +1311,9 @@ packages: muggle-string@0.3.1: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1074,6 +1332,18 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} @@ -1086,6 +1356,9 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -1125,9 +1398,70 @@ packages: engines: {node: '>=0.10'} hasBin: true + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -1136,6 +1470,13 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -1143,13 +1484,46 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radash@12.1.1: + resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==} + engines: {node: '>=14.18.0'} + + ramda@0.28.0: + resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} + + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} @@ -1162,6 +1536,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -1170,6 +1548,19 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -1207,6 +1598,9 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1215,6 +1609,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1232,6 +1630,9 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} @@ -1250,6 +1651,11 @@ packages: style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1262,6 +1668,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} + engines: {node: '>=14.0.0'} + hasBin: true + thememirror@2.0.1: resolution: {integrity: sha512-d5i6FVvWWPkwrm4cHLI3t9AT1OrkAt7Ig8dtdYSofgF7C/eiyNuq6zQzSTusWTde3jpW9WLvA9J/fzNKMUsd0w==} peerDependencies: @@ -1269,6 +1686,16 @@ packages: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1292,6 +1719,12 @@ packages: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -1322,6 +1755,14 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + validator@13.15.0: resolution: {integrity: sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA==} engines: {node: '>= 0.10'} @@ -1490,6 +1931,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} @@ -1727,12 +2170,71 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@floating-ui/react@0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/utils': 0.2.10 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tabbable: 6.3.0 + + '@floating-ui/react@0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/utils': 0.2.10 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tabbable: 6.3.0 + + '@floating-ui/utils@0.2.10': {} + + '@headlessui/react@2.2.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react': 0.26.28(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/focus': 3.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/interactions': 3.26.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-virtual': 3.13.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + use-sync-external-store: 1.6.0(react@19.2.3) + + '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.19(yaml@2.7.1))': + dependencies: + tailwindcss: 3.4.19(yaml@2.7.1) + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@lezer/common@1.2.3': {} '@lezer/generator@1.7.3': @@ -1785,6 +2287,67 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@react-aria/focus@3.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/interactions': 3.26.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-aria/utils': 3.32.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-types/shared': 3.32.1(react@19.2.3) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-aria/interactions@3.26.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.2.3) + '@react-aria/utils': 3.32.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.1(react@19.2.3) + '@swc/helpers': 0.5.18 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-aria/ssr@3.9.10(react@19.2.3)': + dependencies: + '@swc/helpers': 0.5.18 + react: 19.2.3 + + '@react-aria/utils@3.32.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.2.3) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.11.0(react@19.2.3) + '@react-types/shared': 3.32.1(react@19.2.3) + '@swc/helpers': 0.5.18 + clsx: 2.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.18 + + '@react-stately/utils@3.11.0(react@19.2.3)': + dependencies: + '@swc/helpers': 0.5.18 + react: 19.2.3 + + '@react-types/shared@3.32.1(react@19.2.3)': + dependencies: + react: 19.2.3 + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': dependencies: '@types/estree': 1.0.7 @@ -1887,6 +2450,18 @@ snapshots: '@sinclair/typebox@0.27.8': {} + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@tanstack/react-virtual@3.13.14(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@tanstack/virtual-core': 3.13.14 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + + '@tanstack/virtual-core@3.13.14': {} + '@types/argparse@1.0.38': {} '@types/estree@1.0.7': {} @@ -1895,6 +2470,9 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/trusted-types@2.0.7': + optional: true + '@vitest/expect@1.6.1': dependencies: '@vitest/spy': 1.6.1 @@ -1966,6 +2544,41 @@ snapshots: '@vue/shared@3.5.13': {} + '@zenuml/core@3.43.3(yaml@2.7.1)': + dependencies: + '@floating-ui/react': 0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@headlessui/react': 2.2.9(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.19(yaml@2.7.1)) + antlr4: 4.11.0 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + color-string: 2.1.4 + dompurify: 3.3.1 + highlight.js: 10.7.3 + html-to-image: 1.11.13 + immer: 10.2.0 + jotai: 2.16.1(react@19.2.3) + lodash: 4.17.21 + marked: 4.3.0 + pako: 2.1.0 + pino: 8.21.0 + radash: 12.1.1 + ramda: 0.28.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tailwind-merge: 3.4.0 + tailwindcss: 3.4.19(yaml@2.7.1) + transitivePeerDependencies: + - '@babel/core' + - '@babel/template' + - '@types/react' + - tsx + - yaml + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-walk@8.3.4: dependencies: acorn: 8.14.1 @@ -1989,19 +2602,29 @@ snapshots: ansi-styles@6.2.1: {} + antlr4@4.11.0: {} + + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@5.0.2: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 assertion-error@1.1.0: {} + atomic-sleep@1.0.0: {} + balanced-match@1.0.2: {} + base64-js@1.5.1: {} + binary-extensions@2.3.0: {} brace-expansion@1.1.11: @@ -2017,8 +2640,15 @@ snapshots: dependencies: fill-range: 7.1.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + cac@6.7.14: {} + camelcase-css@2.0.1: {} + chai@4.5.0: dependencies: assertion-error: 1.1.0 @@ -2047,6 +2677,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -2056,6 +2690,8 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + clsx@2.1.1: {} + codemirror@6.0.1: dependencies: '@codemirror/autocomplete': 6.18.6 @@ -2066,10 +2702,18 @@ snapshots: '@codemirror/state': 6.5.2 '@codemirror/view': 6.36.5 + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + colorette@2.0.20: {} commander@13.1.0: {} + commander@4.1.1: {} + commander@9.5.0: optional: true @@ -2087,6 +2731,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cssesc@3.0.0: {} + de-indent@1.0.2: {} debug@4.4.0(supports-color@5.5.0): @@ -2099,8 +2745,16 @@ snapshots: dependencies: type-detect: 4.1.0 + didyoumean@1.2.2: {} + diff-sequences@29.6.3: {} + dlv@1.1.3: {} + + dompurify@3.3.1: + optionalDependencies: + '@types/trusted-types': 2.0.7 + emoji-regex@10.4.0: {} entities@4.5.0: {} @@ -2167,8 +2821,12 @@ snapshots: dependencies: '@types/estree': 1.0.7 + event-target-shim@5.0.1: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -2183,8 +2841,22 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + fast-redact@3.5.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -2214,6 +2886,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + graceful-fs@4.2.11: {} happy-dom@17.4.4: @@ -2231,12 +2907,20 @@ snapshots: he@1.2.0: {} + highlight.js@10.7.3: {} + + html-to-image@1.11.13: {} + human-signals@5.0.0: {} husky@9.1.7: {} + ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} + immer@10.2.0: {} + import-lazy@4.0.0: {} is-binary-path@2.1.0: @@ -2265,8 +2949,14 @@ snapshots: isexe@2.0.0: {} + jiti@1.21.7: {} + jju@1.4.0: {} + jotai@2.16.1(react@19.2.3): + optionalDependencies: + react: 19.2.3 + js-tokens@9.0.1: {} json-schema-traverse@0.4.1: {} @@ -2279,6 +2969,8 @@ snapshots: lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + lint-staged@15.5.1: dependencies: chalk: 5.4.1 @@ -2334,8 +3026,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + marked@4.3.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2368,6 +3064,12 @@ snapshots: muggle-string@0.3.1: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} nodemon@3.1.9: @@ -2389,6 +3091,12 @@ snapshots: dependencies: path-key: 4.0.0 + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + on-exit-leak-free@2.1.2: {} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -2401,6 +3109,8 @@ snapshots: dependencies: yocto-queue: 1.2.1 + pako@2.1.0: {} + path-browserify@1.0.1: {} path-key@3.1.1: {} @@ -2423,12 +3133,69 @@ snapshots: pidtree@0.6.0: {} + pify@2.3.0: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.7.0 + split2: 4.2.0 + + pino-std-serializers@6.2.2: {} + + pino@8.21.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + + pirates@4.0.7: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 mlly: 1.7.4 pathe: 2.0.3 + postcss-import@15.1.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.1.0(postcss@8.5.3): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.3 + + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 1.21.7 + postcss: 8.5.3 + yaml: 2.7.1 + + postcss-nested@6.2.0(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + postcss@8.5.3: dependencies: nanoid: 3.3.11 @@ -2441,16 +3208,49 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + process-warning@3.0.0: {} + + process@0.11.10: {} + pstree.remy@1.1.8: {} punycode@2.3.1: {} + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + radash@12.1.1: {} + + ramda@0.28.0: {} + + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + react-is@18.3.1: {} + react@19.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 + real-require@0.2.0: {} + resolve@1.19.0: dependencies: is-core-module: 2.16.1 @@ -2467,6 +3267,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + reusify@1.1.0: {} + rfdc@1.4.1: {} rollup@4.40.0: @@ -2495,6 +3297,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + scheduler@0.27.0: {} + semver@7.5.4: dependencies: lru-cache: 6.0.0 @@ -2525,10 +3337,16 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map@0.6.1: {} + split2@4.2.0: {} + sprintf-js@1.0.3: {} stackback@0.0.2: {} @@ -2543,6 +3361,10 @@ snapshots: get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@7.1.0: dependencies: ansi-regex: 6.1.0 @@ -2557,6 +3379,16 @@ snapshots: style-mod@4.1.2: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.13 + ts-interface-checker: 0.1.13 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -2567,12 +3399,56 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tabbable@6.3.0: {} + + tailwind-merge@3.4.0: {} + + tailwindcss@3.4.19(yaml@2.7.1): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.1.0(postcss@8.5.3) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.3)(yaml@2.7.1) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.1 + transitivePeerDependencies: + - tsx + - yaml + thememirror@2.0.1(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.36.5): dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 '@codemirror/view': 6.36.5 + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + tinybench@2.9.0: {} tinyglobby@0.2.13: @@ -2590,6 +3466,10 @@ snapshots: touch@3.1.1: {} + ts-interface-checker@0.1.13: {} + + tslib@2.8.1: {} + type-detect@4.1.0: {} typescript@5.4.2: {} @@ -2608,6 +3488,12 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.6.0(react@19.2.3): + dependencies: + react: 19.2.3 + + util-deprecate@1.0.2: {} + validator@13.15.0: {} vite-node@1.6.1(@types/node@20.17.30): @@ -2628,7 +3514,7 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.17.30)(rollup@4.40.0)(typescript@5.7.3)(vite@6.3.2(@types/node@20.17.30)(yaml@2.7.1)): + vite-plugin-dts@3.9.1(@types/node@20.17.30)(rollup@4.40.0)(typescript@5.7.3)(vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(yaml@2.7.1)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.17.30) '@rollup/pluginutils': 5.1.4(rollup@4.40.0) @@ -2639,7 +3525,7 @@ snapshots: typescript: 5.7.3 vue-tsc: 1.8.27(typescript@5.7.3) optionalDependencies: - vite: 6.3.2(@types/node@20.17.30)(yaml@2.7.1) + vite: 6.3.2(@types/node@20.17.30)(jiti@1.21.7)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - rollup @@ -2654,7 +3540,7 @@ snapshots: '@types/node': 20.17.30 fsevents: 2.3.3 - vite@6.3.2(@types/node@20.17.30)(yaml@2.7.1): + vite@6.3.2(@types/node@20.17.30)(jiti@1.21.7)(yaml@2.7.1): dependencies: esbuild: 0.25.2 fdir: 6.4.4(picomatch@4.0.2) @@ -2665,6 +3551,7 @@ snapshots: optionalDependencies: '@types/node': 20.17.30 fsevents: 2.3.3 + jiti: 1.21.7 yaml: 2.7.1 vitest@1.6.1(@types/node@20.17.30)(happy-dom@17.4.4): From 0c4dbd6e5a2dd64a69eceaf7d6ec636c7799f172 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 15:37:29 +0800 Subject: [PATCH 2/7] refactor(zenuml-linter): replace custom validation with zenuml core parser The linter now uses the @zenuml/core parser for validation instead of maintaining custom validation logic. This simplifies the code and ensures consistency with the official parser's behavior. The change also makes the linter async to support the parser's async API. --- src/extensions/zenuml-linter.ts | 260 +++++--------------------------- 1 file changed, 40 insertions(+), 220 deletions(-) diff --git a/src/extensions/zenuml-linter.ts b/src/extensions/zenuml-linter.ts index 46a26f2..35f3c75 100644 --- a/src/extensions/zenuml-linter.ts +++ b/src/extensions/zenuml-linter.ts @@ -1,236 +1,56 @@ -import { syntaxTree } from '@codemirror/language'; import { type Diagnostic, linter } from '@codemirror/lint'; import type { EditorView } from '@codemirror/view'; -import type { SyntaxNodeRef, Tree } from '@lezer/common'; - -// Import the shared participant state logic -import { getParticipants } from './zenuml-participant-manager'; - -interface ParticipantDefLocation { - node: SyntaxNodeRef; - // We might not need isDefined here if we solely rely on getParticipants for existence -} - -const BraceBlockTypes = ['BraceBlock', 'GroupBraceBlock', 'StatementBraceBlock']; - -function checkDocument(view: EditorView): Diagnostic[] { +// @ts-ignore +import Zenuml from '@zenuml/core'; +const zenuml = new Zenuml(document.createElement('div')); +async function checkDocument(view: EditorView): Promise { const diagnostics: Diagnostic[] = []; - const tree = syntaxTree(view.state); - - // Get the set of defined participant names from the shared state - const definedParticipantNames = getParticipants(view.state); + const doc = view.state.doc.toString(); + const result = await zenuml.parse(doc); + // If the parse result contains syntax errors, add them to diagnostics + if (result && result.errorDetails && Array.isArray(result.errorDetails) && result.errorDetails.length > 0) { + // Only process the first error detail + const error = result.errorDetails[0]; + // Convert line/column to position in the document + // Note: line is 1-indexed, column is 0-indexed in the ParseResult + const line = error.line - 1; // Convert to 0-indexed + const column = error.column; + + // Calculate the position in the document + const lines = doc.split('\n'); + if (line >= 0 && line < lines.length) { + // Calculate the character position based on line and column + let position = 0; + for (let i = 0; i < line; i++) { + position += lines[i].length + 1; // +1 for newline character + } + const from = position + column; + const to = from + 1; // Default to single character at the error position - // This map can still be useful if we need the exact node for defined participants, - // e.g., for "unused participant" warnings at their definition site (not currently implemented). - // For checking existence in messages, `definedParticipantNames` is now the source of truth. - const participantDefinitionLocations = new Map(); - - const cursor = tree.cursor(); - - // First pass: collect participant definition locations (optional if only existence is needed for messages) - // This pass is kept for now in case node locations are needed for future diagnostics on definitions. - cursor.iterate((nodeRef: SyntaxNodeRef) => { - if (nodeRef.type.name === 'Participant') { - const participantSyntaxNode = nodeRef.node; - let childNode = participantSyntaxNode.lastChild; - while (childNode) { - if (childNode.type.name === 'Name' || childNode.type.name === 'Identifier') { - const participantName = view.state.doc.sliceString(childNode.from, childNode.to); - if (participantName && definedParticipantNames.has(participantName)) { - // Store it only if it's recognized by the shared state, mostly for its node. - participantDefinitionLocations.set(participantName, { - node: nodeRef, - }); - } - break; - } - childNode = childNode.prevSibling; - } + diagnostics.push({ + from, + to, + severity: 'error', + message: error.msg || 'Syntax error in zenuml diagram', + }); } - }); + } - // Second pass: validate the zenuml diagram - cursor.iterate((nodeRef: SyntaxNodeRef) => { - // Check for syntax errors - if (nodeRef.type.isError && nodeRef.type.name !== '⚠') { + // If parsing failed overall, add a general error + if (result && !result.pass) { + // If there were no specific error details, add a general error + if (!result.errorDetails || result.errorDetails.length === 0) { diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, + from: 0, + to: doc.length, severity: 'error', message: 'Syntax error in zenuml diagram', }); } - - if (nodeRef.type.name === 'Color') { - const colorText = view.state.doc.sliceString(nodeRef.from, nodeRef.to); - if (!validateColorHexCode(colorText)) { - diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, - severity: 'error', - message: 'Invalid color format', - }); - } - } - - // Check message participants - if (nodeRef.type.name === 'AsyncMessage') { - let fromNode: SyntaxNodeRef | null = null; - let toNode: SyntaxNodeRef | null = null; - - let n = nodeRef.node.firstChild; - while (n) { - if (n.type.name === 'From') { - fromNode = n.node; - } - if (n.type.name === 'To') { - toNode = n.node; - } - n = n.nextSibling; - } - - if (fromNode) { - const fromParticipant = view.state.doc.sliceString(fromNode.from, fromNode.to); - if (fromParticipant === '') { - diagnostics.push({ - from: fromNode.from, - to: fromNode.to, - severity: 'error', - message: 'Missing From participant', - }); - } else if (!definedParticipantNames.has(fromParticipant)) { - diagnostics.push({ - from: fromNode.from, - to: fromNode.to, - severity: 'warning', - message: `Undefined participant: ${fromParticipant}`, - }); - } - } - - if (!toNode) { - diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, - severity: 'error', - message: 'Missing To participant', - }); - } else { - const toParticipant = view.state.doc.sliceString(toNode.from, toNode.to); - if (toParticipant === '') { - diagnostics.push({ - from: toNode.from, - to: toNode.to, - severity: 'error', - message: 'Missing To participant', - }); - } else if (!definedParticipantNames.has(toParticipant)) { - diagnostics.push({ - from: toNode.from, - to: toNode.to, - severity: 'warning', - message: `Undefined participant: ${toParticipant}`, - }); - } - } - } - - // // Check for empty blocks - if (BraceBlockTypes.includes(nodeRef.type.name)) { - if (isEmptyBlock(nodeRef.node.toTree())) { - diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, - severity: 'info', - message: 'Empty block', - }); - } - } - - if (nodeRef.type.name === 'Condition') { - if (isEmptyCondition(nodeRef.node.toTree())) { - diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, - severity: 'info', - message: 'Empty condition', - }); - } - } - - // Check for unclosed stereotypes - if (nodeRef.type.name === 'Stereotype') { - const stereotypeText = view.state.doc.sliceString(nodeRef.from, nodeRef.to); - if (stereotypeText.startsWith('<<') && !stereotypeText.endsWith('>>')) { - diagnostics.push({ - from: nodeRef.from, - to: nodeRef.to, - severity: 'error', - message: 'Unclosed stereotype', - }); - } - } - }); - - return diagnostics; -} - -function validateColorHexCode(colorText: string): boolean { - return /^#([0-9a-fA-F]{6})$/.test(colorText); -} - -const listOfEmptyBlockTypes = ['Newline', 'OpenBrace', 'CloseBrace', '⚠', ...BraceBlockTypes]; -function isEmptyBlock(node: Tree): boolean { - let isEmpty = true; - try { - node.cursor().iterate( - (child: SyntaxNodeRef) => { - if (!listOfEmptyBlockTypes.includes(child.type.name)) { - isEmpty = false; - throw new Error('Not an empty block'); - } - }, - (child: SyntaxNodeRef) => { - if (!listOfEmptyBlockTypes.includes(child.type.name)) { - isEmpty = false; - throw new Error('Not an empty block'); - } - } - ); - - return isEmpty; - // biome-ignore lint/correctness/noUnusedVariables: Catching and ignoring the error to determine if block is empty - } catch (e) { - return isEmpty; - } -} - -const booleanKeywords = ['TrueKeyword', 'FalseKeyword', 'NullKeyword', 'UndefinedKeyword']; -function isEmptyCondition(node: Tree): boolean { - let isEmpty = true; - try { - node.cursor().iterate( - (child: SyntaxNodeRef) => { - if (child.type.name === 'Identifier' || booleanKeywords.includes(child.type.name)) { - isEmpty = false; - throw new Error('Not an empty condition'); - } - }, - (child: SyntaxNodeRef) => { - if (child.type.name === 'Identifier' || booleanKeywords.includes(child.type.name)) { - isEmpty = false; - throw new Error('Not an empty condition'); - } - } - ); - - return isEmpty; - // biome-ignore lint/correctness/noUnusedVariables: Catching and ignoring the error to determine if block is empty - } catch (e) { - return isEmpty; } + return diagnostics; } // Export both the linter extension and the direct diagnostic function export const checkZenuml = checkDocument; -export const zenumlLinter = () => linter((view) => checkDocument(view)); +export const zenumlLinter = () => linter(async (view) => await checkDocument(view)); From 33a953fa091b2981785804f5638fc280373958d1 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 15:42:02 +0800 Subject: [PATCH 3/7] test: make zenuml linter tests async Update test functions to use async/await to properly handle asynchronous operations in the linter checks. This ensures tests accurately reflect real usage where linting may involve async operations. --- src/extensions/zenuml-linter.test.ts | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/extensions/zenuml-linter.test.ts b/src/extensions/zenuml-linter.test.ts index b278bfa..8ba3c70 100644 --- a/src/extensions/zenuml-linter.test.ts +++ b/src/extensions/zenuml-linter.test.ts @@ -6,18 +6,18 @@ import { checkZenuml } from './zenuml-linter'; import { zenumlParticipantStateField } from './zenuml-participant-manager'; describe('ZenUML Linter', () => { - function getDiagnostics(doc: string) { + async function getDiagnostics(doc: string) { const state = EditorState.create({ doc: doc.trim(), extensions: [zenumlParticipantStateField, zenumlHighlighter()], }); const view = new EditorView({ state, parent: document.body }); - const diagnostics = checkZenuml(view); + const diagnostics = await checkZenuml(view); view.destroy(); return diagnostics; } - it('should detect no linting errors', () => { + it('should detect no linting errors', async () => { const doc = `title Order Service (Demonstration only) // Styling participants with background colors is an experimental feature. // This feature is available for users to test and provide feedback. @@ -45,107 +45,107 @@ OrderController.post(payload12) { } } }`; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(0); }); - it('should detect no errors for function parameters', () => { + it('should detect no errors for function parameters', async () => { const doc = ` OrderController.post(payload12) { order = new Order(payload) } `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(0); }); - it('should detect unclosed stereotypes', () => { + it('should detect unclosed stereotypes', async () => { const doc = ` < { + it('should detect invalid color formats', async () => { const doc = ` participant A #12 `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(1); expect(diagnostics[0].message).toBe('Invalid color format'); }); - it('should detect empty group block', () => { + it('should detect empty group block', async () => { const doc = ` group test { } `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(1); expect(diagnostics[0].message).toBe('Empty block'); }); - it('should detect empty if statement block', () => { + it('should detect empty if statement block', async () => { const doc = ` if (true) { } `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(1); expect(diagnostics[0].message).toBe('Empty block'); }); - it('not a empty block', () => { + it('not a empty block', async () => { const doc = ` group test { @Lambda PurchaseService @AzureFunction InvoiceService } `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(0); }); - it('should detect empty condition', () => { + it('should detect empty condition', async () => { const doc = ` if () { x = 1 } `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(1); expect(diagnostics[0].message).toBe('Empty condition'); }); - it('should detect undefined participants', () => { + it('should detect undefined participants', async () => { const doc = ` A -> B: `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(2); expect(diagnostics[0].message).toBe('Undefined participant: A'); expect(diagnostics[1].message).toBe('Undefined participant: B'); }); - it('should detect missing to participant', () => { + it('should detect missing to participant', async () => { const doc = ` A -> `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(2); expect(diagnostics[0].message).toBe('Undefined participant: A'); expect(diagnostics[1].message).toBe('Missing To participant'); }); - it('should detect missing from participant', () => { + it('should detect missing from participant', async () => { const doc = ` -> B: message `; - const diagnostics = getDiagnostics(doc); + const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(2); expect(diagnostics[0].message).toBe('Missing From participant'); expect(diagnostics[1].message).toBe('Undefined participant: B'); From 42973992cb0b3558abd36cb18809726ec5c197a8 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 16:23:30 +0800 Subject: [PATCH 4/7] fix(zenuml-linter): highlight entire error range instead of single character Previously only the first error position was highlighted. Now the linter highlights the range from first to last error position to provide better context for syntax errors. --- src/extensions/zenuml-linter.ts | 54 +++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/src/extensions/zenuml-linter.ts b/src/extensions/zenuml-linter.ts index 35f3c75..75de44a 100644 --- a/src/extensions/zenuml-linter.ts +++ b/src/extensions/zenuml-linter.ts @@ -9,31 +9,47 @@ async function checkDocument(view: EditorView): Promise { const result = await zenuml.parse(doc); // If the parse result contains syntax errors, add them to diagnostics if (result && result.errorDetails && Array.isArray(result.errorDetails) && result.errorDetails.length > 0) { - // Only process the first error detail - const error = result.errorDetails[0]; - // Convert line/column to position in the document - // Note: line is 1-indexed, column is 0-indexed in the ParseResult - const line = error.line - 1; // Convert to 0-indexed - const column = error.column; + // Find the first and last error positions to create a range + const firstError = result.errorDetails[0]; + const lastError = result.errorDetails[result.errorDetails.length - 1]; + + // Convert line/column to position in the document for first error + const firstLine = firstError.line - 1; // Convert to 0-indexed + const firstColumn = firstError.column; + + // Convert line/column to position in the document for last error + const lastLine = lastError.line - 1; // Convert to 0-indexed + const lastColumn = lastError.column; // Calculate the position in the document const lines = doc.split('\n'); - if (line >= 0 && line < lines.length) { - // Calculate the character position based on line and column - let position = 0; - for (let i = 0; i < line; i++) { - position += lines[i].length + 1; // +1 for newline character + + let firstPosition = 0; + if (firstLine >= 0 && firstLine < lines.length) { + for (let i = 0; i < firstLine; i++) { + firstPosition += lines[i].length + 1; // +1 for newline character } - const from = position + column; - const to = from + 1; // Default to single character at the error position + firstPosition += firstColumn; + } - diagnostics.push({ - from, - to, - severity: 'error', - message: error.msg || 'Syntax error in zenuml diagram', - }); + let lastPosition = 0; + if (lastLine >= 0 && lastLine < lines.length) { + for (let i = 0; i < lastLine; i++) { + lastPosition += lines[i].length + 1; // +1 for newline character + } + lastPosition += lastColumn; } + + // Ensure the range is valid (from <= to) + const from = Math.min(firstPosition, lastPosition); + const to = Math.max(firstPosition, lastPosition) + 1; // Extend to include the last error character + + diagnostics.push({ + from, + to, + severity: 'error', + message: firstError.msg || 'Syntax error in zenuml diagram', + }); } // If parsing failed overall, add a general error From 437f37bec3a180a5f39b35da5fb81a31d54daf12 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 19:04:12 +0800 Subject: [PATCH 5/7] refactor(zenuml-linter): improve error details condition readability Use optional chaining and split condition into multiple lines for better clarity --- src/extensions/zenuml-linter.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/extensions/zenuml-linter.ts b/src/extensions/zenuml-linter.ts index 75de44a..8a40276 100644 --- a/src/extensions/zenuml-linter.ts +++ b/src/extensions/zenuml-linter.ts @@ -8,7 +8,11 @@ async function checkDocument(view: EditorView): Promise { const doc = view.state.doc.toString(); const result = await zenuml.parse(doc); // If the parse result contains syntax errors, add them to diagnostics - if (result && result.errorDetails && Array.isArray(result.errorDetails) && result.errorDetails.length > 0) { + if ( + result?.errorDetails && + Array.isArray(result.errorDetails) && + result.errorDetails.length > 0 + ) { // Find the first and last error positions to create a range const firstError = result.errorDetails[0]; const lastError = result.errorDetails[result.errorDetails.length - 1]; From d5d449fba57265dfea6ace3edc70c20d94621a82 Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Wed, 31 Dec 2025 19:17:29 +0800 Subject: [PATCH 6/7] test: relax linter rules for various syntax cases Remove strict validation for unclosed stereotypes, invalid colors, empty blocks, undefined participants, and missing participants to make the linter more permissive --- src/extensions/zenuml-linter.test.ts | 38 ++++++++++------------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/extensions/zenuml-linter.test.ts b/src/extensions/zenuml-linter.test.ts index 8ba3c70..0c48357 100644 --- a/src/extensions/zenuml-linter.test.ts +++ b/src/extensions/zenuml-linter.test.ts @@ -60,43 +60,38 @@ OrderController.post(payload12) { expect(diagnostics).toHaveLength(0); }); - it('should detect unclosed stereotypes', async () => { + it('should not detect unclosed stereotypes', async () => { const doc = ` < { + it('should not detect invalid color formats', async () => { const doc = ` participant A #12 `; const diagnostics = await getDiagnostics(doc); - - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0].message).toBe('Invalid color format'); + expect(diagnostics).toHaveLength(0); }); - it('should detect empty group block', async () => { + it('should not detect empty group block', async () => { const doc = ` group test { } `; const diagnostics = await getDiagnostics(doc); - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0].message).toBe('Empty block'); + expect(diagnostics).toHaveLength(0); }); - it('should detect empty if statement block', async () => { + it('should not detect empty if statement block', async () => { const doc = ` if (true) { } `; const diagnostics = await getDiagnostics(doc); - expect(diagnostics).toHaveLength(1); - expect(diagnostics[0].message).toBe('Empty block'); + expect(diagnostics).toHaveLength(0); }); it('not a empty block', async () => { @@ -117,28 +112,23 @@ OrderController.post(payload12) { `; const diagnostics = await getDiagnostics(doc); expect(diagnostics).toHaveLength(1); - expect(diagnostics[0].message).toBe('Empty condition'); }); - it('should detect undefined participants', async () => { + it('should not detect undefined participants', async () => { const doc = ` A -> B: `; const diagnostics = await getDiagnostics(doc); - expect(diagnostics).toHaveLength(2); - expect(diagnostics[0].message).toBe('Undefined participant: A'); - expect(diagnostics[1].message).toBe('Undefined participant: B'); + expect(diagnostics).toHaveLength(0); }); - it('should detect missing to participant', async () => { + it('should not detect missing to participant', async () => { const doc = ` A -> `; const diagnostics = await getDiagnostics(doc); - expect(diagnostics).toHaveLength(2); - expect(diagnostics[0].message).toBe('Undefined participant: A'); - expect(diagnostics[1].message).toBe('Missing To participant'); + expect(diagnostics).toHaveLength(0); }); it('should detect missing from participant', async () => { @@ -146,9 +136,7 @@ OrderController.post(payload12) { -> B: message `; const diagnostics = await getDiagnostics(doc); - expect(diagnostics).toHaveLength(2); - expect(diagnostics[0].message).toBe('Missing From participant'); - expect(diagnostics[1].message).toBe('Undefined participant: B'); + expect(diagnostics).toHaveLength(1); }); afterEach(() => { From 1b27232892fe6140f6276c4384df154f2ef8cc5f Mon Sep 17 00:00:00 2001 From: danshuitaihejie <474182370@qq.com> Date: Fri, 2 Jan 2026 00:15:02 +0800 Subject: [PATCH 7/7] build: move @zenuml/core to peerDependencies This change aligns with the package's intended usage as a peer dependency rather than a direct dependency --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6576e7..0baaab3 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ "@lezer/common": "^1.2.1", "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.4.0", - "@zenuml/core": "3.43.3", "thememirror": "^2.0.1" }, "peerDependencies": { + "@zenuml/core": "^3.43.3", "@codemirror/autocomplete": "^6.13.0", "@codemirror/commands": "^6.3.3", "@codemirror/language": "^6.10.1",