diff --git a/package.json b/package.json index e88a5346..4346e0b8 100644 --- a/package.json +++ b/package.json @@ -68,23 +68,19 @@ "@types/node": "^20.11.25", "@types/prettier": "^2.7.3", "@vitejs/plugin-vue": "^5.0.4", - "@volar/cdn": "~1.9.2", - "@volar/monaco": "~1.9.2", - "@volar/typescript": "~1.9.2", - "@vue/language-service": "1.8.6", + "@volar/jsdelivr": "~2.4.11", + "@volar/monaco": "~2.4.11", + "@vue/language-service": "2.2.2", "bumpp": "^9.4.0", "codemirror": "^5.65.14", "emmet": "^2.4.6", "emmet-monaco-es": "^5.3.2", "fflate": "^0.8.2", "hash-sum": "^2.0.0", + "monaco-editor-core": "^0.52.2", "lint-staged": "^15.5.1", - "monaco-editor-core": "^0.46.0", - "monaco-editor-textmate": "^4.0.0", - "monaco-textmate": "^3.0.1", - "monaco-volar": "^0.4.0", - "onigasm": "^2.2.5", - "path-browserify": "^1.0.1", + "shiki": "^1.29.2", + "@shikijs/monaco": "^1.29.2", "prettier": "^3.2.5", "rimraf": "^5.0.5", "sass": "^1.86.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5368ac16..4c06e2fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ devDependencies: '@rollup/plugin-replace': specifier: ^5.0.5 version: 5.0.5 + '@shikijs/monaco': + specifier: ^1.29.2 + version: 1.29.2 '@types/codemirror': specifier: ^5.60.15 version: 5.60.15 @@ -38,18 +41,15 @@ devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 version: 5.2.3(vite@6.3.2)(vue@3.5.13) - '@volar/cdn': - specifier: ~1.9.2 - version: 1.9.2 + '@volar/jsdelivr': + specifier: ~2.4.11 + version: 2.4.11 '@volar/monaco': - specifier: ~1.9.2 - version: 1.9.2 - '@volar/typescript': - specifier: ~1.9.2 - version: 1.9.2 + specifier: ~2.4.11 + version: 2.4.11 '@vue/language-service': - specifier: 1.8.6 - version: 1.8.6(typescript@5.8.3) + specifier: 2.2.2 + version: 2.2.2(typescript@5.8.3) bumpp: specifier: ^9.4.0 version: 9.4.0 @@ -61,7 +61,7 @@ devDependencies: version: 2.4.6 emmet-monaco-es: specifier: ^5.3.2 - version: 5.3.2(monaco-editor@0.52.2) + version: 5.5.0(monaco-editor@0.52.2) fflate: specifier: ^0.8.2 version: 0.8.2 @@ -72,23 +72,8 @@ devDependencies: specifier: ^15.5.1 version: 15.5.1 monaco-editor-core: - specifier: ^0.46.0 - version: 0.46.0 - monaco-editor-textmate: - specifier: ^4.0.0 - version: 4.0.0(monaco-editor@0.52.2)(monaco-textmate@3.0.1) - monaco-textmate: - specifier: ^3.0.1 - version: 3.0.1(onigasm@2.2.5) - monaco-volar: - specifier: ^0.4.0 - version: 0.4.0 - onigasm: - specifier: ^2.2.5 - version: 2.2.5 - path-browserify: - specifier: ^1.0.1 - version: 1.0.1 + specifier: ^0.52.2 + version: 0.52.2 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -98,6 +83,9 @@ devDependencies: sass: specifier: ^1.86.3 version: 1.86.3 + shiki: + specifier: ^1.29.2 + version: 1.29.2 sucrase: specifier: ^3.35.0 version: 3.35.0 @@ -167,12 +155,33 @@ packages: '@emmetio/scanner': 1.0.4 dev: true + /@emmetio/css-parser@0.4.0: + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + dev: true + + /@emmetio/html-matcher@1.3.0: + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + dependencies: + '@emmetio/scanner': 1.0.4 + dev: true + /@emmetio/scanner@1.0.4: resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} dev: true - /@esbuild/aix-ppc64@0.25.3: - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + /@emmetio/stream-reader-utils@0.1.0: + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + dev: true + + /@emmetio/stream-reader@2.2.0: + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + dev: true + + /@esbuild/aix-ppc64@0.25.4: + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -180,8 +189,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.25.3: - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + /@esbuild/android-arm64@0.25.4: + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -189,8 +198,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.25.3: - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + /@esbuild/android-arm@0.25.4: + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -198,8 +207,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.25.3: - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + /@esbuild/android-x64@0.25.4: + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -207,8 +216,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.25.3: - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + /@esbuild/darwin-arm64@0.25.4: + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -216,8 +225,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.25.3: - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + /@esbuild/darwin-x64@0.25.4: + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -225,8 +234,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.25.3: - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + /@esbuild/freebsd-arm64@0.25.4: + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -234,8 +243,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.25.3: - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + /@esbuild/freebsd-x64@0.25.4: + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -243,8 +252,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.25.3: - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + /@esbuild/linux-arm64@0.25.4: + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -252,8 +261,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.25.3: - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + /@esbuild/linux-arm@0.25.4: + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -261,8 +270,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.25.3: - resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + /@esbuild/linux-ia32@0.25.4: + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -270,8 +279,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.25.3: - resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + /@esbuild/linux-loong64@0.25.4: + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -279,8 +288,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.25.3: - resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + /@esbuild/linux-mips64el@0.25.4: + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -288,8 +297,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.25.3: - resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + /@esbuild/linux-ppc64@0.25.4: + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -297,8 +306,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.25.3: - resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + /@esbuild/linux-riscv64@0.25.4: + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -306,8 +315,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.25.3: - resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + /@esbuild/linux-s390x@0.25.4: + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -315,8 +324,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.25.3: - resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + /@esbuild/linux-x64@0.25.4: + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -324,8 +333,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-arm64@0.25.3: - resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + /@esbuild/netbsd-arm64@0.25.4: + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -333,8 +342,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.25.3: - resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + /@esbuild/netbsd-x64@0.25.4: + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -342,8 +351,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-arm64@0.25.3: - resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + /@esbuild/openbsd-arm64@0.25.4: + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -351,8 +360,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.25.3: - resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + /@esbuild/openbsd-x64@0.25.4: + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -360,8 +369,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.25.3: - resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + /@esbuild/sunos-x64@0.25.4: + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -369,8 +378,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.25.3: - resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + /@esbuild/win32-arm64@0.25.4: + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -378,8 +387,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.25.3: - resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + /@esbuild/win32-ia32@0.25.4: + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -387,8 +396,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.25.3: - resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + /@esbuild/win32-x64@0.25.4: + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -497,8 +506,8 @@ packages: - '@types/node' dev: true - /@microsoft/api-extractor@7.52.7(@types/node@20.11.25): - resolution: {integrity: sha512-YLdPS644MfbLJt4hArP1WcldcaEUBh9wnFjcLEcQnVG0AMznbLh2sdE0F5Wr+w6+Lyp5/XUPvRAg3sYGSP3GCw==} + /@microsoft/api-extractor@7.52.8(@types/node@20.11.25): + resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} hasBin: true dependencies: '@microsoft/api-extractor-model': 7.30.6(@types/node@20.11.25) @@ -1000,6 +1009,63 @@ packages: - '@types/node' dev: true + /@shikijs/core@1.29.2: + resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} + dependencies: + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + dev: true + + /@shikijs/engine-javascript@1.29.2: + resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 2.3.0 + dev: true + + /@shikijs/engine-oniguruma@1.29.2: + resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + dependencies: + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + dev: true + + /@shikijs/langs@1.29.2: + resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + dependencies: + '@shikijs/types': 1.29.2 + dev: true + + /@shikijs/monaco@1.29.2: + resolution: {integrity: sha512-VLugI+Hit6rxBr+S//p3qz4EReuMfhSjBYpFtqkg3qvt6KG+MQIzIxuogznsWOcVabyeHN48n/e+Acn6TBxSFg==} + dependencies: + '@shikijs/core': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + dev: true + + /@shikijs/themes@1.29.2: + resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + dependencies: + '@shikijs/types': 1.29.2 + dev: true + + /@shikijs/types@1.29.2: + resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + dev: true + + /@shikijs/vscode-textmate@10.0.2: + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + dev: true + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: true @@ -1014,6 +1080,18 @@ packages: resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + /@types/node@20.11.25: resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} dependencies: @@ -1030,6 +1108,14 @@ packages: '@types/estree': 1.0.7 dev: true + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + dev: true + + /@ungap/structured-clone@1.3.0: + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + dev: true + /@vitejs/plugin-vue@5.2.3(vite@6.3.2)(vue@3.5.13): resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1041,16 +1127,14 @@ packages: vue: 3.5.13(typescript@5.8.3) dev: true - /@volar/cdn@1.9.2: - resolution: {integrity: sha512-CTwG52MxaiNYKm8qe22a/9LZj2c0LSKfLHuc4dj+Dm43IDG6HtgVEgWEsJCkl6UJqIMuvQ7oRTpYHpNyozppDA==} - dependencies: - '@volar/language-service': 1.9.2 + /@volar/jsdelivr@2.4.11: + resolution: {integrity: sha512-HbOg2cccKcpgxK/bS9+vFzfb2o4RUqLSCJjcGuYWRRuUhyw0gqkpnrSRMovgG/rUpkqVXDCnfIeoHdl04z0BZg==} dev: true - /@volar/language-core@1.9.2: - resolution: {integrity: sha512-9GTes/IUPOl0YoV5RQWhCP5a4EDFFfJZGwZn1xA5ug1FO0G6GOVoJI6tQatujtcQmDOQlOM5/0NewnlumygPkQ==} + /@volar/language-core@2.4.11: + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} dependencies: - '@volar/source-map': 1.9.2 + '@volar/source-map': 2.4.11 dev: true /@volar/language-core@2.4.13: @@ -1059,37 +1143,48 @@ packages: '@volar/source-map': 2.4.13 dev: true - /@volar/language-service@1.9.2: - resolution: {integrity: sha512-DcM9FfEEkzpMgoQr8jCSdAYFsBOXIjSEFVEtt69sQ8Pz05kOaxehH8KoxvSb2tKl1N9lTeQPiM+0jF5opYvxkg==} + /@volar/language-service@2.4.11: + resolution: {integrity: sha512-KIb6g8gjUkS2LzAJ9bJCLIjfsJjeRtmXlu7b2pDFGD3fNqdbC53cCAKzgWDs64xtQVKYBU13DLWbtSNFtGuMLQ==} dependencies: - '@volar/language-core': 1.9.2 - '@volar/source-map': 1.9.2 + '@volar/language-core': 2.4.11 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 dev: true - /@volar/monaco@1.9.2: - resolution: {integrity: sha512-CSiOFHcbmgxrRVbIaOAjPwOdtsCq3D3iu69nyxYZTuiwMjC2BRKchHuVsdQTa1DfNaxmMTBIsGAYRIPc3hPijw==} + /@volar/language-service@2.4.13: + resolution: {integrity: sha512-yngNLIxt1w3S60YLTRAa7MSE1IRmXcxGA9ttLjndY0Jc3owCFjeAWSPeXBILZBJOtdT8rP07JY1ozwUls/gvRg==} dependencies: - '@volar/language-service': 1.9.2 + '@volar/language-core': 2.4.13 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 dev: true - /@volar/source-map@1.9.2: - resolution: {integrity: sha512-rYTvV/HMf2CSRkd6oiVxcjX4rnSxEsVfJmw1KTmD4VTBXlz1+b16VIysQX4+1p/eZd2TyCeFblyylIxbZ+YOGg==} + /@volar/monaco@2.4.11: + resolution: {integrity: sha512-irK3FFtcO+78GzoWd6aM4cg6/OP76eZ5+vHPMFKbc/a2yX+FUek64MGVsYiFIZJBtcl8krFz1fcqagEUSeggBg==} dependencies: - muggle-string: 0.3.1 + '@volar/language-service': 2.4.11 + '@volar/typescript': 2.4.11 + monaco-languageserver-types: 0.4.0 + monaco-types: 0.1.0 + vscode-uri: 3.1.0 + dev: true + + /@volar/source-map@2.4.11: + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} dev: true /@volar/source-map@2.4.13: resolution: {integrity: sha512-l/EBcc2FkvHgz2ZxV+OZK3kMSroMr7nN3sZLF2/f6kWW66q8+tEL4giiYyFjt0BcubqJhBt6soYIrAPhg/Yr+Q==} dev: true - /@volar/typescript@1.9.2: - resolution: {integrity: sha512-l4DA+S3ZVOWGACDdRNVSYZ41nuTWOH8OMS/yVeFV2fTmr/IuD37+3wzzGnjIPwCUa0w+fpg8vJPalzYetmlFTQ==} + /@volar/typescript@2.4.11: + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} dependencies: - '@volar/language-core': 1.9.2 + '@volar/language-core': 2.4.11 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 dev: true /@volar/typescript@2.4.13: @@ -1159,27 +1254,27 @@ packages: he: 1.2.0 dev: true - /@vue/language-core@1.8.6(typescript@5.8.3): - resolution: {integrity: sha512-PyYDMArbR7hnhqw9OEupr0s4ut0/ZfITp7WEjigF58cd2R0lRLNM1HPvzFMuULpy3ImBEOZI11KRIDirqOe+tQ==} + /@vue/language-core@2.2.0(typescript@5.8.3): + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@volar/language-core': 1.9.2 - '@volar/source-map': 1.9.2 + '@volar/language-core': 2.4.13 '@vue/compiler-dom': 3.5.13 - '@vue/reactivity': 3.5.13 + '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.13 + alien-signals: 0.4.14 minimatch: 9.0.5 - muggle-string: 0.3.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 typescript: 5.8.3 - vue-template-compiler: 2.7.16 dev: true - /@vue/language-core@2.2.0(typescript@5.8.3): - resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + /@vue/language-core@2.2.2(typescript@5.8.3): + resolution: {integrity: sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1190,7 +1285,7 @@ packages: '@vue/compiler-dom': 3.5.13 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.13 - alien-signals: 0.4.14 + alien-signals: 1.0.13 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 @@ -1216,26 +1311,29 @@ packages: typescript: 5.8.3 dev: true - /@vue/language-service@1.8.6(typescript@5.8.3): - resolution: {integrity: sha512-02JHqUDkaai32TToqUGmtKJUpGmx0GHu5T6cWXbwwdrPzCWy/Zra6zRaHxoMy5E+1Iz2PXZvEUUliK/sqtwB1g==} + /@vue/language-service@2.2.2(typescript@5.8.3): + resolution: {integrity: sha512-TRCGRgJJ6v+qCtpHrwKkwol7VpcmyfjYDP5j5lRNWmyb8SRB3bKYqmshMYzDuL8YfT5tOxmSRVstDKYV7mucXA==} dependencies: - '@volar/language-core': 1.9.2 - '@volar/language-service': 1.9.2 - '@volar/typescript': 1.9.2 + '@volar/language-core': 2.4.13 + '@volar/language-service': 2.4.13 + '@volar/typescript': 2.4.13 '@vue/compiler-dom': 3.5.13 - '@vue/language-core': 1.8.6(typescript@5.8.3) - '@vue/reactivity': 3.5.13 + '@vue/language-core': 2.2.2(typescript@5.8.3) '@vue/shared': 3.5.13 - volar-service-css: 0.0.10(@volar/language-service@1.9.2) - volar-service-emmet: 0.0.10(@volar/language-service@1.9.2) - volar-service-html: 0.0.10(@volar/language-service@1.9.2) - volar-service-json: 0.0.10(@volar/language-service@1.9.2) - volar-service-pug: 0.0.10 - volar-service-pug-beautify: 0.0.10(@volar/language-service@1.9.2) - volar-service-typescript: 0.0.10(@volar/language-service@1.9.2)(@volar/typescript@1.9.2) - volar-service-typescript-twoslash-queries: 0.0.10(@volar/language-service@1.9.2) + '@vue/typescript-plugin': 2.2.2(typescript@5.8.3) + alien-signals: 1.0.13 + path-browserify: 1.0.1 + volar-service-css: 0.0.62(@volar/language-service@2.4.13) + volar-service-emmet: 0.0.62(@volar/language-service@2.4.13) + volar-service-html: 0.0.62(@volar/language-service@2.4.13) + volar-service-json: 0.0.62(@volar/language-service@2.4.13) + volar-service-pug: 0.0.62 + volar-service-pug-beautify: 0.0.62(@volar/language-service@2.4.13) + volar-service-typescript: 0.0.62(@volar/language-service@2.4.13) + volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.13) vscode-html-languageservice: 5.4.0 vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 transitivePeerDependencies: - typescript dev: true @@ -1276,6 +1374,16 @@ packages: resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} dev: true + /@vue/typescript-plugin@2.2.2(typescript@5.8.3): + resolution: {integrity: sha512-M/fNR/M4Rt+jm7Vmv21sPoHNM7MLYC7QjW5gqmP9y6HGmIlxOubqXYIqddeEnikmEsOc3linykEAxAIVxfIvbA==} + dependencies: + '@volar/typescript': 2.4.13 + '@vue/language-core': 2.2.2(typescript@5.8.3) + '@vue/shared': 3.5.13 + transitivePeerDependencies: + - typescript + dev: true + /@vuetify/loader-shared@2.1.0(vue@3.5.13)(vuetify@3.8.2): resolution: {integrity: sha512-dNE6Ceym9ijFsmJKB7YGW0cxs7xbYV8+1LjU6jd4P14xOt/ji4Igtgzt0rJFbxu+ZhAzqz853lhB0z8V9Dy9cQ==} peerDependencies: @@ -1500,11 +1608,23 @@ packages: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} dev: true + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: true + /chalk@5.4.1: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: true + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: true + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: true + /character-parser@2.2.0: resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} dependencies: @@ -1578,6 +1698,10 @@ packages: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: true + /commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -1649,6 +1773,11 @@ packages: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + /destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} dev: true @@ -1661,6 +1790,12 @@ packages: dev: true optional: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: true + /dotenv@16.5.0: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} @@ -1679,15 +1814,22 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /emmet-monaco-es@5.3.2(monaco-editor@0.52.2): - resolution: {integrity: sha512-fb8z9lUVtqXx4IGQQceMwuz7/hYDJdLQj40ZOMQOtBJ4qLTo5XT9H0u/DhfCSWyOktTxZZxiYfkQsGasrv6u0w==} + /emmet-monaco-es@5.5.0(monaco-editor@0.52.2): + resolution: {integrity: sha512-OJxfHJZevWtFJZHfkJUS4WG+erEoFjlUNXtOnXJXEBLKyFDHrpiEBp5hwnuPXvCM9gBjYlUm8tpfLA0Pmd0K5Q==} peerDependencies: monaco-editor: '>=0.22.0' dependencies: - emmet: 2.4.6 + emmet: 2.4.11 monaco-editor: 0.52.2 dev: true + /emmet@2.4.11: + resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + dev: true + /emmet@2.4.6: resolution: {integrity: sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==} dependencies: @@ -1695,6 +1837,10 @@ packages: '@emmetio/css-abbreviation': 2.1.8 dev: true + /emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + dev: true + /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} dev: true @@ -1734,37 +1880,37 @@ packages: es-errors: 1.3.0 dev: true - /esbuild@0.25.3: - resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + /esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.25.3 - '@esbuild/android-arm': 0.25.3 - '@esbuild/android-arm64': 0.25.3 - '@esbuild/android-x64': 0.25.3 - '@esbuild/darwin-arm64': 0.25.3 - '@esbuild/darwin-x64': 0.25.3 - '@esbuild/freebsd-arm64': 0.25.3 - '@esbuild/freebsd-x64': 0.25.3 - '@esbuild/linux-arm': 0.25.3 - '@esbuild/linux-arm64': 0.25.3 - '@esbuild/linux-ia32': 0.25.3 - '@esbuild/linux-loong64': 0.25.3 - '@esbuild/linux-mips64el': 0.25.3 - '@esbuild/linux-ppc64': 0.25.3 - '@esbuild/linux-riscv64': 0.25.3 - '@esbuild/linux-s390x': 0.25.3 - '@esbuild/linux-x64': 0.25.3 - '@esbuild/netbsd-arm64': 0.25.3 - '@esbuild/netbsd-x64': 0.25.3 - '@esbuild/openbsd-arm64': 0.25.3 - '@esbuild/openbsd-x64': 0.25.3 - '@esbuild/sunos-x64': 0.25.3 - '@esbuild/win32-arm64': 0.25.3 - '@esbuild/win32-ia32': 0.25.3 - '@esbuild/win32-x64': 0.25.3 + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 dev: true /escalade@3.2.0: @@ -1818,10 +1964,6 @@ packages: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-plist@0.1.3: - resolution: {integrity: sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==} - dev: true - /fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} dependencies: @@ -1998,11 +2140,37 @@ packages: function-bind: 1.1.2 dev: true + /hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + dev: true + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.4 + dev: true + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: true + /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -2174,17 +2342,17 @@ packages: debug: 4.4.0 execa: 8.0.1 lilconfig: 3.1.3 - listr2: 8.3.2 + listr2: 8.3.3 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.7.1 + yaml: 2.8.0 transitivePeerDependencies: - supports-color dev: true - /listr2@8.3.2: - resolution: {integrity: sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==} + /listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} dependencies: cli-truncate: 4.0.0 @@ -2233,12 +2401,6 @@ packages: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2257,6 +2419,20 @@ packages: engines: {node: '>= 0.4'} dev: true + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -2266,6 +2442,33 @@ packages: engines: {node: '>= 8'} dev: true + /micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + dev: true + + /micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + dev: true + + /micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + dev: true + + /micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + dev: true + + /micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + dev: true + /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2337,47 +2540,30 @@ packages: ufo: 1.6.1 dev: true - /monaco-editor-core@0.46.0: - resolution: {integrity: sha512-JA5BzCaC0nUB5zUhzGUfecNhVNxEXpJxp6YNBYLr0SPyv0DKSIeBpF21WVkpwYm00UJaVc4m3TTcwB9/Gzd/nw==} - dev: true - - /monaco-editor-textmate@4.0.0(monaco-editor@0.52.2)(monaco-textmate@3.0.1): - resolution: {integrity: sha512-Clwup5LJzVfwURQrS+odSEC5/hZBEG36pQnvBKt4OtBndF8r2xLeXUZcK/AqEBK2u0Npy7frFp9hG7m66Ol9hA==} - peerDependencies: - monaco-editor: 0.x.x - monaco-textmate: ^3.0.0 - dependencies: - monaco-editor: 0.52.2 - monaco-textmate: 3.0.1(onigasm@2.2.5) + /monaco-editor-core@0.52.2: + resolution: {integrity: sha512-5TOyTUymNx7jB24TGP4Qs5UEVrntDKSMzDUvW3ADaI1CFRO1t7FPhbT2u4m3iIKZf85zTM+mkCxiUSgj+v/YtA==} dev: true /monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} dev: true - /monaco-textmate@3.0.1(onigasm@2.2.5): - resolution: {integrity: sha512-ZxxY3OsqUczYP1sGqo97tu+CJmMBwuSW+dL0WEBdDhOZ5G1zntw72hvBc68ZQAirosWvbDKgN1dL5k173QtFww==} - peerDependencies: - onigasm: ^2.0.0 + /monaco-languageserver-types@0.4.0: + resolution: {integrity: sha512-QQ3BZiU5LYkJElGncSNb5AKoJ/LCs6YBMCJMAz9EA7v+JaOdn3kx2cXpPTcZfKA5AEsR0vc97sAw+5mdNhVBmw==} dependencies: - fast-plist: 0.1.3 - onigasm: 2.2.5 + monaco-types: 0.1.0 + vscode-languageserver-protocol: 3.17.5 + vscode-uri: 3.1.0 dev: true - /monaco-volar@0.4.0: - resolution: {integrity: sha512-QnUg8cs17BOLacmuIki0Zri0tPQOHOw14LcQFKWigyIo2ChRJnO7grhxQsHOdyOL7vkHxSkMno84wIT8+sEv/A==} - dependencies: - onigasm: 2.2.5 + /monaco-types@0.1.0: + resolution: {integrity: sha512-aWK7SN9hAqNYi0WosPoMjenMeXJjwCxDibOqWffyQ/qXdzB/86xshGQobRferfmNz7BSNQ8GB0MD0oby9/5fTQ==} dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true - /muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} dev: true @@ -2454,10 +2640,12 @@ packages: mimic-function: 5.0.1 dev: true - /onigasm@2.2.5: - resolution: {integrity: sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==} + /oniguruma-to-es@2.3.0: + resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} dependencies: - lru-cache: 5.1.1 + emoji-regex-xs: 1.0.0 + regex: 5.1.1 + regex-recursion: 5.1.1 dev: true /package-json-from-dist@1.0.1: @@ -2566,6 +2754,10 @@ packages: sisteransi: 1.0.5 dev: true + /property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + dev: true + /pug-error@2.1.0: resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} dev: true @@ -2617,6 +2809,23 @@ packages: engines: {node: '>= 14.18.0'} dev: true + /regex-recursion@5.1.1: + resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} + dependencies: + regex: 5.1.1 + regex-utilities: 2.3.0 + dev: true + + /regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + dev: true + + /regex@5.1.1: + resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==} + dependencies: + regex-utilities: 2.3.0 + dev: true + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} @@ -2738,6 +2947,19 @@ packages: engines: {node: '>=8'} dev: true + /shiki@1.29.2: + resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} + dependencies: + '@shikijs/core': 1.29.2 + '@shikijs/engine-javascript': 1.29.2 + '@shikijs/engine-oniguruma': 1.29.2 + '@shikijs/langs': 1.29.2 + '@shikijs/themes': 1.29.2 + '@shikijs/types': 1.29.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + dev: true + /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2773,6 +2995,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: true + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true @@ -2809,6 +3035,13 @@ packages: strip-ansi: 7.1.0 dev: true + /stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: true + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2907,6 +3140,10 @@ packages: resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} dev: true + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: true + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true @@ -2948,6 +3185,39 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.3 + dev: true + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + dev: true + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: true + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2974,6 +3244,20 @@ packages: engines: {node: '>= 0.10'} dev: true + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + dev: true + + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + dev: true + /vite-plugin-dts@4.5.3(@types/node@20.11.25)(typescript@5.8.3)(vite@6.3.2): resolution: {integrity: sha512-P64VnD00dR+e8S26ESoFELqc17+w7pKkwlBpgXteOljFyT0zDwD8hH4zXp49M/kciy//7ZbVXIwQCekBJjfWzA==} peerDependencies: @@ -2983,7 +3267,7 @@ packages: vite: optional: true dependencies: - '@microsoft/api-extractor': 7.52.7(@types/node@20.11.25) + '@microsoft/api-extractor': 7.52.8(@types/node@20.11.25) '@rollup/pluginutils': 5.1.4 '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.8.3) @@ -3059,7 +3343,7 @@ packages: optional: true dependencies: '@types/node': 20.11.25 - esbuild: 0.25.3 + esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 postcss: 8.5.3 @@ -3070,105 +3354,108 @@ packages: fsevents: 2.3.3 dev: true - /volar-service-css@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-58A6UvgFZAWGFWRY0tKAAiREXcSOyx5ErpeOS3UjuGZFyTi6YUxfm1F0F8BKA1voN24laen1yyuFQD5E4ONNIQ==} + /volar-service-css@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 + '@volar/language-service': 2.4.13 vscode-css-languageservice: 6.3.5 + vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 dev: true - /volar-service-emmet@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-O7JahMMvexee65ifph1rhIH/L97S2rMtKAut+x3/yi4PEMVM0XkuKiXkC2y3ZCO4DzFsMhZWtEVBE0Ym76nj2g==} + /volar-service-emmet@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-U4dxWDBWz7Pi4plpbXf4J4Z/ss6kBO3TYrACxWNsE29abu75QzVS0paxDDhI6bhqpbDFXlpsDhZ9aXVFpnfGRQ==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@volar/language-service': 2.4.13 '@vscode/emmet-helper': 2.11.0 - volar-service-html: 0.0.10(@volar/language-service@1.9.2) + vscode-uri: 3.1.0 dev: true - /volar-service-html@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-lr6hDCkp+HOqpvMzCtiSg80v82FBaUIn69+dZCMAp9O8qPhEo6WhrRwe9FEzSpg//WFwoWYfyZ1uPaj+RzT6aw==} + /volar-service-html@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-Zw01aJsZRh4GTGUjveyfEzEqpULQUdQH79KNEiKVYHZyuGtdBRYCHlrus1sueSNMxwwkuF5WnOHfvBzafs8yyQ==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 + '@volar/language-service': 2.4.13 vscode-html-languageservice: 5.4.0 + vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 dev: true - /volar-service-json@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-9HQNWTDrCt76j04/+ZCCf6jqhc2wOmDSKLWU7P2wyOS+1jPKLh3F0GYQ1GrzBTkhjwQ266WAn6Z7LApb4BLQyg==} + /volar-service-json@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-Ot+jP+/LzKcaGF7nzrn+gwpzAleb4ej5buO05M8KxfwfODte7o1blARKRoJ3Nv7ls0DBM38Dd5vjzvA9c/9Jtg==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 + '@volar/language-service': 2.4.13 vscode-json-languageservice: 5.5.0 vscode-uri: 3.1.0 dev: true - /volar-service-pug-beautify@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-E6j2dgN3SdyFuaH01Jx0CsCCOgJvmNAxMZtm4gEUrdLSvbxrZBwNotm0u3r6X3vJSMKkfM/LrKoyNOE83joDfA==} + /volar-service-pug-beautify@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-dAFNuNEwTnnVthYoNJhoStwhf/PojzglwCrdhOb2nBegTG3xXMWRFmQzb0JfIlt2wq2wfUq5j+JJswgSD3KluQ==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 - '@volar/language-service': 1.9.2 + '@volar/language-service': 2.4.13 dev: true - /volar-service-pug@0.0.10: - resolution: {integrity: sha512-nBrpD/no4If/uBX8XBRw4o9rowcIj7wkcFkRzXkvJz9NYSScvTjnGgbJCvsWenJgbuLtnfLNGo7dE88sJmOdSg==} + /volar-service-pug@0.0.62: + resolution: {integrity: sha512-C0/O8uGnRfijWKE0zFXxJ/o7BbLebzretsEaiMkvBDIxm5oe7HRDzQr6CgknV/WVgiohZ74v+0CwBPl2YmcPUQ==} dependencies: - '@volar/language-service': 1.9.2 - '@volar/source-map': 1.9.2 - muggle-string: 0.3.1 + '@volar/language-service': 2.4.13 + muggle-string: 0.4.1 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.10(@volar/language-service@1.9.2) + volar-service-html: 0.0.62(@volar/language-service@2.4.13) vscode-html-languageservice: 5.4.0 vscode-languageserver-textdocument: 1.0.12 dev: true - /volar-service-typescript-twoslash-queries@0.0.10(@volar/language-service@1.9.2): - resolution: {integrity: sha512-AMgl/aaCHIOIKswYP6GKx7m3+jVMCwF8Lt2KVaGKUstkT6LCMvqS/tVaRTzd8rAUq4lrFf4bg5uBD8RYtjklhA==} + /volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-KxFt4zydyJYYI0kFAcWPTh4u0Ha36TASPZkAnNY784GtgajerUqM80nX/W1d0wVhmcOFfAxkVsf/Ed+tiYU7ng==} peerDependencies: - '@volar/language-service': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 + '@volar/language-service': 2.4.13 + vscode-uri: 3.1.0 dev: true - /volar-service-typescript@0.0.10(@volar/language-service@1.9.2)(@volar/typescript@1.9.2): - resolution: {integrity: sha512-MVo9je5te2pjZIzbR+S5Fr1rZE2b64E+dpNpH5IHO+LtzSeT2Ri+Bzr4cGTbQSPxNx2O89BOxn97Wa5FS7vYyg==} + /volar-service-typescript@0.0.62(@volar/language-service@2.4.13): + resolution: {integrity: sha512-p7MPi71q7KOsH0eAbZwPBiKPp9B2+qrdHAd6VY5oTo9BUXatsOAdakTm9Yf0DUj6uWBAaOT01BSeVOPwucMV1g==} peerDependencies: - '@volar/language-service': ~1.9.0 - '@volar/typescript': ~1.9.0 + '@volar/language-service': ~2.4.0 peerDependenciesMeta: '@volar/language-service': optional: true dependencies: - '@volar/language-service': 1.9.2 - '@volar/typescript': 1.9.2 + '@volar/language-service': 2.4.13 + path-browserify: 1.0.1 semver: 7.7.1 typescript-auto-import-cache: 0.3.5 vscode-languageserver-textdocument: 1.0.12 @@ -3232,13 +3519,6 @@ packages: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} dev: true - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - /vue-tsc@2.2.8(typescript@5.8.3): resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==} hasBin: true @@ -3322,17 +3602,13 @@ packages: strip-ansi: 7.1.0 dev: true - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + /yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true dev: true @@ -3347,3 +3623,7 @@ packages: optionalDependencies: commander: 9.5.0 dev: true + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: true diff --git a/src/Repl.vue b/src/Repl.vue index 991ee2ed..b5269126 100644 --- a/src/Repl.vue +++ b/src/Repl.vue @@ -128,9 +128,8 @@ defineExpose({ reload }) margin: 0; overflow: hidden; font-size: 13px; - font-family: - -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, - Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; background-color: var(--bg-soft); } diff --git a/src/editor/WrapToggle.vue b/src/editor/WrapToggle.vue index c02539cf..354850c4 100644 --- a/src/editor/WrapToggle.vue +++ b/src/editor/WrapToggle.vue @@ -4,7 +4,14 @@ const visible = defineModel() diff --git a/src/index.ts b/src/index.ts index 172a7069..56a70db0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,3 +5,5 @@ export { compileFile } from './transform' export type { Props as ReplProps } from './Repl.vue' export type { Store, StoreOptions, SFCOptions, StoreState } from './store' export type { OutputModes } from './output/types' +export { version as languageToolsVersion } from '@vue/language-service/package.json' + diff --git a/src/monaco/Monaco.vue b/src/monaco/Monaco.vue index 58d5d41c..726ff18b 100644 --- a/src/monaco/Monaco.vue +++ b/src/monaco/Monaco.vue @@ -4,7 +4,6 @@ import { onBeforeUnmount, ref, shallowRef, - nextTick, inject, watch, computed, @@ -13,13 +12,13 @@ import { import * as monaco from 'monaco-editor-core' import { initMonaco } from './env' import { getOrCreateModel } from './utils' -import { loadGrammars, loadTheme } from 'monaco-volar' import { Store } from '../store' import type { PreviewMode } from '../editor/types' import parserBabel from 'prettier/plugins/babel' import parserHtml from 'prettier/plugins/html' import parserPostcss from 'prettier/plugins/postcss' import prettier from 'prettier/standalone' +import { registerHighlighter } from './highlight' const props = withDefaults( defineProps<{ @@ -38,7 +37,6 @@ const emit = defineEmits<{ }>() const containerRef = ref() -const ready = ref(false) const editor = shallowRef() const store = inject('store')! @@ -48,10 +46,8 @@ const lang = computed(() => (props.mode === 'css' ? 'css' : 'javascript')) const extension = computed(() => props.filename.split('.').at(-1)) const replTheme = inject>('theme')! -onMounted(async () => { - const theme = await loadTheme(monaco.editor) - ready.value = true - await nextTick() +onMounted(() => { + const theme = registerHighlighter() if (!containerRef.value) { throw new Error('Cannot find containerRef') @@ -72,7 +68,6 @@ onMounted(async () => { inlineSuggest: { enabled: false, }, - 'semanticHighlighting.enabled': true, fixedOverflowWidgets: true, wordWrap: store.state.wordWrap ? 'on' : 'off', }) @@ -80,6 +75,7 @@ onMounted(async () => { // Support for semantic highlighting const t = (editorInstance as any)._themeService._theme + t.semanticHighlighting = true t.getTokenStyleMetadata = ( type: string, modifiers: string[], @@ -94,7 +90,7 @@ onMounted(async () => { return { foreground: 11 } case 'variable': case 'property': - return { foreground: _readonly ? 21 : 9 } + return { foreground: _readonly ? 19 : 9 } default: return { foreground: 0 } } @@ -151,8 +147,6 @@ onMounted(async () => { } ) - await loadGrammars(monaco, editorInstance) - editorInstance.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => { // ignore save event }) diff --git a/src/monaco/env.ts b/src/monaco/env.ts index c5476f71..2a10cbb4 100644 --- a/src/monaco/env.ts +++ b/src/monaco/env.ts @@ -1,22 +1,21 @@ -import { jsDelivrUriBase } from '@volar/cdn' import * as volar from '@volar/monaco' import * as monaco from 'monaco-editor-core' import { editor, languages, Uri } from 'monaco-editor-core' import editorWorker from 'monaco-editor-core/esm/vs/editor/editor.worker?worker' import { emmetHTML } from 'emmet-monaco-es' -import * as onigasm from 'onigasm' -import onigasmWasm from 'onigasm/lib/onigasm.wasm?url' import { watchEffect } from 'vue' import { Store } from '../store' import { getOrCreateModel } from './utils' import type { CreateData } from './vue.worker' import vueWorker from './vue.worker?worker' +import * as languageConfigs from './language-configs' +import type { WorkerLanguageService } from '@volar/monaco/worker' +import { debounce } from '../utils' let initted = false export function initMonaco(store: Store) { if (initted) return loadMonacoEnv(store) - loadWasm() emmetHTML(monaco as any, ['vue', 'html']) watchEffect(() => { @@ -35,40 +34,17 @@ export function initMonaco(store: Store) { for (const model of editor.getModels()) { const uri = model.uri.toString() if (store.state.files[uri.substring('file:///'.length)]) continue - if (uri.startsWith(jsDelivrUriBase + '/')) continue + + if (uri.startsWith('file:///node_modules')) continue if (uri.startsWith('inmemory://')) continue model.dispose() } }) - // Support for go to definition - editor.registerEditorOpener({ - openCodeEditor(_, resource) { - if (resource.toString().startsWith(jsDelivrUriBase + '/')) { - return true - } - - const path = resource.path - if (/^\//.test(path)) { - const fileName = path.replace('/', '') - if (fileName !== store.state.activeFile.filename) { - store.setActive(fileName) - return true - } - } - - return false - }, - }) - initted = true } -export function loadWasm() { - return onigasm.loadWASM(onigasmWasm) -} - export class WorkerHost { onFetchCdnFile(uri: string, text: string) { getOrCreateModel(Uri.parse(uri), undefined, text) @@ -105,7 +81,7 @@ export async function reloadLanguageTools(store: Store) { } } - const worker = editor.createWebWorker({ + const worker = editor.createWebWorker({ moduleId: 'vs/language/vue/vueWorker', label: 'vue', host: new WorkerHost(), @@ -116,23 +92,22 @@ export async function reloadLanguageTools(store: Store) { }) const languageId = ['vue', 'javascript', 'typescript'] const getSyncUris = () => - Object.keys(store.state.files).map((filename) => - Uri.parse(`file:///${filename}`) - ) - const { dispose: disposeMarkers } = volar.editor.activateMarkers( + Object.keys(store.state.files).map((filename) => Uri.parse(`file:///${filename}`)) + + const { dispose: disposeMarkers } = volar.activateMarkers( worker, languageId, 'vue', getSyncUris, editor ) - const { dispose: disposeAutoInsertion } = volar.editor.activateAutoInsertion( + const { dispose: disposeAutoInsertion } = volar.activateAutoInsertion( worker, languageId, getSyncUris, editor ) - const { dispose: disposeProvides } = await volar.languages.registerProvides( + const { dispose: disposeProvides } = await volar.registerProviders( worker, languageId, getSyncUris, @@ -178,7 +153,37 @@ export function loadMonacoEnv(store: Store) { languages.register({ id: 'vue', extensions: ['.vue'] }) languages.register({ id: 'javascript', extensions: ['.js'] }) languages.register({ id: 'typescript', extensions: ['.ts'] }) - - store.reloadLanguageTools = () => reloadLanguageTools(store) + languages.register({ id: 'css', extensions: ['.css'] }) + languages.setLanguageConfiguration('vue', languageConfigs.vue) + languages.setLanguageConfiguration('javascript', languageConfigs.js) + languages.setLanguageConfiguration('typescript', languageConfigs.ts) + languages.setLanguageConfiguration('css', languageConfigs.css) + + let languageToolsPromise: Promise | undefined + store.reloadLanguageTools = debounce(async () => { + ;(languageToolsPromise ||= reloadLanguageTools(store)).finally(() => { + languageToolsPromise = undefined + }) + }, 250) languages.onLanguage('vue', () => store.reloadLanguageTools!()) + + // Support for go to definition + editor.registerEditorOpener({ + openCodeEditor(_, resource) { + if (resource.toString().startsWith('file:///node_modules')) { + return true + } + + const path = resource.path + if (/^\//.test(path)) { + const fileName = path.replace('/', '') + if (fileName !== store.state.activeFile.filename) { + store.setActive(fileName) + return true + } + } + + return false + }, + }) } diff --git a/src/monaco/highlight.ts b/src/monaco/highlight.ts new file mode 100644 index 00000000..7e5391a4 --- /dev/null +++ b/src/monaco/highlight.ts @@ -0,0 +1,29 @@ +import * as monaco from 'monaco-editor-core' +import { createHighlighterCoreSync } from 'shiki/core' +import { createJavaScriptRegexEngine } from 'shiki/engine-javascript.mjs' +import { shikiToMonaco } from '@shikijs/monaco' + +import langVue from 'shiki/langs/vue.mjs' +import langTsx from 'shiki/langs/tsx.mjs' +import langJsx from 'shiki/langs/jsx.mjs' +import themeDark from 'shiki/themes/dark-plus.mjs' +import themeLight from 'shiki/themes/light-plus.mjs' + +let registered = false +export function registerHighlighter() { + if (!registered) { + const highlighter = createHighlighterCoreSync({ + themes: [themeDark, themeLight], + langs: [langVue, langTsx, langJsx], + engine: createJavaScriptRegexEngine(), + }) + monaco.languages.register({ id: 'vue' }) + shikiToMonaco(highlighter, monaco) + registered = true + } + + return { + light: themeLight.name!, + dark: themeDark.name!, + } +} diff --git a/src/monaco/language-configs.ts b/src/monaco/language-configs.ts new file mode 100644 index 00000000..6a8e7cc5 --- /dev/null +++ b/src/monaco/language-configs.ts @@ -0,0 +1,529 @@ +import { languages } from 'monaco-editor-core' + +// export const html: languages.LanguageConfiguration = { +// comments: { +// blockComment: [''], +// }, +// brackets: [ +// [''], +// ['{', '}'], +// ['(', ')'], +// ], +// autoClosingPairs: [ +// { open: '{', close: '}' }, +// { open: '[', close: ']' }, +// { open: '(', close: ')' }, +// { open: "'", close: "'" }, +// { open: '"', close: '"' }, +// { open: '', notIn: ['comment', 'string'] }, +// ], +// surroundingPairs: [ +// { open: "'", close: "'" }, +// { open: '"', close: '"' }, +// { open: '{', close: '}' }, +// { open: '[', close: ']' }, +// { open: '(', close: ')' }, +// { open: '<', close: '>' }, +// ], +// colorizedBracketPairs: [], +// folding: { +// markers: { +// start: /^\s*/, +// end: /^\s*/, +// }, +// }, +// wordPattern: new RegExp( +// '(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\$\\^\\&\\*\\(\\)\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\\'\\"\\,\\.\\<\\>\\/\\s]+)', +// ), +// onEnterRules: [ +// { +// beforeText: new RegExp( +// '<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w-.\\d]*)(?:(?:[^\'"/>]|"[^"]*"|\'[^\']*\')*?(?!\\/)>)[^<]*$', +// 'i', +// ), +// afterText: new RegExp('^<\\/([_:\\w][_:\\w-.\\d]*)\\s*>', 'i'), +// action: { +// indentAction: languages.IndentAction.IndentOutdent, +// }, +// }, +// { +// beforeText: new RegExp( +// '<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr))([_:\\w][_:\\w-.\\d]*)(?:(?:[^\'"/>]|"[^"]*"|\'[^\']*\')*?(?!\\/)>)[^<]*$', +// 'i', +// ), +// action: { +// indentAction: languages.IndentAction.Indent, +// }, +// }, +// ], +// indentationRules: { +// increaseIndentPattern: new RegExp( +// '<(?!\\?|(?:area|base|br|col|frame|hr|html|img|input|keygen|link|menuitem|meta|param|source|track|wbr)\\b|[^>]*\\/>)([-_\\.A-Za-z0-9]+)(?=\\s|>)\\b[^>]*>(?!.*<\\/\\1>)|)|\\{[^}"\']*$', +// ), +// decreaseIndentPattern: new RegExp( +// '^\\s*(<\\/(?!html)[-_\\.A-Za-z0-9]+\\b[^>]*>|-->|\\})', +// ), +// }, +// } + +export const css: languages.LanguageConfiguration = { + comments: { + blockComment: ['/*', '*/'], + }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'], + ], + autoClosingPairs: [ + { open: '{', close: '}', notIn: ['string', 'comment'] }, + { open: '[', close: ']', notIn: ['string', 'comment'] }, + { open: '(', close: ')', notIn: ['string', 'comment'] }, + { open: '"', close: '"', notIn: ['string', 'comment'] }, + { open: "'", close: "'", notIn: ['string', 'comment'] }, + ], + surroundingPairs: [ + { + open: "'", + close: "'", + }, + { + open: '"', + close: '"', + }, + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + ], + folding: { + markers: { + start: new RegExp('^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/'), + end: new RegExp('^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/'), + }, + }, + indentationRules: { + increaseIndentPattern: new RegExp('(^.*\\{[^}]*$)'), + decreaseIndentPattern: new RegExp('^\\s*\\}'), + }, + wordPattern: new RegExp( + '(#?-?\\d*\\.\\d\\w*%?)|(::?[\\w-]*(?=[^,{;]*[,{]))|(([@#.!])?[\\w-?]+%?|[@#!.])', + ), +} + +export const vue: languages.LanguageConfiguration = { + comments: { + blockComment: [''], + }, + brackets: [ + [''], + ['<', '>'], + ['{', '}'], + ['(', ')'], + ], + autoClosingPairs: [ + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: "'", + close: "'", + }, + { + open: '"', + close: '"', + }, + { + open: '', + notIn: ['comment', 'string'], + }, + { + open: '`', + close: '`', + notIn: ['string', 'comment'], + }, + { + open: '/**', + close: ' */', + notIn: ['string'], + }, + ], + autoCloseBefore: ';:.,=}])><`\'" \n\t', + surroundingPairs: [ + { + open: "'", + close: "'", + }, + { + open: '"', + close: '"', + }, + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: '<', + close: '>', + }, + { + open: '`', + close: '`', + }, + ], + colorizedBracketPairs: [], + folding: { + markers: { + start: /^\s*/, + end: /^\s*/, + }, + }, + wordPattern: + /(-?\d*\.\d\w*)|([^\`\@\~\!\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>/\?\s]+)/, + onEnterRules: [ + { + beforeText: + /<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style))([_:\w][_:\w-.\d]*)(?:(?:[^'"/>]|"[^"]*"|'[^']*')*?(?!\/)>)[^<]*$/i, + afterText: /^<\/([_:\w][_:\w-.\d]*)\s*>/i, + action: { + indentAction: languages.IndentAction.IndentOutdent, + }, + }, + { + beforeText: + /<(?!(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style))([_:\w][_:\w-.\d]*)(?:(?:[^'"/>]|"[^"]*"|'[^']*')*?(?!\/)>)[^<]*$/i, + action: { + indentAction: languages.IndentAction.Indent, + }, + }, + ], + indentationRules: { + increaseIndentPattern: + /<(?!\?|(?:area|base|br|col|frame|hr|html|img|input|keygen|link|menuitem|meta|param|source|track|wbr|script|style)\b|[^>]*\/>)([-_\.A-Za-z0-9]+)(?=\s|>)\b[^>]*>(?!\s*\()(?!.*<\/\1>)|)|\{[^}"']*$/i, + decreaseIndentPattern: /^\s*(<\/(?!html)[-_\.A-Za-z0-9]+\b[^>]*>|-->|\})/, + }, +} + +export const js: languages.LanguageConfiguration = { + comments: { + lineComment: '//', + blockComment: ['/*', '*/'], + }, + brackets: [ + ['${', '}'], + ['{', '}'], + ['[', ']'], + ['(', ')'], + ], + autoClosingPairs: [ + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: "'", + close: "'", + notIn: ['string', 'comment'], + }, + { + open: '"', + close: '"', + notIn: ['string'], + }, + { + open: '`', + close: '`', + notIn: ['string', 'comment'], + }, + { + open: '/**', + close: ' */', + notIn: ['string'], + }, + ], + surroundingPairs: [ + { + open: "'", + close: "'", + }, + { + open: '"', + close: '"', + }, + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: '<', + close: '>', + }, + { + open: '`', + close: '`', + }, + ], + autoCloseBefore: ';:.,=}])>` \n\t', + folding: { + markers: { + start: /^\s*\/\/\s*#?region\b/, + end: /^\s*\/\/\s*#?endregion\b/, + }, + }, + wordPattern: + /(-?\d*\.\d\w*)|([^\`\~\@\!\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>/\?\s]+)/, + indentationRules: { + decreaseIndentPattern: /^((?!.*?\/\*).*\*\/)?\s*[\}\]].*$/, + increaseIndentPattern: + /^((?!\/\/).)*(\{([^}"'`/]*|(\t|[ ])*\/\/.*)|\([^)"'`/]*|\[[^\]"'`/]*)$/, + unIndentedLinePattern: + /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$|^(\t|[ ])*[ ]\*\/\s*$|^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, + }, + onEnterRules: [ + { + beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, + afterText: /^\s*\*\/$/, + action: { + indentAction: languages.IndentAction.IndentOutdent, + appendText: ' * ', + }, + }, + { + beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, + action: { + indentAction: languages.IndentAction.None, + appendText: ' * ', + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, + previousLineText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, + action: { + indentAction: languages.IndentAction.None, + appendText: '* ', + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*\/\s*$/, + action: { + indentAction: languages.IndentAction.None, + removeText: 1, + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$/, + action: { + indentAction: languages.IndentAction.None, + removeText: 1, + }, + }, + { + beforeText: /^\s*(\bcase\s.+:|\bdefault:)$/, + afterText: /^(?!\s*(\bcase\b|\bdefault\b))/, + action: { + indentAction: languages.IndentAction.Indent, + }, + }, + { + previousLineText: /^\s*(((else ?)?if|for|while)\s*\(.*\)\s*|else\s*)$/, + beforeText: /^\s+([^{i\s]|i(?!f\b))/, + action: { + indentAction: languages.IndentAction.Outdent, + }, + }, + ], +} + +export const ts: languages.LanguageConfiguration = { + comments: { + lineComment: '//', + blockComment: ['/*', '*/'], + }, + brackets: [ + ['${', '}'], + ['{', '}'], + ['[', ']'], + ['(', ')'], + ], + autoClosingPairs: [ + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: "'", + close: "'", + notIn: ['string', 'comment'], + }, + { + open: '"', + close: '"', + notIn: ['string'], + }, + { + open: '`', + close: '`', + notIn: ['string', 'comment'], + }, + { + open: '/**', + close: ' */', + notIn: ['string'], + }, + ], + surroundingPairs: [ + { + open: "'", + close: "'", + }, + { + open: '"', + close: '"', + }, + { + open: '{', + close: '}', + }, + { + open: '[', + close: ']', + }, + { + open: '(', + close: ')', + }, + { + open: '<', + close: '>', + }, + { + open: '`', + close: '`', + }, + ], + colorizedBracketPairs: [ + ['(', ')'], + ['[', ']'], + ['{', '}'], + ['<', '>'], + ], + autoCloseBefore: ';:.,=}])>` \n\t', + folding: { + markers: { + start: /^\s*\/\/\s*#?region\b/, + end: /^\s*\/\/\s*#?endregion\b/, + }, + }, + wordPattern: + /(-?\d*\.\d\w*)|([^\`\~\@\!\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>/\?\s]+)/, + indentationRules: { + decreaseIndentPattern: /^((?!.*?\/\*).*\*\/)?\s*[\}\]].*$/, + increaseIndentPattern: + /^((?!\/\/).)*(\{([^}"'`/]*|(\t|[ ])*\/\/.*)|\([^)"'`/]*|\[[^\]"'`/]*)$/, + unIndentedLinePattern: + /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$|^(\t|[ ])*[ ]\*\/\s*$|^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, + }, + onEnterRules: [ + { + beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, + afterText: /^\s*\*\/$/, + action: { + indentAction: languages.IndentAction.IndentOutdent, + appendText: ' * ', + }, + }, + { + beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, + action: { + indentAction: languages.IndentAction.None, + appendText: ' * ', + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, + previousLineText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, + action: { + indentAction: languages.IndentAction.None, + appendText: '* ', + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*\/\s*$/, + action: { + indentAction: languages.IndentAction.None, + removeText: 1, + }, + }, + { + beforeText: /^(\t|[ ])*[ ]\*[^/]*\*\/\s*$/, + action: { + indentAction: languages.IndentAction.None, + removeText: 1, + }, + }, + { + beforeText: /^\s*(\bcase\s.+:|\bdefault:)$/, + afterText: /^(?!\s*(\bcase\b|\bdefault\b))/, + action: { + indentAction: languages.IndentAction.Indent, + }, + }, + { + previousLineText: /^\s*(((else ?)?if|for|while)\s*\(.*\)\s*|else\s*)$/, + beforeText: /^\s+([^{i\s]|i(?!f\b))/, + action: { + indentAction: languages.IndentAction.Outdent, + }, + }, + ], +} diff --git a/src/monaco/vue.worker.ts b/src/monaco/vue.worker.ts index 1988cfa2..4115150d 100644 --- a/src/monaco/vue.worker.ts +++ b/src/monaco/vue.worker.ts @@ -2,17 +2,18 @@ import * as worker from 'monaco-editor-core/esm/vs/editor/editor.worker' import type * as monaco from 'monaco-editor-core' import { - createJsDelivrFs, - createJsDelivrUriResolver, - decorateServiceEnvironment, -} from '@volar/cdn' -import { VueCompilerOptions, resolveConfig } from '@vue/language-service' -import { - createLanguageService, - createLanguageHost, - createServiceEnvironment, + type LanguageServiceEnvironment, + createTypeScriptWorkerLanguageService, } from '@volar/monaco/worker' +import { createNpmFileSystem } from '@volar/jsdelivr' +import { + type VueCompilerOptions, + getFullLanguageServicePlugins, + createVueLanguagePlugin, + resolveVueCompilerOptions, +} from '@vue/language-service' import type { WorkerHost, WorkerMessage } from './env' +import { URI } from 'vscode-uri' export interface CreateData { tsconfig: { @@ -22,24 +23,13 @@ export interface CreateData { dependencies: Record } -let locale: string - let ts: typeof import('typescript') -let tsLocalized: any +let locale: string | undefined self.onmessage = async (msg: MessageEvent) => { if (msg.data?.event === 'init') { - if (msg.data.tsLocale) { - locale = msg.data.tsLocale - } - - ;[ts, tsLocalized] = await Promise.all([ - importTsFromCdn(msg.data.tsVersion), - locale && - fetchJson( - `https://cdn.jsdelivr.net/npm/typescript@${msg.data.tsVersion}/lib/${locale}/diagnosticMessages.generated.json` - ), - ]) + locale = msg.data.tsLocale + ts = await importTsFromCdn(msg.data.tsVersion) self.postMessage('inited') return } @@ -49,44 +39,62 @@ self.onmessage = async (msg: MessageEvent) => { ctx: monaco.worker.IWorkerContext, { tsconfig, dependencies }: CreateData ) => { + const asFileName = (uri: URI) => uri.path + const asUri = (fileName: string): URI => URI.file(fileName) + const env: LanguageServiceEnvironment = { + workspaceFolders: [URI.file('/')], + locale, + fs: createNpmFileSystem( + (uri) => { + if (uri.scheme === 'file') { + if (uri.path === '/node_modules') { + return '' + } else if (uri.path.startsWith('/node_modules/')) { + return uri.path.slice('/node_modules/'.length) + } + } + }, + (pkgName) => dependencies[pkgName], + (path, content) => { + ctx.host.onFetchCdnFile( + asUri('/node_modules/' + path).toString(), + content, + ) + }, + ), + } + const { options: compilerOptions } = ts.convertCompilerOptionsFromJson( tsconfig?.compilerOptions || {}, '' ) - const env = createServiceEnvironment() - const host = createLanguageHost( - ctx.getMirrorModels, - env, - '/src', - compilerOptions - ) - const jsDelivrFs = createJsDelivrFs(ctx.host.onFetchCdnFile) - const jsDelivrUriResolver = createJsDelivrUriResolver( - '/node_modules', - dependencies + const vueCompilerOptions = resolveVueCompilerOptions( + tsconfig.vueCompilerOptions || {}, ) - if (locale) { - env.locale = locale - } - if (tsLocalized) { - host.getLocalizedDiagnosticMessages = () => tsLocalized - } - - decorateServiceEnvironment(env, jsDelivrUriResolver, jsDelivrFs) - - return createLanguageService( - { typescript: ts as any }, + return createTypeScriptWorkerLanguageService({ + typescript: ts, + compilerOptions, + workerContext: ctx, env, - resolveConfig( - {}, - compilerOptions, - tsconfig.vueCompilerOptions || {}, - ts as any - ), - host - ) - } + uriConverter: { + asFileName, + asUri, + }, + languagePlugins: [ + createVueLanguagePlugin( + ts, + compilerOptions, + vueCompilerOptions, + asFileName, + ), + ], + languageServicePlugins: getFullLanguageServicePlugins(ts), + setup({ project }) { + project.vue = { compilerOptions: vueCompilerOptions } + }, + }) + }, ) } @@ -99,14 +107,3 @@ async function importTsFromCdn(tsVersion: string) { globalThis.module = _module return ts as typeof import('typescript') } - -async function fetchJson(url: string) { - try { - const res = await fetch(url) - if (res.status === 200) { - return await res.json() - } - } catch { - // ignore - } -} diff --git a/src/store.ts b/src/store.ts index 4413f0f7..a1a4d35e 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,7 +1,7 @@ import { version, reactive, watchEffect, watch } from 'vue' import * as defaultCompiler from 'vue/compiler-sfc' import { compileFile } from './transform' -import { utoa, atou } from './utils' +import { utoa, atou, hasScriptLangChanged } from './utils' import { SFCScriptCompileOptions, SFCAsyncStyleCompileOptions, @@ -196,6 +196,17 @@ export class ReplStore implements Store { ) ) + // Temporary workaround for https://github.com/vuejs/repl/issues/321 + // which is related to https://github.com/microsoft/TypeScript/issues/57631 + // TODO: remove this when the issue is fixed + watch( + () => this.state.activeFile.code, + (newCode, oldCode) => { + if (this.state.activeFile.language !== 'vue') return + if (hasScriptLangChanged(newCode, oldCode)) this.reloadLanguageTools?.() + } + ) + watch( () => [ this.state.files[tsconfigFile]?.code, diff --git a/src/utils.ts b/src/utils.ts index fd458862..e3fa8401 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -31,3 +31,13 @@ export function atou(base64: string): string { // https://base64.guru/developers/javascript/examples/unicode-strings return decodeURIComponent(escape(binary)) } + +// compares the `lang` attribute of the `