From b35cefc5ddda16e3993b69e1a0cd566f7853df9b Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Tue, 17 Jun 2025 17:46:10 +0100 Subject: [PATCH 1/7] Switch from path to parentPath I've been putting this off for a while, as I had issues in the past with people using old Node versions (e.g. #1806), but it no long works on my machine, so time to make the switch. Also do a bit of a package update. Hit a rollup bug while doing this (https://github.com/rollup/plugins/issues/1877), so holding that update back for now. --- gradle/libs.versions.toml | 2 +- package-lock.json | 676 +++++++++--------- package.json | 4 +- .../modules/cc/internal/syntax/lexer_spec.md | 19 +- .../src/frontend/{typings.ts => typings.d.ts} | 0 projects/web/src/htmlTransform/index.tsx | 2 +- 6 files changed, 370 insertions(+), 333 deletions(-) rename projects/web/src/frontend/{typings.ts => typings.d.ts} (100%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7dd857e81..860bc1a7d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ ideaExt = "1.1.7" illuaminate = "0.1.0-83-g1131f68" lwjgl = "3.3.3" minotaur = "2.8.7" -modDevGradle = "2.0.78" +modDevGradle = "2.0.95" nullAway = "0.12.7" shadow = "8.3.1" spotless = "7.0.2" diff --git a/package-lock.json b/package-lock.json index d83fa0f20..a5db0e74e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,10 +16,10 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-typescript": "^12.0.0", + "@rollup/plugin-typescript": "^12.0.0 && <12.1.3", "@rollup/plugin-url": "^8.0.1", "@swc/core": "^1.3.92", - "@types/node": "^22.0.0", + "@types/node": "^24.0.0", "lightningcss": "^1.22.0", "preact-render-to-string": "^6.2.1", "rehype": "^13.0.0", @@ -31,9 +31,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -48,9 +48,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -65,9 +65,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -82,9 +82,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -99,9 +99,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -116,9 +116,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -133,9 +133,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -150,9 +150,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -167,9 +167,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -184,9 +184,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -201,9 +201,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -218,9 +218,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -235,9 +235,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -252,9 +252,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -269,9 +269,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -286,9 +286,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -303,9 +303,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -320,9 +320,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -337,9 +337,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -354,9 +354,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -371,9 +371,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -388,9 +388,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -405,9 +405,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -422,9 +422,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -439,9 +439,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -531,9 +531,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -554,9 +554,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz", - "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.43.0.tgz", + "integrity": "sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==", "cpu": [ "arm" ], @@ -568,9 +568,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz", - "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.43.0.tgz", + "integrity": "sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==", "cpu": [ "arm64" ], @@ -582,9 +582,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz", - "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.43.0.tgz", + "integrity": "sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==", "cpu": [ "arm64" ], @@ -596,9 +596,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz", - "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.43.0.tgz", + "integrity": "sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==", "cpu": [ "x64" ], @@ -610,9 +610,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz", - "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.43.0.tgz", + "integrity": "sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==", "cpu": [ "arm64" ], @@ -624,9 +624,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz", - "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.43.0.tgz", + "integrity": "sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==", "cpu": [ "x64" ], @@ -638,9 +638,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz", - "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.43.0.tgz", + "integrity": "sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==", "cpu": [ "arm" ], @@ -652,9 +652,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz", - "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.43.0.tgz", + "integrity": "sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==", "cpu": [ "arm" ], @@ -666,9 +666,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz", - "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.43.0.tgz", + "integrity": "sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==", "cpu": [ "arm64" ], @@ -680,9 +680,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz", - "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.43.0.tgz", + "integrity": "sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==", "cpu": [ "arm64" ], @@ -694,9 +694,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz", - "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.43.0.tgz", + "integrity": "sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==", "cpu": [ "loong64" ], @@ -708,9 +708,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz", - "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.43.0.tgz", + "integrity": "sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==", "cpu": [ "ppc64" ], @@ -722,9 +722,23 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz", - "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.43.0.tgz", + "integrity": "sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.43.0.tgz", + "integrity": "sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==", "cpu": [ "riscv64" ], @@ -736,9 +750,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz", - "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.43.0.tgz", + "integrity": "sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==", "cpu": [ "s390x" ], @@ -750,9 +764,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz", - "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.43.0.tgz", + "integrity": "sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==", "cpu": [ "x64" ], @@ -764,9 +778,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz", - "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.43.0.tgz", + "integrity": "sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==", "cpu": [ "x64" ], @@ -778,9 +792,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz", - "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.43.0.tgz", + "integrity": "sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==", "cpu": [ "arm64" ], @@ -792,9 +806,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz", - "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.43.0.tgz", + "integrity": "sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==", "cpu": [ "ia32" ], @@ -806,9 +820,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz", - "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.43.0.tgz", + "integrity": "sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==", "cpu": [ "x64" ], @@ -830,15 +844,15 @@ } }, "node_modules/@swc/core": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.11.tgz", - "integrity": "sha512-pCVY2Wn6dV/labNvssk9b3Owi4WOYsapcbWm90XkIj4xH/56Z6gzja9fsU+4MdPuEfC2Smw835nZHcdCFGyX6A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.1.tgz", + "integrity": "sha512-aKXdDTqxTVFl/bKQZ3EQUjEMBEoF6JBv29moMZq0kbVO43na6u/u+3Vcbhbrh+A2N0X5OL4RaveuWfAjEgOmeA==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.19" + "@swc/types": "^0.1.23" }, "engines": { "node": ">=10" @@ -848,19 +862,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.11.11", - "@swc/core-darwin-x64": "1.11.11", - "@swc/core-linux-arm-gnueabihf": "1.11.11", - "@swc/core-linux-arm64-gnu": "1.11.11", - "@swc/core-linux-arm64-musl": "1.11.11", - "@swc/core-linux-x64-gnu": "1.11.11", - "@swc/core-linux-x64-musl": "1.11.11", - "@swc/core-win32-arm64-msvc": "1.11.11", - "@swc/core-win32-ia32-msvc": "1.11.11", - "@swc/core-win32-x64-msvc": "1.11.11" + "@swc/core-darwin-arm64": "1.12.1", + "@swc/core-darwin-x64": "1.12.1", + "@swc/core-linux-arm-gnueabihf": "1.12.1", + "@swc/core-linux-arm64-gnu": "1.12.1", + "@swc/core-linux-arm64-musl": "1.12.1", + "@swc/core-linux-x64-gnu": "1.12.1", + "@swc/core-linux-x64-musl": "1.12.1", + "@swc/core-win32-arm64-msvc": "1.12.1", + "@swc/core-win32-ia32-msvc": "1.12.1", + "@swc/core-win32-x64-msvc": "1.12.1" }, "peerDependencies": { - "@swc/helpers": "*" + "@swc/helpers": ">=0.5.17" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -869,9 +883,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.11.tgz", - "integrity": "sha512-vJcjGVDB8cZH7zyOkC0AfpFYI/7GHKG0NSsH3tpuKrmoAXJyCYspKPGid7FT53EAlWreN7+Pew+bukYf5j+Fmg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.1.tgz", + "integrity": "sha512-nUjWVcJ3YS2N40ZbKwYO2RJ4+o2tWYRzNOcIQp05FqW0+aoUCVMdAUUzQinPDynfgwVshDAXCKemY8X7nN5MaA==", "cpu": [ "arm64" ], @@ -886,9 +900,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.11.tgz", - "integrity": "sha512-/N4dGdqEYvD48mCF3QBSycAbbQd3yoZ2YHSzYesQf8usNc2YpIhYqEH3sql02UsxTjEFOJSf1bxZABDdhbSl6A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.1.tgz", + "integrity": "sha512-OGm4a4d3OeJn+tRt8H/eiHgTFrJbS6r8mi/Ob65tAEXZGHN900T2kR7c5ALr0V2hBOQ8BfhexwPoQlGQP/B95w==", "cpu": [ "x64" ], @@ -903,9 +917,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.11.tgz", - "integrity": "sha512-hsBhKK+wVXdN3x9MrL5GW0yT8o9GxteE5zHAI2HJjRQel3HtW7m5Nvwaq+q8rwMf4YQRd8ydbvwl4iUOZx7i2Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.1.tgz", + "integrity": "sha512-76YeeQKyK0EtNkQiNBZ0nbVGooPf9IucY0WqVXVpaU4wuG7ZyLEE2ZAIgXafIuzODGQoLfetue7I8boMxh1/MA==", "cpu": [ "arm" ], @@ -920,9 +934,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.11.tgz", - "integrity": "sha512-YOCdxsqbnn/HMPCNM6nrXUpSndLXMUssGTtzT7ffXqr7WuzRg2e170FVDVQFIkb08E7Ku5uOnnUVAChAJQbMOQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.1.tgz", + "integrity": "sha512-BxJDIJPq1+aCh9UsaSAN6wo3tuln8UhNXruOrzTI8/ElIig/3sAueDM6Eq7GvZSGGSA7ljhNATMJ0elD7lFatQ==", "cpu": [ "arm64" ], @@ -937,9 +951,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.11.tgz", - "integrity": "sha512-nR2tfdQRRzwqR2XYw9NnBk9Fdvff/b8IiJzDL28gRR2QiJWLaE8LsRovtWrzCOYq6o5Uu9cJ3WbabWthLo4jLw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.1.tgz", + "integrity": "sha512-NhLdbffSXvY0/FwUSAl4hKBlpe5GHQGXK8DxTo3HHjLsD9sCPYieo3vG0NQoUYAy4ZUY1WeGjyxeq4qZddJzEQ==", "cpu": [ "arm64" ], @@ -954,9 +968,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.11.tgz", - "integrity": "sha512-b4gBp5HA9xNWNC5gsYbdzGBJWx4vKSGybGMGOVWWuF+ynx10+0sA/o4XJGuNHm8TEDuNh9YLKf6QkIO8+GPJ1g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.1.tgz", + "integrity": "sha512-CrYnV8SZIgArQ9LKH0xEF95PKXzX9WkRSc5j55arOSBeDCeDUQk1Bg/iKdnDiuj5HC1hZpvzwMzSBJjv+Z70jA==", "cpu": [ "x64" ], @@ -971,9 +985,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.11.tgz", - "integrity": "sha512-dEvqmQVswjNvMBwXNb8q5uSvhWrJLdttBSef3s6UC5oDSwOr00t3RQPzyS3n5qmGJ8UMTdPRmsopxmqaODISdg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.1.tgz", + "integrity": "sha512-BQMl3d0HaGB0/h2xcKlGtjk/cGRn2tnbsaChAKcjFdCepblKBCz1pgO/mL7w5iXq3s57wMDUn++71/a5RAkZOA==", "cpu": [ "x64" ], @@ -988,9 +1002,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.11.tgz", - "integrity": "sha512-aZNZznem9WRnw2FbTqVpnclvl8Q2apOBW2B316gZK+qxbe+ktjOUnYaMhdCG3+BYggyIBDOnaJeQrXbKIMmNdw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.1.tgz", + "integrity": "sha512-b7NeGnpqTfmIGtUqXBl0KqoSmOnH64nRZoT5l4BAGdvwY7nxitWR94CqZuwyLPty/bLywmyDA9uO12Kvgb3+gg==", "cpu": [ "arm64" ], @@ -1005,9 +1019,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.11.tgz", - "integrity": "sha512-DjeJn/IfjgOddmJ8IBbWuDK53Fqw7UvOz7kyI/728CSdDYC3LXigzj3ZYs4VvyeOt+ZcQZUB2HA27edOifomGw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.1.tgz", + "integrity": "sha512-iU/29X2D7cHBp1to62cUg/5Xk8K+lyOJiKIGGW5rdzTW/c2zz3d/ehgpzVP/rqC4NVr88MXspqHU4il5gmDajw==", "cpu": [ "ia32" ], @@ -1022,9 +1036,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.11.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.11.tgz", - "integrity": "sha512-Gp/SLoeMtsU4n0uRoKDOlGrRC6wCfifq7bqLwSlAG8u8MyJYJCcwjg7ggm0rhLdC2vbiZ+lLVl3kkETp+JUvKg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.1.tgz", + "integrity": "sha512-+Zh+JKDwiFqV5N9yAd2DhYVGPORGh9cfenu1ptr9yge+eHAf7vZJcC3rnj6QMR1QJh0Y5VC9+YBjRFjZVA7XDw==", "cpu": [ "x64" ], @@ -1046,9 +1060,9 @@ "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.19.tgz", - "integrity": "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==", + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", + "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1066,9 +1080,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -1110,13 +1124,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/resolve": { @@ -1218,9 +1232,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1236,9 +1250,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1270,9 +1284,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1294,9 +1308,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1307,9 +1321,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1320,31 +1334,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/estree-util-is-identifier-name": { @@ -1398,9 +1412,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1711,9 +1725,9 @@ } }, "node_modules/lightningcss": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.3.tgz", - "integrity": "sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -1727,22 +1741,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.3", - "lightningcss-darwin-x64": "1.29.3", - "lightningcss-freebsd-x64": "1.29.3", - "lightningcss-linux-arm-gnueabihf": "1.29.3", - "lightningcss-linux-arm64-gnu": "1.29.3", - "lightningcss-linux-arm64-musl": "1.29.3", - "lightningcss-linux-x64-gnu": "1.29.3", - "lightningcss-linux-x64-musl": "1.29.3", - "lightningcss-win32-arm64-msvc": "1.29.3", - "lightningcss-win32-x64-msvc": "1.29.3" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.3.tgz", - "integrity": "sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -1761,9 +1775,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.3.tgz", - "integrity": "sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -1782,9 +1796,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.3.tgz", - "integrity": "sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -1803,9 +1817,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.3.tgz", - "integrity": "sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -1824,9 +1838,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.3.tgz", - "integrity": "sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -1845,9 +1859,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.3.tgz", - "integrity": "sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -1866,9 +1880,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.3.tgz", - "integrity": "sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -1887,9 +1901,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.3.tgz", - "integrity": "sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -1908,9 +1922,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.3.tgz", - "integrity": "sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -1929,9 +1943,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.3", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.3.tgz", - "integrity": "sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -2664,13 +2678,13 @@ "license": "MIT" }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^4.5.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -2697,9 +2711,9 @@ } }, "node_modules/preact": { - "version": "10.26.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz", - "integrity": "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==", + "version": "10.26.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", + "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", "license": "MIT", "funding": { "type": "opencollective", @@ -2717,9 +2731,9 @@ } }, "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "dev": true, "license": "MIT", "funding": { @@ -2842,13 +2856,13 @@ } }, "node_modules/rollup": { - "version": "4.36.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz", - "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.43.0.tgz", + "integrity": "sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -2858,28 +2872,36 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.36.0", - "@rollup/rollup-android-arm64": "4.36.0", - "@rollup/rollup-darwin-arm64": "4.36.0", - "@rollup/rollup-darwin-x64": "4.36.0", - "@rollup/rollup-freebsd-arm64": "4.36.0", - "@rollup/rollup-freebsd-x64": "4.36.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.36.0", - "@rollup/rollup-linux-arm-musleabihf": "4.36.0", - "@rollup/rollup-linux-arm64-gnu": "4.36.0", - "@rollup/rollup-linux-arm64-musl": "4.36.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.36.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0", - "@rollup/rollup-linux-riscv64-gnu": "4.36.0", - "@rollup/rollup-linux-s390x-gnu": "4.36.0", - "@rollup/rollup-linux-x64-gnu": "4.36.0", - "@rollup/rollup-linux-x64-musl": "4.36.0", - "@rollup/rollup-win32-arm64-msvc": "4.36.0", - "@rollup/rollup-win32-ia32-msvc": "4.36.0", - "@rollup/rollup-win32-x64-msvc": "4.36.0", + "@rollup/rollup-android-arm-eabi": "4.43.0", + "@rollup/rollup-android-arm64": "4.43.0", + "@rollup/rollup-darwin-arm64": "4.43.0", + "@rollup/rollup-darwin-x64": "4.43.0", + "@rollup/rollup-freebsd-arm64": "4.43.0", + "@rollup/rollup-freebsd-x64": "4.43.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.43.0", + "@rollup/rollup-linux-arm-musleabihf": "4.43.0", + "@rollup/rollup-linux-arm64-gnu": "4.43.0", + "@rollup/rollup-linux-arm64-musl": "4.43.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.43.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-gnu": "4.43.0", + "@rollup/rollup-linux-riscv64-musl": "4.43.0", + "@rollup/rollup-linux-s390x-gnu": "4.43.0", + "@rollup/rollup-linux-x64-gnu": "4.43.0", + "@rollup/rollup-linux-x64-musl": "4.43.0", + "@rollup/rollup-win32-arm64-msvc": "4.43.0", + "@rollup/rollup-win32-ia32-msvc": "4.43.0", + "@rollup/rollup-win32-x64-msvc": "4.43.0", "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2923,19 +2945,19 @@ } }, "node_modules/style-to-js": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", - "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", "dev": true, "license": "MIT", "dependencies": { - "style-to-object": "1.0.8" + "style-to-object": "1.0.9" } }, "node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", "dev": true, "license": "MIT", "dependencies": { @@ -2984,9 +3006,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", - "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3004,9 +3026,9 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3018,9 +3040,9 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 9c90067e5..9c8645282 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,10 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-typescript": "^12.0.0", + "@rollup/plugin-typescript": "^12.0.0 && <12.1.3", "@rollup/plugin-url": "^8.0.1", "@swc/core": "^1.3.92", - "@types/node": "^22.0.0", + "@types/node": "^24.0.0", "lightningcss": "^1.22.0", "preact-render-to-string": "^6.2.1", "rehype": "^13.0.0", diff --git a/projects/core/src/test/resources/test-rom/spec/modules/cc/internal/syntax/lexer_spec.md b/projects/core/src/test/resources/test-rom/spec/modules/cc/internal/syntax/lexer_spec.md index e73c4f62f..b716b4aa4 100644 --- a/projects/core/src/test/resources/test-rom/spec/modules/cc/internal/syntax/lexer_spec.md +++ b/projects/core/src/test/resources/test-rom/spec/modules/cc/internal/syntax/lexer_spec.md @@ -70,18 +70,33 @@ We expected a closing delimiter (]=]) somewhere after this comment was started. 1:1-1:5 COMMENT --[=[ ``` +But incomplete opening `[`s are treated as a line comment: + +```lua +--[ +--[= +return +``` + +```txt +1:1-1:3 COMMENT --[ +2:1-2:4 COMMENT --[= +3:1-3:6 RETURN return +``` + Nested comments are rejected, just as Lua 5.1 does: ```lua ---[[ [[ ]] +--[[ [[ ]] return ``` ```txt [[ cannot be nested inside another [[ ... ]] | - 1 | --[[ [[ ]] + 1 | --[[ [[ ]] return | ^^ 1:1-1:10 COMMENT --[[ [[ ]] +1:12-1:17 RETURN return ``` # Strings diff --git a/projects/web/src/frontend/typings.ts b/projects/web/src/frontend/typings.d.ts similarity index 100% rename from projects/web/src/frontend/typings.ts rename to projects/web/src/frontend/typings.d.ts diff --git a/projects/web/src/htmlTransform/index.tsx b/projects/web/src/htmlTransform/index.tsx index 19a8b99f1..3aac3bb66 100644 --- a/projects/web/src/htmlTransform/index.tsx +++ b/projects/web/src/htmlTransform/index.tsx @@ -56,7 +56,7 @@ import { type DataExport, WithExport } from "./components/WithExport"; for (const file of await fs.readdir(sourceDir, { withFileTypes: true, recursive: true })) { if(!file.isFile() || !file.name.endsWith(".html")) continue; - const sourcePath = path.join(file.path, file.name); + const sourcePath = path.join(file.parentPath, file.name); const contents = await fs.readFile(sourcePath, "utf-8"); const { result } = await processor.process(contents); From 7c0f79fc3cd48db7b716f7b2ea16087b42edda5e Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Tue, 17 Jun 2025 17:55:24 +0100 Subject: [PATCH 2/7] Move edit_runner into its own module I've a few more features I'd like to add to it. Moving it out makes it slightly easier to maintain. --- .../modules/main/cc/internal/edit_runner.lua | 58 +++++++++++++++++++ .../computercraft/lua/rom/programs/edit.lua | 41 +------------ 2 files changed, 60 insertions(+), 39 deletions(-) create mode 100644 projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/edit_runner.lua diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/edit_runner.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/edit_runner.lua new file mode 100644 index 000000000..b5a59086c --- /dev/null +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/edit_runner.lua @@ -0,0 +1,58 @@ +-- SPDX-FileCopyrightText: 2025 The CC: Tweaked Developers +-- +-- SPDX-License-Identifier: MPL-2.0 + +--[[- Launches a program, reports any errors, and prompts the user to close the +tab. + +> [!DANGER] +> This is an internal module and SHOULD NOT be used in your own code. It may +> be removed or changed at any time. + +This is used by the `edit` program to launch the running code. + +@tparam string title The title of the multishell tab. +@tparam string path The path to the file. +@tparam string contents The contents of the file. + +@local +]] +return function(title, path, contents) + multishell.setTitle(multishell.getCurrent(), title) + local current = term.current() + local fn, err = load(contents, path, nil, _ENV) + if fn then + local exception = require "cc.internal.exception" + local ok, err, co = exception.try(fn) + + term.redirect(current) + term.setTextColor(term.isColour() and colours.yellow or colours.white) + term.setBackgroundColor(colours.black) + term.setCursorBlink(false) + + if not ok then + printError(err) + exception.report(err, co, { [path] = contents }) + end + else + local parser = require "cc.internal.syntax" + if parser.parse_program(contents) then printError(err) end + end + + local message = "Press any key to continue." + local _, y = term.getCursorPos() + local w, h = term.getSize() + local wrapped = require("cc.strings").wrap(message, w) + + term.setTextColor(colours.white) + term.setBackgroundColor(colours.black) + + local start_y = h - #wrapped + 1 + if y >= start_y then term.scroll(y - start_y + 1) end + for i = 1, #wrapped do + term.setCursorPos(1, start_y + i - 1) + term.write(wrapped[i]) + end + os.pullEvent('key') + require "cc.internal.event".discard_char() +end diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua index 0e7a131e8..488f0d9ee 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua @@ -53,44 +53,6 @@ else errorColour = colours.white end -local runHandler = [[multishell.setTitle(multishell.getCurrent(), %q) -local current = term.current() -local contents, name = %q, %q -local fn, err = load(contents, name, nil, _ENV) -if fn then - local exception = require "cc.internal.exception" - local ok, err, co = exception.try(fn, ...) - - term.redirect(current) - term.setTextColor(term.isColour() and colours.yellow or colours.white) - term.setBackgroundColor(colours.black) - term.setCursorBlink(false) - - if not ok then - printError(err) - exception.report(err, co, { [name] = contents }) - end -else - local parser = require "cc.internal.syntax" - if parser.parse_program(contents) then printError(err) end -end - -local message = "Press any key to continue." -if ok then message = "Program finished. " .. message end -local _, y = term.getCursorPos() -local w, h = term.getSize() -local wrapped = require("cc.strings").wrap(message, w) - -local start_y = h - #wrapped + 1 -if y >= start_y then term.scroll(y - start_y + 1) end -for i = 1, #wrapped do - term.setCursorPos(1, start_y + i - 1) - term.write(wrapped[i]) -end -os.pullEvent('key') -require "cc.internal.event".discard_char() -]] - -- Menus local bMenu = false local nMenuItem = 1 @@ -462,7 +424,8 @@ local tMenuFuncs = { return end local ok = save(sTempPath, function(file) - file.write(runHandler:format(sTitle, table.concat(tLines, "\n"), "@/" .. sPath)) + local runHandler = [[return require("cc.internal.edit_runner")(%q, %q, %q)]] + file.write(runHandler:format(sTitle, "@/" .. sPath, table.concat(tLines, "\n"))) end) if ok then local nTask = shell.openTab("/" .. sTempPath) From 798ceefafe48e94828e21e7ef44c18bf58e25cde Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 18 Jun 2025 21:00:32 +0100 Subject: [PATCH 3/7] Add test for crafting of disks See #2221. --- .../computercraft/gametest/Disk_Test.kt | 36 +++++++++++++++++++ .../computercraft/gametest/core/TestHooks.kt | 1 + 2 files changed, 37 insertions(+) create mode 100644 projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Disk_Test.kt diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Disk_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Disk_Test.kt new file mode 100644 index 000000000..5d34e95f0 --- /dev/null +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Disk_Test.kt @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2025 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.gametest + +import dan200.computercraft.core.util.Colour +import dan200.computercraft.gametest.api.craftItem +import dan200.computercraft.gametest.api.immediate +import dan200.computercraft.shared.media.items.DiskItem +import dan200.computercraft.test.shared.ItemStackMatcher.isStack +import net.minecraft.gametest.framework.GameTest +import net.minecraft.gametest.framework.GameTestHelper +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Items +import org.hamcrest.MatcherAssert.assertThat + +class Disk_Test { + /** + * Ensure disks + */ + @GameTest(template = "default") + fun Can_craft_disk(helper: GameTestHelper) = helper.immediate { + assertThat( + "Disk without dye", + helper.craftItem(ItemStack(Items.REDSTONE), ItemStack(Items.PAPER)), + isStack(DiskItem.createFromIDAndColour(-1, null, Colour.BLUE.hex)), + ) + + assertThat( + "Disk with dye", + helper.craftItem(ItemStack(Items.REDSTONE), ItemStack(Items.PAPER), ItemStack(Items.GREEN_DYE)), + isStack(DiskItem.createFromIDAndColour(-1, null, Colour.GREEN.hex)), + ) + } +} diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt index 02b690ee3..b0cd27c73 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt @@ -99,6 +99,7 @@ object TestHooks { Component_Test::class.java, Computer_Test::class.java, CraftOs_Test::class.java, + Disk_Test::class.java, Disk_Drive_Test::class.java, Inventory_Test::class.java, Loot_Test::class.java, From 1f3da5205ca6deb74e08566f3ada8ed684819669 Mon Sep 17 00:00:00 2001 From: Adit Cahya Ramadhan Date: Sat, 21 Jun 2025 22:29:04 +0700 Subject: [PATCH 4/7] Miniscule typo fix in the shell.path() doc comment Noticed this when reading the shell API page in the wiki. --- .../resources/data/computercraft/lua/rom/programs/shell.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/shell.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/shell.lua index eedf27eb0..c6198247f 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/shell.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/shell.lua @@ -300,7 +300,7 @@ function shell.setDir(dir) sDir = fs.combine(dir, "") end ---- Set the path where programs are located. +--- Get the path where programs are located. -- -- The path is composed of a list of directory names in a string, each separated -- by a colon (`:`). On normal turtles will look in the current directory (`.`), From 341d1c7bc27686de28ccf9addf6f463bad3dca73 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 25 Jun 2025 22:13:50 +0100 Subject: [PATCH 5/7] Move paint/edit menu bar into common module I want to add a menu bar to the edit runner too, so let's make this code a little more reusable first. --- .../lua/rom/modules/main/cc/internal/menu.lua | 125 +++++++++ .../computercraft/lua/rom/programs/edit.lua | 247 ++++++------------ .../lua/rom/programs/fun/advanced/paint.lua | 85 +----- 3 files changed, 216 insertions(+), 241 deletions(-) create mode 100644 projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/menu.lua diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/menu.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/menu.lua new file mode 100644 index 000000000..88b5d00dc --- /dev/null +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/menu.lua @@ -0,0 +1,125 @@ +-- SPDX-FileCopyrightText: 2017 Daniel Ratcliffe +-- +-- SPDX-License-Identifier: LicenseRef-CCPL + +--[[- A simple menu bar. + +> [!DANGER] +> This is an internal module and SHOULD NOT be used in your own code. It may +> be removed or changed at any time. + +This provides a shared implementation of the menu bar used by the `edit` and +`paint` programs. This draws a menu bar at the bottom of the string, with a list +of options. + +@local +]] + +local expect = require "cc.expect".expect + +--[[- Create a new menu bar. + +This should be called every time the menu is displayed. + +@tparam { string... } items The menu items to display. +@return The menu. +]] +local function create(items) + expect(1, items, "table") + return { + items = items, + selected = 1, + } +end + +--[[- Draw the menu bar at the bottom of the screen. + +This should be called when first displaying the menu, and if the whole screen is +redrawn (e.g. after a [`term_resize`]). + +@param menu The menu bar to draw. +]] +local function draw(menu) + expect(1, menu, "table") + + local _, height = term.getSize() + term.setCursorPos(1, height) + + term.clearLine() + + local active_colour = term.isColour() and colours.yellow or colours.white + term.setTextColour(colours.white) + for k, v in pairs(menu.items) do + if menu.selected == k then + term.setTextColour(active_colour) + term.write("[") + term.setTextColour(colours.white) + term.write(v) + term.setTextColour(active_colour) + term.write("]") + term.setTextColour(colours.white) + else + term.write(" " .. v .. " ") + end + end +end + +--[[- Process an event. + +@param menu The menu bar to update. +@tparam string The event name. +@param ... Additional arguments to the event. +@treturn nil|boolean|string Either: + + - If no action was taken, return `nil`. + - If the menu was closed, return `false`. + - If an item was selected, return the item as a string. +]] +local function handle_event(menu, event, ...) + expect(1, menu, "table") + + if event == "key" then + local key = ... + + if key == keys.right then + -- Move right + menu.selected = menu.selected + 1 + if menu.selected > #menu.items then menu.selected = 1 end + draw(menu) + elseif key == keys.left and menu.selected > 1 then + -- Move left + menu.selected = menu.selected - 1 + if menu.selected < 1 then menu.selected = #menu.items end + draw(menu) + elseif key == keys.enter or key == keys.numPadEnter then + -- Select an option + return menu.items[menu.selected] + elseif key == keys.leftCtrl or keys == keys.rightCtrl or keys == keys.rightAlt then + -- Cancel the menu + return false + end + elseif event == "char" then + -- Select menu items + local char = (...):lower() + for _, item in pairs(menu.items) do + if item:sub(1, 1):lower() == char then return item end + end + elseif event == "mouse_click" then + local _, x, y = ... + + local _, height = term.getSize() + if y ~= height then return false end -- Exit the menu + + local item_start = 1 + for _, item in ipairs(menu.items) do + local item_end = item_start + #item + 2 + if x >= item_start and x < item_end then return item end + item_start = item_end + end + end + + return nil +end + + +return { create = create, draw = draw, handle_event = handle_event } diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua index 488f0d9ee..748e58ad7 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua @@ -54,19 +54,19 @@ else end -- Menus -local bMenu = false -local nMenuItem = 1 -local tMenuItems = {} +local menu = require "cc.internal.menu" +local current_menu +local menu_items = {} if not bReadOnly then - table.insert(tMenuItems, "Save") + table.insert(menu_items, "Save") end if shell.openTab then - table.insert(tMenuItems, "Run") + table.insert(menu_items, "Run") end if peripheral.find("printer") then - table.insert(tMenuItems, "Print") + table.insert(menu_items, "Print") end -table.insert(tMenuItems, "Exit") +table.insert(menu_items, "Exit") local status_ok, status_text local function set_status(text, ok) @@ -214,7 +214,7 @@ end local function recomplete() local sLine = tLines[y] - if not bMenu and not bReadOnly and x == #sLine + 1 then + if not bReadOnly and x == #sLine + 1 then tCompletions = complete(sLine) if tCompletions and #tCompletions > 0 then nCompletion = 1 @@ -281,22 +281,9 @@ local function redrawMenu() term.write(y) term.setCursorPos(1, h) - if bMenu then + if current_menu then -- Draw menu - term.setTextColour(textColour) - for nItem, sItem in pairs(tMenuItems) do - if nItem == nMenuItem then - term.setTextColour(highlightColour) - term.write("[") - term.setTextColour(textColour) - term.write(sItem) - term.setTextColour(highlightColour) - term.write("]") - term.setTextColour(textColour) - else - term.write(" " .. sItem .. " ") - end - end + menu.draw(current_menu) else -- Draw status term.setTextColour(status_ok and highlightColour or errorColour) @@ -306,6 +293,7 @@ local function redrawMenu() -- Reset cursor term.setCursorPos(x - scrollX, y - scrollY) + term.setCursorBlink(not current_menu) end local tMenuFuncs = { @@ -383,7 +371,8 @@ local tMenuFuncs = { end end - bMenu = false + local old_menu = current_menu + current_menu = nil term.redirect(printerTerminal) local ok, error = pcall(function() term.scroll() @@ -401,7 +390,7 @@ local tMenuFuncs = { redrawMenu() sleep(0.5) end - bMenu = true + current_menu = old_menu if nPage > 1 then set_status("Printed " .. nPage .. " Pages") @@ -442,15 +431,6 @@ local tMenuFuncs = { end, } -local function doMenuItem(_n) - tMenuFuncs[tMenuItems[_n]]() - if bMenu then - bMenu = false - term.setCursorBlink(true) - end - redrawMenu() -end - local function setCursor(newX, newY) local _, oldY = x, y x, y = newX, newY @@ -513,13 +493,29 @@ local function acceptCompletion() end end +local function handleMenuEvent(event) + assert(current_menu) + + local result = menu.handle_event(current_menu, table.unpack(event, 1, event.n)) + if result == false then + current_menu = nil + redrawMenu() + elseif result ~= nil then + tMenuFuncs[result]() + current_menu = nil + redrawMenu() + end +end + -- Handle input while bRunning do - local sEvent, param, param2, param3 = os.pullEvent() - if sEvent == "key" then - if param == keys.up then - -- Up - if not bMenu then + local event = table.pack(os.pullEvent()) + if event[1] == "key" then + if current_menu then + handleMenuEvent(event) + else + local key = event[2] + if key == keys.up then if nCompletion then -- Cycle completions nCompletion = nCompletion - 1 @@ -535,12 +531,8 @@ while bRunning do y - 1 ) end - end - elseif param == keys.down then - -- Down - if not bMenu then - -- Move cursor down + elseif key == keys.down then if nCompletion then -- Cycle completions nCompletion = nCompletion + 1 @@ -556,11 +548,8 @@ while bRunning do y + 1 ) end - end - elseif param == keys.tab then - -- Tab - if not bMenu and not bReadOnly then + elseif key == keys.tab and not bReadOnly then if nCompletion and x == #tLines[y] + 1 then -- Accept autocomplete acceptCompletion() @@ -570,11 +559,8 @@ while bRunning do tLines[y] = string.sub(sLine, 1, x - 1) .. " " .. string.sub(sLine, x) setCursor(x + 4, y) end - end - elseif param == keys.pageUp then - -- Page Up - if not bMenu then + elseif key == keys.pageUp then -- Move up a page local newY if y - (h - 1) >= 1 then @@ -586,11 +572,7 @@ while bRunning do math.min(x, #tLines[newY] + 1), newY ) - end - - elseif param == keys.pageDown then - -- Page Down - if not bMenu then + elseif key == keys.pageDown then -- Move down a page local newY if y + (h - 1) <= #tLines then @@ -600,48 +582,29 @@ while bRunning do end local newX = math.min(x, #tLines[newY] + 1) setCursor(newX, newY) - end - elseif param == keys.home then - -- Home - if not bMenu then + elseif key == keys.home then -- Move cursor to the beginning if x > 1 then setCursor(1, y) end - end - elseif param == keys["end"] then - -- End - if not bMenu then + elseif key == keys["end"] then -- Move cursor to the end local nLimit = #tLines[y] + 1 if x < nLimit then setCursor(nLimit, y) end - end - elseif param == keys.left then - -- Left - if not bMenu then + elseif key == keys.left then if x > 1 then -- Move cursor left setCursor(x - 1, y) elseif x == 1 and y > 1 then setCursor(#tLines[y - 1] + 1, y - 1) end - else - -- Move menu left - nMenuItem = nMenuItem - 1 - if nMenuItem < 1 then - nMenuItem = #tMenuItems - end - redrawMenu() - end - elseif param == keys.right then - -- Right - if not bMenu then + elseif key == keys.right then local nLimit = #tLines[y] + 1 if x < nLimit then -- Move cursor right @@ -653,18 +616,8 @@ while bRunning do -- Go to next line setCursor(1, y + 1) end - else - -- Move menu right - nMenuItem = nMenuItem + 1 - if nMenuItem > #tMenuItems then - nMenuItem = 1 - end - redrawMenu() - end - elseif param == keys.delete then - -- Delete - if not bMenu and not bReadOnly then + elseif key == keys.delete and not bReadOnly then local nLimit = #tLines[y] + 1 if x < nLimit then local sLine = tLines[y] @@ -677,11 +630,8 @@ while bRunning do recomplete() redrawText() end - end - elseif param == keys.backspace then - -- Backspace - if not bMenu and not bReadOnly then + elseif key == keys.backspace and not bReadOnly then if x > 1 then -- Remove character local sLine = tLines[y] @@ -700,11 +650,8 @@ while bRunning do setCursor(sPrevLen + 1, y - 1) redrawText() end - end - elseif param == keys.enter or param == keys.numPadEnter then - -- Enter/Numpad Enter - if not bMenu and not bReadOnly then + elseif (key == keys.enter or key == keys.numPadEnter) and not bReadOnly then -- Newline local sLine = tLines[y] local _, spaces = string.find(sLine, "^[ ]+") @@ -716,96 +663,56 @@ while bRunning do setCursor(spaces + 1, y + 1) redrawText() - elseif bMenu then - -- Menu selection - doMenuItem(nMenuItem) - - end - - elseif param == keys.leftCtrl or param == keys.rightCtrl then - -- Menu toggle - bMenu = not bMenu - if bMenu then - term.setCursorBlink(false) - else - term.setCursorBlink(true) - end - redrawMenu() - elseif param == keys.rightAlt then - if bMenu then - bMenu = false - term.setCursorBlink(true) + elseif key == keys.leftCtrl or key == keys.rightCtrl then + current_menu = menu.create(menu_items) redrawMenu() end end - - elseif sEvent == "char" then - if not bMenu and not bReadOnly then + elseif event[1] == "char" then + if current_menu then + handleMenuEvent(event) + elseif not bReadOnly then -- Input text local sLine = tLines[y] - tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x) + tLines[y] = string.sub(sLine, 1, x - 1) .. event[2] .. string.sub(sLine, x) setCursor(x + 1, y) - - elseif bMenu then - -- Select menu items - for n, sMenuItem in ipairs(tMenuItems) do - if string.lower(string.sub(sMenuItem, 1, 1)) == string.lower(param) then - doMenuItem(n) - break - end - end end - elseif sEvent == "paste" then - if not bReadOnly then - -- Close menu if open - if bMenu then - bMenu = false - term.setCursorBlink(true) - redrawMenu() - end - -- Input text - local sLine = tLines[y] - tLines[y] = string.sub(sLine, 1, x - 1) .. param .. string.sub(sLine, x) - setCursor(x + #param, y) + elseif event[1] == "paste" and not bReadOnly then + -- Close menu if open + if current_menu then + current_menu = nil + redrawMenu() end - elseif sEvent == "mouse_click" then - local cx, cy = param2, param3 - if not bMenu then - if param == 1 then + -- Input text + local text = event[2] + local sLine = tLines[y] + tLines[y] = string.sub(sLine, 1, x - 1) .. text .. string.sub(sLine, x) + setCursor(x + #text, y) + + elseif event[1] == "mouse_click" then + local button, cx, cy = event[2], event[3], event[4] + if current_menu then + handleMenuEvent(event) + else + if button == 1 then -- Left click if cy < h then local newY = math.min(math.max(scrollY + cy, 1), #tLines) local newX = math.min(math.max(scrollX + cx, 1), #tLines[newY] + 1) setCursor(newX, newY) else - bMenu = true + current_menu = menu.create(menu_items) redrawMenu() end end - else - if cy == h then - local nMenuPosEnd = 1 - local nMenuPosStart = 1 - for n, sMenuItem in ipairs(tMenuItems) do - nMenuPosEnd = nMenuPosEnd + #sMenuItem + 1 - if cx > nMenuPosStart and cx < nMenuPosEnd then - doMenuItem(n) - end - nMenuPosEnd = nMenuPosEnd + 1 - nMenuPosStart = nMenuPosEnd - end - else - bMenu = false - term.setCursorBlink(true) - redrawMenu() - end end - elseif sEvent == "mouse_scroll" then - if not bMenu then - if param == -1 then + elseif event[1] == "mouse_scroll" then + if not current_menu then + local direction = event[2] + if direction == -1 then -- Scroll up if scrollY > 0 then -- Move cursor up @@ -813,7 +720,7 @@ while bRunning do redrawText() end - elseif param == 1 then + elseif direction == 1 then -- Scroll down local nMaxScroll = #tLines - (h - 1) if scrollY < nMaxScroll then @@ -825,7 +732,7 @@ while bRunning do end end - elseif sEvent == "term_resize" then + elseif event[1] == "term_resize" then w, h = term.getSize() setCursor(x, y) redrawMenu() diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua index 8b28a0851..b5488009c 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/fun/advanced/paint.lua @@ -20,6 +20,7 @@ local canvasColour = colours.black local canvas = {} -- The menu options +local menu = require "cc.internal.menu" local mChoices = { "Save", "Exit" } -- The message displayed in the footer bar @@ -299,10 +300,7 @@ local menu_choices = { end return false end, - Exit = function() - require "cc.internal.event".discard_char() -- Consume stray "char" events from pressing Ctrl then E separately. - return true - end, + Exit = function() return true end, } --[[ @@ -310,80 +308,25 @@ local menu_choices = { returns: true if the program is to be exited; false otherwise ]] local function accessMenu() - -- Selected menu option - local selection = 1 + local current_menu = menu.create(mChoices) term.setBackgroundColour(colours.black) + menu.draw(current_menu) while true do - -- Draw the menu - term.setCursorPos(1, h) - term.clearLine() - term.setTextColour(colours.white) - for k, v in pairs(mChoices) do - if selection == k then - term.setTextColour(colours.yellow) - term.write("[") - term.setTextColour(colours.white) - term.write(v) - term.setTextColour(colours.yellow) - term.write("]") - term.setTextColour(colours.white) - else - term.write(" " .. v .. " ") - end + -- Handle input in the menu + local event = table.pack(os.pullEvent()) + + local result = menu.handle_event(current_menu, table.unpack(event, 1, event.n)) + if result == false then + return false + elseif result ~= nil then + return menu_choices[result]() end - -- Handle input in the menu - local id, param1, param2, param3 = os.pullEvent() - if id == "key" then - local key = param1 - - -- Handle menu shortcuts. - for _, menu_item in ipairs(mChoices) do - local k = keys[menu_item:sub(1, 1):lower()] - if k and k == key then - return menu_choices[menu_item]() - end - end - - if key == keys.right then - -- Move right - selection = selection + 1 - if selection > #mChoices then - selection = 1 - end - - elseif key == keys.left and selection > 1 then - -- Move left - selection = selection - 1 - if selection < 1 then - selection = #mChoices - end - - elseif key == keys.enter or key == keys.numPadEnter then - -- Select an option - return menu_choices[mChoices[selection]]() - elseif key == keys.leftCtrl or keys == keys.rightCtrl then - -- Cancel the menu - return false - end - elseif id == "mouse_click" then - local cx, cy = param2, param3 - if cy ~= h then return false end -- Exit the menu - - local nMenuPosEnd = 1 - local nMenuPosStart = 1 - for _, sMenuItem in ipairs(mChoices) do - nMenuPosEnd = nMenuPosEnd + #sMenuItem + 1 - if cx > nMenuPosStart and cx < nMenuPosEnd then - return menu_choices[sMenuItem]() - end - nMenuPosEnd = nMenuPosEnd + 1 - nMenuPosStart = nMenuPosEnd - end - elseif id == "term_resize" then + if event[1] == "term_resize" then termResize() + menu.draw(current_menu) end end end From a292d33830d3fbd2ef9a9331b85436eabcf5c8d2 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 25 Jun 2025 22:49:23 +0100 Subject: [PATCH 6/7] Syntax highlighting for multiline tokens in edit I don't love the implementation of this (see discussion in #2220), but it's better than nothing. Wow, the editor really needs a bit of a rewrite, the code is kinda messy. Fixes #1396. --- .../modules/main/cc/internal/syntax/lexer.lua | 134 ++++++++++----- .../computercraft/lua/rom/programs/edit.lua | 153 +++++++++++------- 2 files changed, 191 insertions(+), 96 deletions(-) diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/syntax/lexer.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/syntax/lexer.lua index 2d8d91938..e4b5110fb 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/syntax/lexer.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/modules/main/cc/internal/syntax/lexer.lua @@ -101,16 +101,21 @@ local function lex_number(context, str, start) return tokens.NUMBER, pos - 1 end ---- Lex a quoted string. --- --- @param context The current parser context. --- @tparam string str The string we're lexing. --- @tparam number start_pos The start position of the string. --- @tparam string quote The quote character, either " or '. --- @treturn number The token id for strings. --- @treturn number The new position. -local function lex_string(context, str, start_pos, quote) - local pos = start_pos + 1 +local lex_string_zap + +--[[- Lex a quoted string. + +@param context The current parser context. +@tparam string str The string we're lexing. +@tparam number pos The position to start lexing from. +@tparam number start_pos The actual start position of the string. +@tparam string quote The quote character, either " or '. +@treturn number The token id for strings. +@treturn number The new position. +@treturn nil A placeholder value. +@treturn table|nil The continuation function when the string is not finished. +]] +local function lex_string(context, str, pos, start_pos, quote) while true do local c = sub(str, pos, pos) if c == quote then @@ -125,24 +130,9 @@ local function lex_string(context, str, start_pos, quote) pos = newline(context, str, pos + 1, c) elseif c == "" then context.report(errors.unfinished_string_escape, start_pos, pos, quote) - return tokens.STRING, pos + return tokens.STRING, pos, nil, { lex_string, 1, 1, quote } elseif c == "z" then - pos = pos + 2 - while true do - local next_pos, _, c = find(str, "([%S\r\n])", pos) - - if not next_pos then - context.report(errors.unfinished_string, start_pos, #str, quote) - return tokens.STRING, #str - end - - if c == "\n" or c == "\r" then - pos = newline(context, str, next_pos, c) - else - pos = next_pos - break - end - end + return lex_string_zap(context, str, pos + 2, start_pos, quote) else pos = pos + 2 end @@ -152,6 +142,39 @@ local function lex_string(context, str, start_pos, quote) end end +--[[- Lex the remainder of a zap escape sequence (`\z`). This consumes all leading +whitespace, and then continues lexing the string. + +@param context The current parser context. +@tparam string str The string we're lexing. +@tparam number pos The position to start lexing from. +@tparam number start_pos The actual start position of the string. +@tparam string quote The quote character, either " or '. +@treturn number The token id for strings. +@treturn number The new position. +@treturn nil A placeholder value. +@treturn table|nil The continuation function when the string is not finished. +]] +lex_string_zap = function(context, str, pos, start_pos, quote) + while true do + local next_pos, _, c = find(str, "([%S\r\n])", pos) + + if not next_pos then + context.report(errors.unfinished_string, start_pos, #str, quote) + return tokens.STRING, #str, nil, { lex_string_zap, 1, 1, quote } + end + + if c == "\n" or c == "\r" then + pos = newline(context, str, next_pos, c) + else + pos = next_pos + break + end + end + + return lex_string(context, str, pos, start_pos, quote) +end + --- Consume the start or end of a long string. -- @tparam string str The input string. -- @tparam number pos The start position. This must be after the first `[` or `]`. @@ -205,6 +228,45 @@ local function lex_long_str(context, str, start, len) end end +--[[- Lex the remainder of a long string. + +@param context The current parser context. +@tparam string str The string we're lexing. +@tparam number pos The position to start lexing from. +@tparam number start_pos The actual start position of the string. +@tparam number boundary_length The length of the boundary. +@treturn number The token id for strings. +@treturn number The new position. +@treturn nil A placeholder value. +@treturn table|nil The continuation function when the string is not finished. +]] +local function lex_long_string(context, str, pos, start_pos, boundary_length) + local end_pos = lex_long_str(context, str, pos, boundary_length) + if end_pos then return tokens.STRING, end_pos end + + context.report(errors.unfinished_long_string, start_pos, pos - 1, boundary_length) + return tokens.STRING, #str, nil, { lex_long_string, 0, 0, boundary_length } +end + +--[[- Lex the remainder of a long comment. + +@param context The current parser context. +@tparam string str The comment we're lexing. +@tparam number pos The position to start lexing from. +@tparam number start_pos The actual start position of the comment. +@tparam number boundary_length The length of the boundary. +@treturn number The token id for comments. +@treturn number The new position. +@treturn nil A placeholder value. +@treturn table|nil The continuation function when the comment is not finished. +]] +local function lex_long_comment(context, str, pos, start_pos, boundary_length) + local end_pos = lex_long_str(context, str, pos, boundary_length) + if end_pos then return tokens.COMMENT, end_pos end + + context.report(errors.unfinished_long_comment, start_pos, pos - 1, boundary_length) + return tokens.COMMENT, #str, nil, { lex_long_comment, 0, 0, boundary_length } +end --- Lex a single token, assuming we have removed all leading whitespace. -- @@ -229,16 +291,12 @@ local function lex_token(context, str, pos) elseif c >= "0" and c <= "9" then return lex_number(context, str, pos) -- Strings - elseif c == "\"" or c == "\'" then return lex_string(context, str, pos, c) + elseif c == "\"" or c == "\'" then return lex_string(context, str, pos + 1, pos, c) elseif c == "[" then local ok, boundary_pos = lex_long_str_boundary(str, pos + 1, "[") if ok then -- Long string - local end_pos = lex_long_str(context, str, boundary_pos + 1, boundary_pos - pos) - if end_pos then return tokens.STRING, end_pos end - - context.report(errors.unfinished_long_string, pos, boundary_pos, boundary_pos - pos) - return tokens.STRING, #str + return lex_long_string(context, str, boundary_pos + 1, pos, boundary_pos - pos) elseif pos + 1 == boundary_pos then -- Just a "[" return tokens.OSQUARE, pos else -- Malformed long string, for instance "[=" @@ -256,11 +314,7 @@ local function lex_token(context, str, pos) if sub(str, comment_pos, comment_pos) == "[" then local ok, boundary_pos = lex_long_str_boundary(str, comment_pos + 1, "[") if ok then - local end_pos = lex_long_str(context, str, boundary_pos + 1, boundary_pos - comment_pos) - if end_pos then return tokens.COMMENT, end_pos end - - context.report(errors.unfinished_long_comment, pos, boundary_pos, boundary_pos - comment_pos) - return tokens.COMMENT, #str + return lex_long_comment(context, str, boundary_pos + 1, pos, boundary_pos - comment_pos) end end @@ -357,8 +411,8 @@ local function lex_one(context, str, pos) elseif c == "\r" or c == "\n" then pos = newline(context, str, start_pos, c) else - local token_id, end_pos, content = lex_token(context, str, start_pos) - return token_id, start_pos, end_pos, content + local token_id, end_pos, content, continue = lex_token(context, str, start_pos) + return token_id, start_pos, end_pos, content, continue end end end diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua index 748e58ad7..0b76f82f1 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/programs/edit.lua @@ -30,26 +30,23 @@ local x, y = 1, 1 local w, h = term.getSize() local scrollX, scrollY = 0, 0 -local tLines = {} +local tLines, tLineLexStates = {}, {} local bRunning = true -- Colours -local highlightColour, keywordColour, commentColour, textColour, bgColour, stringColour, errorColour -if term.isColour() then +local isColour = term.isColour() +local highlightColour, keywordColour, textColour, bgColour, errorColour +if isColour then bgColour = colours.black textColour = colours.white highlightColour = colours.yellow keywordColour = colours.yellow - commentColour = colours.green - stringColour = colours.red errorColour = colours.red else bgColour = colours.black textColour = colours.white highlightColour = colours.white keywordColour = colours.white - commentColour = colours.white - stringColour = colours.white errorColour = colours.white end @@ -100,6 +97,7 @@ local function load(_sPath) local sLine = file:read() while sLine do table.insert(tLines, sLine) + table.insert(tLineLexStates, false) sLine = file:read() end file:close() @@ -107,6 +105,7 @@ local function load(_sPath) if #tLines == 0 then table.insert(tLines, "") + table.insert(tLineLexStates, false) end end @@ -142,8 +141,9 @@ local tokens = require "cc.internal.syntax.parser".tokens local lex_one = require "cc.internal.syntax.lexer".lex_one local token_colours = { - [tokens.STRING] = stringColour, - [tokens.COMMENT] = commentColour, + [tokens.STRING] = isColour and colours.red or textColour, + [tokens.COMMENT] = isColour and colours.green or colours.lightGrey, + [tokens.NUMBER] = isColour and colours.magenta or textColour, -- Keywords [tokens.AND] = keywordColour, [tokens.BREAK] = keywordColour, @@ -175,26 +175,6 @@ end local lex_context = { line = function() end, report = function() end } -local function writeHighlighted(line) - local pos, colour = 1, nil - - while true do - local token, _, finish = lex_one(lex_context, line, pos) - if not token then break end - - local new_colour = token_colours[token] - if new_colour ~= colour then - term.setTextColor(new_colour) - colour = new_colour - end - - term.write(line:sub(pos, finish)) - pos = finish + 1 - end - - term.write(line:sub(pos)) -end - local tCompletions local nCompletion @@ -238,34 +218,94 @@ local function writeCompletion(sLine) end end -local function redrawText() - local cursorX, cursorY = x, y - for y = 1, h - 1 do - term.setCursorPos(1 - scrollX, y) +--- Check if two values are equal. If both values are lists, then the contents will be +-- checked for equality, to a depth of 1. +-- +-- @param x The first value. +-- @param x The second value. +-- @treturn boolean Whether the values are equal. +local function shallowEqual(x, y) + if x == y then return true end + + if type(x) ~= "table" or type(y) ~= "table" then return false end + if #x ~= #y then return false end + + for i = 1, #x do if x[i] ~= y[i] then return false end end + return true +end + +local function redrawLines(line, endLine) + if not endLine then endLine = line end + + local colour = term.getTextColour() + + -- Highlight all lines between line and endLine, highlighting further lines if their + -- lexer state has changed and aborting at the end of the screen. + local changed = false + while (changed or line <= endLine) and line - scrollY < h do + term.setCursorPos(1 - scrollX, line - scrollY) term.clearLine() - local sLine = tLines[y + scrollY] - if sLine ~= nil then - writeHighlighted(sLine) - if cursorY == y and cursorX == #sLine + 1 then - writeCompletion() + local contents = tLines[line] + if not contents then break end + + -- Lex our first token, either taking our continuation state (if present) or + -- the default lexer. + local pos, token, _, finish, continuation = 1 + local lex_state = tLineLexStates[line] + if lex_state then + token, finish, _, continuation = lex_state[1](lex_context, contents, table.unpack(lex_state, 2)) + else + token, _, finish, _, continuation = lex_one(lex_context, contents, 1) + end + + while token do + -- Print out that token + local new_colour = token_colours[token] + if new_colour ~= colour then + term.setTextColor(new_colour) + colour = new_colour end + term.write(contents:sub(pos, finish)) + + pos = finish + 1 + + -- If we have a continuation, then we've reached the end of the line. Abort. + if continuation then break end + + -- Otherwise lex another token and continue. + token, _, finish, _, continuation = lex_one(lex_context, contents, pos) + end + + -- Print the rest of the line. We don't strictly speaking need this, as it will + -- only ever contain whitespace. + term.write(contents:sub(pos)) + + if line == y and x == #contents + 1 then + writeCompletion() + colour = term.getTextColour() + end + + line = line + 1 + + -- Update the lext state of the next line. If that has changed, then + -- re-highlight it too. We store the continuation as nil rather than + -- false, to ensure we use the array part of the table. + if continuation == nil then continuation = false end + if tLineLexStates[line] ~= nil and not shallowEqual(tLineLexStates[line], continuation) then + tLineLexStates[line] = continuation or false + changed = true + else + changed = false end end + + term.setTextColor(colours.white) term.setCursorPos(x - scrollX, y - scrollY) end -local function redrawLine(_nY) - local sLine = tLines[_nY] - if sLine then - term.setCursorPos(1 - scrollX, _nY - scrollY) - term.clearLine() - writeHighlighted(sLine) - if _nY == y and x == #sLine + 1 then - writeCompletion() - end - term.setCursorPos(x - scrollX, _nY - scrollY) - end +local function redrawText() + redrawLines(scrollY + 1, scrollY + h - 1) end local function redrawMenu() @@ -462,12 +502,10 @@ local function setCursor(newX, newY) if bRedraw then redrawText() elseif y ~= oldY then - redrawLine(oldY) - redrawLine(y) + redrawLines(math.min(y, oldY), math.max(y, oldY)) else - redrawLine(y) + redrawLines(y) end - term.setCursorPos(screenX, screenY) redrawMenu() end @@ -522,7 +560,7 @@ while bRunning do if nCompletion < 1 then nCompletion = #tCompletions end - redrawLine(y) + redrawLines(y) elseif y > 1 then -- Move cursor up @@ -539,7 +577,7 @@ while bRunning do if nCompletion > #tCompletions then nCompletion = 1 end - redrawLine(y) + redrawLines(y) elseif y < #tLines then -- Move cursor down @@ -623,10 +661,11 @@ while bRunning do local sLine = tLines[y] tLines[y] = string.sub(sLine, 1, x - 1) .. string.sub(sLine, x + 1) recomplete() - redrawLine(y) + redrawLines(y) elseif y < #tLines then tLines[y] = tLines[y] .. tLines[y + 1] table.remove(tLines, y + 1) + table.remove(tLineLexStates, y + 1) recomplete() redrawText() end @@ -647,6 +686,7 @@ while bRunning do local sPrevLen = #tLines[y - 1] tLines[y - 1] = tLines[y - 1] .. tLines[y] table.remove(tLines, y) + table.remove(tLineLexStates, y) setCursor(sPrevLen + 1, y - 1) redrawText() end @@ -660,6 +700,7 @@ while bRunning do end tLines[y] = string.sub(sLine, 1, x - 1) table.insert(tLines, y + 1, string.rep(' ', spaces) .. string.sub(sLine, x)) + table.insert(tLineLexStates, y + 1, false) setCursor(spaces + 1, y + 1) redrawText() From 8344c0a5c2d8dd2c85c77c162caa613d5b6eec5d Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 28 Jun 2025 11:03:52 +0100 Subject: [PATCH 7/7] Bump CC:T to 1.116.0 --- gradle.properties | 2 +- .../assets/computercraft/lang/cs_cz.json | 2 ++ .../assets/computercraft/lang/ja_jp.json | 2 ++ .../assets/computercraft/lang/tr_tr.json | 2 ++ .../assets/computercraft/lang/zh_cn.json | 2 ++ .../computercraft/lua/rom/help/changelog.md | 18 +++++++++++++++++ .../computercraft/lua/rom/help/whatsnew.md | 20 +++++++++++++------ 7 files changed, 41 insertions(+), 7 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0fa66cb6e..a67735bdf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ kotlin.jvm.target.validation.mode=error # Mod properties isUnstable=false -modVersion=1.115.1 +modVersion=1.116.0 # Minecraft properties: We want to configure this here so we can read it in settings.gradle mcVersion=1.20.1 diff --git a/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json b/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json index acd444f34..c4888a827 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json @@ -205,7 +205,9 @@ "item.computercraft.treasure_disk": "Disketa", "itemGroup.computercraft": "ComputerCraft", "tag.item.computercraft.computer": "Počítače", + "tag.item.computercraft.disks": "Disky", "tag.item.computercraft.monitor": "Monitory", + "tag.item.computercraft.pocket_computers": "Kapesní počítače", "tag.item.computercraft.turtle": "Roboti", "tag.item.computercraft.wired_modem": "Drátové modemy", "tracking_field.computercraft.avg": "%s (průměr)", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json b/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json index 4e1c7e8f4..332abbb4f 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json @@ -205,7 +205,9 @@ "item.computercraft.treasure_disk": "フロッピーディスク", "itemGroup.computercraft": "ComputerCraft", "tag.item.computercraft.computer": "コンピューター", + "tag.item.computercraft.disks": "ディスク", "tag.item.computercraft.monitor": "モニター", + "tag.item.computercraft.pocket_computers": "ポケットコンピューター", "tag.item.computercraft.turtle": "タートル", "tag.item.computercraft.wired_modem": "有線モデム", "tracking_field.computercraft.avg": "%s (平均)", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json b/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json index 0b5d4b1af..f20c1ff29 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json @@ -205,7 +205,9 @@ "item.computercraft.treasure_disk": "Disket", "itemGroup.computercraft": "ComputerCraft", "tag.item.computercraft.computer": "Bilgisayarlar", + "tag.item.computercraft.disks": "Diskler", "tag.item.computercraft.monitor": "Monitörler", + "tag.item.computercraft.pocket_computers": "Cep Bilgisayarları", "tag.item.computercraft.turtle": "Turtlelar", "tag.item.computercraft.wired_modem": "Kablolu modemler", "tracking_field.computercraft.avg": "%s (ort.)", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json b/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json index ffff6fc65..ef2d8afbf 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json @@ -205,7 +205,9 @@ "item.computercraft.treasure_disk": "软盘", "itemGroup.computercraft": "ComputerCraft", "tag.item.computercraft.computer": "计算机", + "tag.item.computercraft.disks": "磁盘", "tag.item.computercraft.monitor": "监视器", + "tag.item.computercraft.pocket_computers": "便携式计算机", "tag.item.computercraft.turtle": "海龟", "tag.item.computercraft.wired_modem": "有线调制解调器", "tracking_field.computercraft.avg": "%s (平均)", diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md b/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md index d16716ba3..1f0479900 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md @@ -1,3 +1,21 @@ +# New features in CC: Tweaked 1.116.0 + +* Add `turtle.getEquippedLeft()` and `turtle.getEquippedRight()`. +* Add item tags for floppy disks and pocket computers. +* Support multi-line strings and comments in `edit`. + +Several bug fixes: +* Ignore shader compilation errors when running with Pojav. +* Fix several issues with character input. +* Fix pocket computer dyes being lost when equipping/unequipping upgrades. +* Fix superflous warnings from allocation tracking. +* Fix `__lt`/`__le` not working on heterogeneous types. +* Many documentation fixes (Lemmmy, matematikaadit, McJack12). +* Fix `0` being treated as a valid colour in `window` and `colour.toBlit`. +* Fix out-of-bounds when pasting too lon text. +* Fix syntax highlighting of string escapes (LorneHyde). +* Fix sidebar texture of advanced computers being offset. + # New features in CC: Tweaked 1.115.1 * Update various translations (cyb3r, kevk2156, teamer337, yakku). diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md b/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md index ba927c761..daa1c5de5 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md @@ -1,11 +1,19 @@ -New features in CC: Tweaked 1.115.1 +New features in CC: Tweaked 1.116.0 -* Update various translations (cyb3r, kevk2156, teamer337, yakku). -* Support Fabric's item lookup API for registering media providers. +* Add `turtle.getEquippedLeft()` and `turtle.getEquippedRight()`. +* Add item tags for floppy disks and pocket computers. +* Support multi-line strings and comments in `edit`. Several bug fixes: -* Fix crashes on Create 6.0 (ellellie). -* Fix `speaker.playAudio` not updating speaker volume. -* Resize pocket lectern textures to fix issues with generating mipmaps. +* Ignore shader compilation errors when running with Pojav. +* Fix several issues with character input. +* Fix pocket computer dyes being lost when equipping/unequipping upgrades. +* Fix superflous warnings from allocation tracking. +* Fix `__lt`/`__le` not working on heterogeneous types. +* Many documentation fixes (Lemmmy, matematikaadit, McJack12). +* Fix `0` being treated as a valid colour in `window` and `colour.toBlit`. +* Fix out-of-bounds when pasting too lon text. +* Fix syntax highlighting of string escapes (LorneHyde). +* Fix sidebar texture of advanced computers being offset. Type "help changelog" to see the full version history.