From 80e5943c887d02a979ff79e3de6751724ee22352 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:25:56 +0300 Subject: [PATCH 001/309] fix: update rsbuild and pnpm to latest version to resolve long-standing annoying issues and fix critical code loss issue! closes #264 --- .github/workflows/benchmark.yml | 9 +- CONTRIBUTING.md | 4 +- Dockerfile | 6 +- package.json | 21 +- ...@1.54.0.patch => minecraft-protocol.patch} | 0 patches/three@0.154.0.patch | 16 - pnpm-lock.yaml | 958 ++++++------------ 7 files changed, 339 insertions(+), 675 deletions(-) rename patches/{minecraft-protocol@1.54.0.patch => minecraft-protocol.patch} (100%) delete mode 100644 patches/three@0.154.0.patch diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 70a24af9..18abb9d6 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -19,11 +19,11 @@ jobs: pull-requests: write steps: - run: lscpu + - name: Checkout uses: actions/checkout@v2 - # with: - # ref: refs/pull/${{ github.event.issue.number }}/head - - run: npm i -g pnpm@9.0.4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: node-version: 18 @@ -33,8 +33,10 @@ jobs: jq '.dependencies.cypress = .optionalDependencies.cypress | del(.optionalDependencies.cypress)' package.json > package.json.tmp mv package.json.tmp package.json - run: pnpm install --no-frozen-lockfile + - run: pnpm build - run: nohup pnpm prod-start & + - run: pnpm test:benchmark id: benchmark continue-on-error: true @@ -49,6 +51,7 @@ jobs: else echo "BENCHMARK_RESULT=Benchmark failed to run or produce results" >> $GITHUB_ENV fi + - uses: mshick/add-pr-comment@v2 with: allow-repeats: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fb0ae55e..06df61fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,8 +9,10 @@ After forking the repository, run the following commands to get started: 4. Let us know if you are working on something and be sure to open a PR if you got any changes. Happy coding! *(1): If you are getting `Cannot find matching keyid` update corepack to the latest version with `npm i -g corepack`. + *(2): If still something doesn't work ensure you have the right nodejs version with `node -v` (tested on 22.x) -*(3): For GitHub codespaces (cloud ide): Run `pnpm i @rsbuild/core@1.2.4 @rsbuild/plugin-node-polyfill@1.3.0 @rsbuild/plugin-react@1.1.0 @rsbuild/plugin-typed-css-modules@1.0.2` command to avoid crashes because of limited ram + + ## Project Structure diff --git a/Dockerfile b/Dockerfile index 34641353..cd8cfe2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,8 @@ FROM node:18-alpine AS build RUN apk add git WORKDIR /app COPY . /app -# install pnpm -RUN npm i -g pnpm@9.0.4 +# install pnpm with corepack +RUN corepack enable # Build arguments ARG DOWNLOAD_SOUNDS=false ARG DISABLE_SERVICE_WORKER=false @@ -35,7 +35,7 @@ WORKDIR /app COPY --from=build /app/dist /app/dist COPY server.js /app/server.js # Install express -RUN npm i -g pnpm@9.0.4 +RUN npm corepack enable RUN npm init -yp RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors EXPOSE 8080 diff --git a/package.json b/package.json index 843f1ff2..c368eb16 100644 --- a/package.json +++ b/package.json @@ -81,13 +81,13 @@ "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "jszip": "^3.10.1", "lodash-es": "^4.17.21", + "mcraft-fun-mineflayer": "^0.1.14", "minecraft-data": "3.83.1", "minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol#master", "mineflayer-item-map-downloader": "github:zardoy/mineflayer-item-map-downloader", "mojangson": "^2.0.4", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", - "mcraft-fun-mineflayer": "^0.1.14", "peerjs": "^1.5.0", "pixelarticons": "^1.8.1", "pretty-bytes": "^6.1.1", @@ -119,11 +119,11 @@ "workbox-build": "^7.0.0" }, "devDependencies": { - "@rsbuild/core": "1.0.1-beta.9", - "@rsbuild/plugin-node-polyfill": "1.0.3", - "@rsbuild/plugin-react": "1.0.1-beta.9", - "@rsbuild/plugin-type-check": "1.0.1-beta.9", - "@rsbuild/plugin-typed-css-modules": "1.0.1", + "@rsbuild/core": "1.3.5", + "@rsbuild/plugin-node-polyfill": "1.3.0", + "@rsbuild/plugin-react": "1.2.0", + "@rsbuild/plugin-type-check": "1.2.1", + "@rsbuild/plugin-typed-css-modules": "1.0.2", "@storybook/addon-essentials": "^7.4.6", "@storybook/addon-links": "^7.4.6", "@storybook/blocks": "^7.4.6", @@ -152,16 +152,16 @@ "http-server": "^14.1.1", "https-browserify": "^1.0.0", "mc-assets": "^0.2.52", - "mineflayer-mouse": "^0.1.7", "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", "mineflayer": "github:GenerelSchwerz/mineflayer", + "mineflayer-mouse": "^0.1.7", "mineflayer-pathfinder": "^2.4.4", "npm-run-all": "^4.1.5", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", "path-exists-cli": "^2.0.0", - "renderer": "link:renderer", "process": "github:PrismarineJS/node-process", + "renderer": "link:renderer", "rimraf": "^5.0.1", "storybook": "^7.4.6", "stream-browserify": "^3.0.0", @@ -214,11 +214,10 @@ "ignoreDependencies": [] }, "patchedDependencies": { - "three@0.154.0": "patches/three@0.154.0.patch", "pixelarticons@1.8.1": "patches/pixelarticons@1.8.1.patch", "mineflayer-item-map-downloader@1.2.0": "patches/mineflayer-item-map-downloader@1.2.0.patch", - "minecraft-protocol@1.54.0": "patches/minecraft-protocol@1.54.0.patch" + "minecraft-protocol": "patches/minecraft-protocol.patch" } }, - "packageManager": "pnpm@9.0.4" + "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b" } diff --git a/patches/minecraft-protocol@1.54.0.patch b/patches/minecraft-protocol.patch similarity index 100% rename from patches/minecraft-protocol@1.54.0.patch rename to patches/minecraft-protocol.patch diff --git a/patches/three@0.154.0.patch b/patches/three@0.154.0.patch deleted file mode 100644 index e612415c..00000000 --- a/patches/three@0.154.0.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/examples/jsm/webxr/VRButton.js b/examples/jsm/webxr/VRButton.js -index 6856a21b17aa45d7922bbf776fd2d7e63c7a9b4e..0925b706f7629bd52f0bb5af469536af8f5fce2c 100644 ---- a/examples/jsm/webxr/VRButton.js -+++ b/examples/jsm/webxr/VRButton.js -@@ -62,7 +62,10 @@ class VRButton { - // ('local' is always available for immersive sessions and doesn't need to - // be requested separately.) - -- const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking', 'layers' ] }; -+ const sessionInit = { -+ optionalFeatures: ['local-floor', 'bounded-floor', 'layers'], -+ domOverlay: { root: document.body }, -+ }; - navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted ); - - } else { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af2069dd..c9e1e66b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,18 +21,15 @@ overrides: prismarine-item: latest patchedDependencies: - minecraft-protocol@1.54.0: - hash: dkeyukcqlupmk563gwxsmjr3yu - path: patches/minecraft-protocol@1.54.0.patch + minecraft-protocol: + hash: 3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab + path: patches/minecraft-protocol.patch mineflayer-item-map-downloader@1.2.0: - hash: bck55yjvd4wrgz46x7o4vfur5q + hash: a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad path: patches/mineflayer-item-map-downloader@1.2.0.patch pixelarticons@1.8.1: - hash: cclg2qo6d4yjs4evj64nr2mbwa + hash: d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325 path: patches/pixelarticons@1.8.1.patch - three@0.154.0: - hash: sj7ocb4p23jym6bkfgueanti2e - path: patches/three@0.154.0.patch importers: @@ -136,22 +133,22 @@ importers: version: 4.17.21 mcraft-fun-mineflayer: specifier: ^0.1.14 - version: 0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13)) + version: 0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13)) minecraft-data: specifier: 3.83.1 version: 3.83.1 minecraft-protocol: specifier: github:PrismarineJS/node-minecraft-protocol#master - version: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) + version: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mineflayer-item-map-downloader: specifier: github:zardoy/mineflayer-item-map-downloader - version: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=bck55yjvd4wrgz46x7o4vfur5q)(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13) mojangson: specifier: ^2.0.4 version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -160,7 +157,7 @@ importers: version: 1.5.4 pixelarticons: specifier: ^1.8.1 - version: 1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa) + version: 1.8.1(patch_hash=d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325) pretty-bytes: specifier: ^6.1.1 version: 6.1.1 @@ -242,35 +239,22 @@ importers: workbox-build: specifier: ^7.0.0 version: 7.3.0(@types/babel__core@7.20.5) - optionalDependencies: - cypress: - specifier: ^10.11.0 - version: 10.11.0 - cypress-plugin-snapshots: - specifier: ^1.4.4 - version: 1.4.4(cypress@10.11.0)(debug@4.4.0) - sharp: - specifier: ^0.33.5 - version: 0.33.5 - systeminformation: - specifier: ^5.21.22 - version: 5.25.11 devDependencies: '@rsbuild/core': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9 + specifier: 1.3.5 + version: 1.3.5 '@rsbuild/plugin-node-polyfill': - specifier: 1.0.3 - version: 1.0.3(@rsbuild/core@1.0.1-beta.9) + specifier: 1.3.0 + version: 1.3.0(@rsbuild/core@1.3.5) '@rsbuild/plugin-react': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9) + specifier: 1.2.0 + version: 1.2.0(@rsbuild/core@1.3.5) '@rsbuild/plugin-type-check': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)(esbuild@0.19.12)(typescript@5.5.4) + specifier: 1.2.1 + version: 1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) '@rsbuild/plugin-typed-css-modules': - specifier: 1.0.1 - version: 1.0.1(@rsbuild/core@1.0.1-beta.9) + specifier: 1.0.2 + version: 1.0.2(@rsbuild/core@1.3.5) '@storybook/addon-essentials': specifier: ^7.4.6 version: 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -357,10 +341,10 @@ importers: version: 0.2.52 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8(@types/react@18.3.18)(react@18.3.1) + version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1) mineflayer: specifier: github:GenerelSchwerz/mineflayer - version: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13) + version: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13) mineflayer-mouse: specifier: ^0.1.7 version: 0.1.7(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) @@ -396,7 +380,7 @@ importers: version: 3.0.0 three: specifier: 0.154.0 - version: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + version: 0.154.0 timers-browserify: specifier: ^2.0.12 version: 2.0.12 @@ -409,6 +393,19 @@ importers: yaml: specifier: ^2.3.2 version: 2.7.0 + optionalDependencies: + cypress: + specifier: ^10.11.0 + version: 10.11.0 + cypress-plugin-snapshots: + specifier: ^1.4.4 + version: 1.4.4(cypress@10.11.0)(debug@4.4.0) + sharp: + specifier: ^0.33.5 + version: 0.33.5 + systeminformation: + specifier: ^5.21.22 + version: 5.25.11 renderer: dependencies: @@ -438,7 +435,7 @@ importers: version: 1.3.9 prismarine-block: specifier: github:zardoy/prismarine-block#next-era - version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chunk: specifier: github:zardoy/prismarine-chunk#master version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) @@ -459,7 +456,7 @@ importers: version: 4.8.1 three-stdlib: specifier: ^2.26.11 - version: 2.35.14(three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e)) + version: 2.35.14(three@0.154.0) three.meshline: specifier: ^1.3.0 version: 1.4.0 @@ -469,6 +466,10 @@ importers: vec3: specifier: 0.1.10 version: 0.1.10 + devDependencies: + live-server: + specifier: ^1.2.2 + version: 1.2.2 optionalDependencies: canvas: specifier: ^2.11.2 @@ -476,10 +477,6 @@ importers: node-canvas-webgl: specifier: ^0.3.0 version: 0.3.0(encoding@0.1.13) - devDependencies: - live-server: - specifier: ^1.2.2 - version: 1.2.2 renderer/viewer/sign-renderer: dependencies: @@ -1943,6 +1940,24 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.2.0': + resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jspm/core@2.1.0': resolution: {integrity: sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==} @@ -1961,17 +1976,23 @@ packages: peerDependencies: react: ^18.2.0 - '@module-federation/runtime-tools@0.2.3': - resolution: {integrity: sha512-capN8CVTCEqNAjnl102girrkevczoQfnQYyiYC4WuyKsg7+LUqfirIe1Eiyv6VSE2UgvOTZDnqvervA6rBOlmg==} + '@module-federation/error-codes@0.11.2': + resolution: {integrity: sha512-ik1Qnn0I+WyEdprTck9WGlH41vGsVdUg8cfO+ZM02qOb2cZm5Vu3SlxGAobj6g7uAj0g8yINnd7h7Dci40BxQA==} - '@module-federation/runtime@0.2.3': - resolution: {integrity: sha512-N+ZxBUb1mkmfO9XT1BwgYQgShtUTlijHbukqQ4afFka5lRAT+ayC7RKfHJLz0HbuexKPCmPBDfdmCnErR5WyTQ==} + '@module-federation/runtime-core@0.11.2': + resolution: {integrity: sha512-dia5kKybi6MFU0s5PgglJwN27k7n9Sf69Cy5xZ4BWaP0qlaXTsxHKO0PECHNt2Pt8jDdyU29sQ4DwAQfxpnXJQ==} - '@module-federation/sdk@0.2.3': - resolution: {integrity: sha512-W9zrPchLocyCBc/B8CW21akcfJXLl++9xBe1L1EtgxZGfj/xwHt0GcBWE/y+QGvYTL2a1iZjwscbftbUhxgxXg==} + '@module-federation/runtime-tools@0.11.2': + resolution: {integrity: sha512-4MJTGAxVq6vxQRkTtTlH7Mm9AVqgn0X9kdu+7RsL7T/qU+jeYsbrntN2CWG3GVVA8r5JddXyTI1iJ0VXQZLV1w==} - '@module-federation/webpack-bundler-runtime@0.2.3': - resolution: {integrity: sha512-L/jt2uJ+8dwYiyn9GxryzDR6tr/Wk8rpgvelM2EBeLIhu7YxCHSmSjQYhw3BTux9zZIr47d1K9fGjBFsVRd/SQ==} + '@module-federation/runtime@0.11.2': + resolution: {integrity: sha512-Ya9u/L6z2LvhgpqxuKCB7LcigIIRf1BbaxAZIH7mzbq/A7rZtTP7v+73E433jvgiAlbAfPSZkeoYGele6hfRwA==} + + '@module-federation/sdk@0.11.2': + resolution: {integrity: sha512-SBFe5xOamluT900J4AGBx+2/kCH/JbfqXoUwPSAC6PRzb8Y7LB0posnOGzmqYsLZXT37vp3d6AmJDsVoajDqxw==} + + '@module-federation/webpack-bundler-runtime@0.11.2': + resolution: {integrity: sha512-WdwIE6QF+MKs/PdVu0cKPETF743JB9PZ62/qf7Uo3gU4fjsUMc37RnbJZ/qB60EaHHfjwp1v6NnhZw1r4eVsnw==} '@msgpack/msgpack@2.8.0': resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} @@ -2582,104 +2603,111 @@ packages: cpu: [x64] os: [win32] - '@rsbuild/core@1.0.1-beta.9': - resolution: {integrity: sha512-F9npL47TFmNVhPBqoE6jBvKGxXEKNszBA7skhbi3opskmX7Ako9vfXvtgi2W2jQjq837/WUL8gG/ua9zRqKFEQ==} + '@rsbuild/core@1.3.5': + resolution: {integrity: sha512-Fn6nJ4YvLO2UtFcoSPxgJoiUdS0Iix7X1BsyZ+DCj3SGpVCxp3Td9x58F5uhcRraMZFPB91wvcS/OabYwT3N2w==} engines: {node: '>=16.7.0'} hasBin: true - '@rsbuild/plugin-node-polyfill@1.0.3': - resolution: {integrity: sha512-AoPIOV1pyInIz08K1ECwUjFemLLSa5OUq8sfJN1ShXrGR2qc14b1wzwZKwF4vgKnBromqfMLagVbk6KT/nLIvQ==} + '@rsbuild/plugin-node-polyfill@1.3.0': + resolution: {integrity: sha512-KvckyUg9wq3F1Iv/y4+mlcnO/E7vDklvMY7kF6CxnUYImroQVw/EDS0zDezkPvcm7aKTH5b0Jaa0iIcTNFzhVw==} peerDependencies: '@rsbuild/core': 1.x peerDependenciesMeta: '@rsbuild/core': optional: true - '@rsbuild/plugin-react@1.0.1-beta.9': - resolution: {integrity: sha512-MX5bWSEW5Nr8jhNAVxWlNVnraJxtOYTEZna5znaypLv7m4V8w0go1Nzb210ueRSbFCEYvP+zJZzkq33m+3TWXQ==} + '@rsbuild/plugin-react@1.2.0': + resolution: {integrity: sha512-TXd0cvcLPF7OrO215vlGSyRXD6Fc3KQWhFuXFKOtRYp+C1Vc9oeW0GopUIStv2pI2/xtv2XX8GOAdJsnsc6lkA==} peerDependencies: - '@rsbuild/core': ^1.0.1-beta.9 + '@rsbuild/core': 1.x - '@rsbuild/plugin-type-check@1.0.1-beta.9': - resolution: {integrity: sha512-nvH1zoxeWE1S+pg4UQ7PNsBjfa+cOYyApn+2qcmVzgTMbglfyqalPtaUSa8zRFmToooJNK3Ko//6w1zvSbOi8w==} - peerDependencies: - '@rsbuild/core': ^1.0.1-beta.9 - - '@rsbuild/plugin-typed-css-modules@1.0.1': - resolution: {integrity: sha512-biCSm7+vOgqrqXdAjxnjGNA7KPUfBadfndCeINJ2HApWfuQ2TLWuI5R+MzGvslis13SCKQ55K7NMAkvRhXyi8w==} + '@rsbuild/plugin-type-check@1.2.1': + resolution: {integrity: sha512-PtbjeMqDQy8IiPDTuaj8ZmvR42b0AsRq6RUF6wxa8dDsOzD0Dl1GcvemVGCto+/Dh8frLUmnlWF+T8riBw5rtA==} peerDependencies: '@rsbuild/core': 1.x peerDependenciesMeta: '@rsbuild/core': optional: true - '@rspack/binding-darwin-arm64@1.0.0-beta.1': - resolution: {integrity: sha512-KyC+xEMy9Y5JivO2e5rlKFGT74uwDhbwJjSCR5KOLQtZjDWeLwhf7aZhkoSQJUEsK5tAuuUoTP02RJFzK5llpA==} + '@rsbuild/plugin-typed-css-modules@1.0.2': + resolution: {integrity: sha512-QX376pBXWeBrZBvYLP2HGGrHiWA5O0SDHwRoBNto5BqYDXhi6y+Eol2Hb/cY+h2ARKZVanMfUiJRABULOJ/FCQ==} + peerDependencies: + '@rsbuild/core': 1.x || ^1.0.1-beta.0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + + '@rspack/binding-darwin-arm64@1.3.3': + resolution: {integrity: sha512-vbzEdpRCZl5+HXWsVjzSDqB9ZVIlqldV+udHp4YDD8qiwdQznVaBZke0eMzZ7kaInqRPsZ+UHQuVk6JaH/JkMQ==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.0.0-beta.1': - resolution: {integrity: sha512-Onc35+qQ7YwE6+aB66l/ZnRFXfhA1hXH5aNnNJmIFEAmqzkvOGREkWy3CdfsklF/l/xt33iUM7ccnNgdpk7yKw==} + '@rspack/binding-darwin-x64@1.3.3': + resolution: {integrity: sha512-OXtY2s4nlYtUXkeJt8TQKKNIcN7PI8yDq0nqI75OfJoS4u1ZmRXJ8IMeSALLo8I+xD2RAF79tf7yhM/Y/AaiKQ==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.1': - resolution: {integrity: sha512-NlXtRlKcoBzB6EQEiXegW0nMToEPXD+hExaev0j1+uzsFrMJ0uIY49k6+DapwWZ8A2jUdvH7xdWT+eAXD3l/EA==} + '@rspack/binding-linux-arm64-gnu@1.3.3': + resolution: {integrity: sha512-Lluq3RLYzyCMdXr/HyALKEPGsr+196x8Ccuy5AmIRosOdWuwtSiomSRH1Ka8REUFNHfYy5y9SzfmIZo/E0QEmg==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.0.0-beta.1': - resolution: {integrity: sha512-fPS8ukoPgmBSUX4dt74flObcbYzO3uaP1bk4k/98Gr3Bw0ACDZ6h5nqlxoXoeVzhNcNMBcfv45un8H3i411AyA==} + '@rspack/binding-linux-arm64-musl@1.3.3': + resolution: {integrity: sha512-PIsicXWjOqzmoOutUqxpMNkCoKo+8/wxDyKxHFeu+5WIAxVFphe2d3H5qvEjc2MasWSdRmAVn9XiuIj2LIXFzA==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.0.0-beta.1': - resolution: {integrity: sha512-9U78G7BtevPZ9GEJ2AhGHt03n+GEhKVvEZ/tgu+flFV0tYGjq75QQX345x4m+uercTqzRBTyuWITweIzppeWuQ==} + '@rspack/binding-linux-x64-gnu@1.3.3': + resolution: {integrity: sha512-BtksK73ZFdny2T/wU1x0kxBF4ruYUUArZDyeGfpO+vd/1nNYqzzdhGvOksKmtdvsO38ETr2gZ9+XZyr1vpy9uQ==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.0.0-beta.1': - resolution: {integrity: sha512-qqNPseWAOKmV33YL7tihY0N9xwY+N1G9na6lT7iqZnsrzPkIZmESI9Z24fXVJqLC/UhfxAth4RKhVBeKTsPk1w==} + '@rspack/binding-linux-x64-musl@1.3.3': + resolution: {integrity: sha512-jx86CxkTmyBz/eHDqZp1mCqBwY+UTEtaPlPoWFyGkJUR5ey6nQnxS+fhG34Rqz63chW+q/afwpGNGyALYdgc8g==} cpu: [x64] os: [linux] - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-VeBGYItHWqImYt23rBChXrk1o7fQxwTv6BEhtMpTnMJV10O6+Db9NckPEplcKLmNKAAA5anxH40GcpPc4nff8A==} + '@rspack/binding-win32-arm64-msvc@1.3.3': + resolution: {integrity: sha512-uXAdDzajFToVrH3fCNVDP/uKQ9i5FQjJc2aYxsnhS9Su/CZB+UQsOecbq6MnIN2s0B9GBKBG8QdQEtS3RtC6Hg==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-ZxLQ1zOpyCKefsKvDYGGIHM019avNPfesJKdw7wYqeC+EIvWZfs86lnhlSL5PlZzV5AfFZQyQJFRjAv4JPpe4Q==} + '@rspack/binding-win32-ia32-msvc@1.3.3': + resolution: {integrity: sha512-VBE6XsJ3IiAlozAywAIxAZ1Aqc2QVnEwBo0gP9998KkwL7wxB6Bg/OJnPbH3Q0ZaNWAQViC99rPC+5hSIdeSxw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-tMrjEA/2SGMVLbh/zOQoZrr1Xx+oI6RZnkXH6l95ON4yZiD+8wM84w8Ernj1N8KwclTuvBzxM0r3DLHTNZcDhw==} + '@rspack/binding-win32-x64-msvc@1.3.3': + resolution: {integrity: sha512-rOsNz4/DFgSENjEh0t9kFn89feuXK14/9wbmmFlT8VMpYOCcj4tKcAHjWg+Nzzj4FL+NSOC/81SrUF9J+C2R7w==} cpu: [x64] os: [win32] - '@rspack/binding@1.0.0-beta.1': - resolution: {integrity: sha512-p7XBvk1+fAmvrlmdeRr5J9wdXx5idVZjHFJu/3qPHWf5mHKRw2/tQVbqzExj+B1nwR6HXFgxCiiddaWauMS/YQ==} + '@rspack/binding@1.3.3': + resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} - '@rspack/core@1.0.0-beta.1': - resolution: {integrity: sha512-aUWR/FUUw7x0L/qEZ0qrXC+7YYOL0Ezwd95TqDIDIYkSODJ6ZPt3a8poPwWc7IBdONgb8sGDPTzAXXEjcsBMwQ==} + '@rspack/core@1.3.3': + resolution: {integrity: sha512-+mXVlFcYr0tWezZfJ/gR0fj8njRc7pzEMtTFa2NO5cfsNAKPF/SXm4rb55kfa63r0b3U3N7f2nKrJG9wyG7zMQ==} engines: {node: '>=16.0.0'} peerDependencies: + '@rspack/tracing': ^1.x '@swc/helpers': '>=0.5.1' peerDependenciesMeta: + '@rspack/tracing': + optional: true '@swc/helpers': optional: true - '@rspack/lite-tapable@1.0.0-beta.1': - resolution: {integrity: sha512-r4xtbJp6QhW6A1twkgTP0UQkPC9cOT3sFjjjlx22j/q669HJRz+CVTlVcNxPomK7Q3Kg6dVsyv16MjGRl/fl5g==} + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} engines: {node: '>=16.0.0'} - '@rspack/plugin-react-refresh@1.0.0-beta.1': - resolution: {integrity: sha512-TLv3aB0NJtGPY38cMktnEkJ64RGLCed7MxQhc7f6V5FzOc3cZldTYSMThTZw1R/APc7GIHC4A26Ny5IogYlzvw==} + '@rspack/plugin-react-refresh@1.2.0': + resolution: {integrity: sha512-DTsbtggCfsiXE5QQtYMS8rKfEF8GIjwPDbgIT6Kg8BlAjpJY4jT5IisyhfIi7YOT3d5RIvu60iFB6Kr9sSMsnA==} peerDependencies: react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x peerDependenciesMeta: - react-refresh: + webpack-hot-middleware: optional: true '@rushstack/eslint-patch@1.10.5': @@ -2887,8 +2915,8 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -2959,12 +2987,6 @@ packages: '@types/escodegen@0.0.6': resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -3330,51 +3352,6 @@ packages: '@vitest/utils@3.0.8': resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xboxreplay/errors@0.1.0': resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} @@ -3417,12 +3394,6 @@ packages: '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} engines: {node: '>=14.15.0'} @@ -3532,24 +3503,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4038,8 +3991,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001702: - resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + caniuse-lite@1.0.30001713: + resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -4111,10 +4064,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -4326,9 +4275,6 @@ packages: core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - core-js@3.37.1: - resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} - core-js@3.41.0: resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} @@ -4350,15 +4296,6 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -4797,10 +4734,6 @@ packages: resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -5041,10 +4974,6 @@ packages: peerDependencies: eslint: '>=8.44.0' - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5092,10 +5021,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -5352,13 +5277,6 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@9.0.2: - resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 - form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -5389,10 +5307,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -5413,9 +5327,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5711,8 +5622,8 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} - html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} @@ -5778,6 +5689,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -6175,10 +6090,6 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6377,10 +6288,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -6602,8 +6509,8 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} engines: {node: '>= 4.0.0'} memoize-one@6.0.0: @@ -6719,10 +6626,6 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -6770,15 +6673,10 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8} + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00} version: 1.0.1 - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1: - resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1} - version: 1.54.0 - engines: {node: '>=22'} - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284: resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284} version: 1.57.0 @@ -6806,8 +6704,8 @@ packages: resolution: {integrity: sha512-3bxph4jfbkBh5HpeouorxzrfSLNV+i+1gugNJ2jf52HW+rt+tW7eiiFPxrJEsOVkPT/3O/dEIW7j93LRlojMkQ==} engines: {node: '>=22'} - mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448: - resolution: {tarball: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448} + mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a: + resolution: {tarball: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a} version: 4.27.0 engines: {node: '>=22'} @@ -6964,8 +6862,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07} version: 0.2.4 nice-try@1.0.5: @@ -6978,9 +6876,6 @@ packages: resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -7837,6 +7732,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -8186,14 +8085,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} - engines: {node: '>= 10.13.0'} - screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} engines: {node: '>=0.10.0'} @@ -8674,10 +8565,6 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - tar-fs@2.1.2: resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} @@ -8708,22 +8595,6 @@ packages: resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} engines: {node: '>=10'} - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} @@ -8743,6 +8614,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + three-stdlib@2.35.14: resolution: {integrity: sha512-kpCaEg59M9usFTgHC+YZNKvx7nMoLI2zQxZBV8pjoNW6vNZmGyXpaLBL09A2oLCsS3KepgMFkOuk6lRoebTNvA==} peerDependencies: @@ -8858,6 +8735,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + trim-newlines@4.1.1: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} @@ -8880,6 +8763,16 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-checker-rspack-plugin@1.1.1: + resolution: {integrity: sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@rspack/core': ^1.0.0 + typescript: '>=3.8.0' + peerDependenciesMeta: + '@rspack/core': + optional: true + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -9441,23 +9334,9 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.98.0: - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webrtc-adapter@9.0.1: resolution: {integrity: sha512-1AQO+d4ElfVSXyzNVTOewgGT/tAomwwztX/6e3totvyyzXPvXIIuUUjAmyZGbKBKbZOXauuJooZm3g6IuFuiNQ==} engines: {node: '>=6.0.0', npm: '>=3.10.0'} @@ -11371,6 +11250,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jspm/core@2.1.0': {} '@juggle/resize-observer@3.3.1': {} @@ -11399,21 +11294,30 @@ snapshots: '@types/react': 18.3.18 react: 18.3.1 - '@module-federation/runtime-tools@0.2.3': - dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/webpack-bundler-runtime': 0.2.3 + '@module-federation/error-codes@0.11.2': {} - '@module-federation/runtime@0.2.3': + '@module-federation/runtime-core@0.11.2': dependencies: - '@module-federation/sdk': 0.2.3 + '@module-federation/error-codes': 0.11.2 + '@module-federation/sdk': 0.11.2 - '@module-federation/sdk@0.2.3': {} - - '@module-federation/webpack-bundler-runtime@0.2.3': + '@module-federation/runtime-tools@0.11.2': dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/sdk': 0.2.3 + '@module-federation/runtime': 0.11.2 + '@module-federation/webpack-bundler-runtime': 0.11.2 + + '@module-federation/runtime@0.11.2': + dependencies: + '@module-federation/error-codes': 0.11.2 + '@module-federation/runtime-core': 0.11.2 + '@module-federation/sdk': 0.11.2 + + '@module-federation/sdk@0.11.2': {} + + '@module-federation/webpack-bundler-runtime@0.11.2': + dependencies: + '@module-federation/runtime': 0.11.2 + '@module-federation/sdk': 0.11.2 '@msgpack/msgpack@2.8.0': {} @@ -11469,7 +11373,7 @@ snapshots: '@nxg-org/mineflayer-util-plugin': 1.8.4 minecraft-data: 3.83.1 mineflayer: 4.27.0(encoding@0.1.13) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-item: 1.16.0 prismarine-physics: https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b vec3: 0.1.10 @@ -11974,17 +11878,17 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.34.9': optional: true - '@rsbuild/core@1.0.1-beta.9': + '@rsbuild/core@1.3.5': dependencies: - '@rspack/core': 1.0.0-beta.1(@swc/helpers@0.5.11) - '@rspack/lite-tapable': 1.0.0-beta.1 - '@swc/helpers': 0.5.11 - caniuse-lite: 1.0.30001702 - core-js: 3.37.1 - optionalDependencies: - fsevents: 2.3.3 + '@rspack/core': 1.3.3(@swc/helpers@0.5.15) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.15 + core-js: 3.41.0 + jiti: 2.4.2 + transitivePeerDependencies: + - '@rspack/tracing' - '@rsbuild/plugin-node-polyfill@1.0.3(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-node-polyfill@1.3.0(@rsbuild/core@1.3.5)': dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -12010,89 +11914,87 @@ snapshots: util: 0.12.5 vm-browserify: 1.1.2 optionalDependencies: - '@rsbuild/core': 1.0.1-beta.9 + '@rsbuild/core': 1.3.5 - '@rsbuild/plugin-react@1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-react@1.2.0(@rsbuild/core@1.3.5)': dependencies: - '@rsbuild/core': 1.0.1-beta.9 - '@rspack/plugin-react-refresh': 1.0.0-beta.1(react-refresh@0.14.2) - react-refresh: 0.14.2 + '@rsbuild/core': 1.3.5 + '@rspack/plugin-react-refresh': 1.2.0(react-refresh@0.17.0) + react-refresh: 0.17.0 + transitivePeerDependencies: + - webpack-hot-middleware - '@rsbuild/plugin-type-check@1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)(esbuild@0.19.12)(typescript@5.5.4)': + '@rsbuild/plugin-type-check@1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4)': dependencies: - '@rsbuild/core': 1.0.1-beta.9 deepmerge: 4.3.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.5.4)(webpack@5.98.0(esbuild@0.19.12)) json5: 2.2.3 reduce-configs: 1.1.0 - webpack: 5.98.0(esbuild@0.19.12) + ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) + optionalDependencies: + '@rsbuild/core': 1.3.5 transitivePeerDependencies: - - '@swc/core' - - esbuild + - '@rspack/core' - typescript - - uglify-js - - webpack-cli - '@rsbuild/plugin-typed-css-modules@1.0.1(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-typed-css-modules@1.0.2(@rsbuild/core@1.3.5)': optionalDependencies: - '@rsbuild/core': 1.0.1-beta.9 + '@rsbuild/core': 1.3.5 - '@rspack/binding-darwin-arm64@1.0.0-beta.1': + '@rspack/binding-darwin-arm64@1.3.3': optional: true - '@rspack/binding-darwin-x64@1.0.0-beta.1': + '@rspack/binding-darwin-x64@1.3.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.1': + '@rspack/binding-linux-arm64-gnu@1.3.3': optional: true - '@rspack/binding-linux-arm64-musl@1.0.0-beta.1': + '@rspack/binding-linux-arm64-musl@1.3.3': optional: true - '@rspack/binding-linux-x64-gnu@1.0.0-beta.1': + '@rspack/binding-linux-x64-gnu@1.3.3': optional: true - '@rspack/binding-linux-x64-musl@1.0.0-beta.1': + '@rspack/binding-linux-x64-musl@1.3.3': optional: true - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.1': + '@rspack/binding-win32-arm64-msvc@1.3.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.1': + '@rspack/binding-win32-ia32-msvc@1.3.3': optional: true - '@rspack/binding-win32-x64-msvc@1.0.0-beta.1': + '@rspack/binding-win32-x64-msvc@1.3.3': optional: true - '@rspack/binding@1.0.0-beta.1': + '@rspack/binding@1.3.3': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.0.0-beta.1 - '@rspack/binding-darwin-x64': 1.0.0-beta.1 - '@rspack/binding-linux-arm64-gnu': 1.0.0-beta.1 - '@rspack/binding-linux-arm64-musl': 1.0.0-beta.1 - '@rspack/binding-linux-x64-gnu': 1.0.0-beta.1 - '@rspack/binding-linux-x64-musl': 1.0.0-beta.1 - '@rspack/binding-win32-arm64-msvc': 1.0.0-beta.1 - '@rspack/binding-win32-ia32-msvc': 1.0.0-beta.1 - '@rspack/binding-win32-x64-msvc': 1.0.0-beta.1 + '@rspack/binding-darwin-arm64': 1.3.3 + '@rspack/binding-darwin-x64': 1.3.3 + '@rspack/binding-linux-arm64-gnu': 1.3.3 + '@rspack/binding-linux-arm64-musl': 1.3.3 + '@rspack/binding-linux-x64-gnu': 1.3.3 + '@rspack/binding-linux-x64-musl': 1.3.3 + '@rspack/binding-win32-arm64-msvc': 1.3.3 + '@rspack/binding-win32-ia32-msvc': 1.3.3 + '@rspack/binding-win32-x64-msvc': 1.3.3 - '@rspack/core@1.0.0-beta.1(@swc/helpers@0.5.11)': + '@rspack/core@1.3.3(@swc/helpers@0.5.15)': dependencies: - '@module-federation/runtime-tools': 0.2.3 - '@rspack/binding': 1.0.0-beta.1 - '@rspack/lite-tapable': 1.0.0-beta.1 - caniuse-lite: 1.0.30001702 + '@module-federation/runtime-tools': 0.11.2 + '@rspack/binding': 1.3.3 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001713 optionalDependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.15 - '@rspack/lite-tapable@1.0.0-beta.1': {} + '@rspack/lite-tapable@1.0.1': {} - '@rspack/plugin-react-refresh@1.0.0-beta.1(react-refresh@0.14.2)': + '@rspack/plugin-react-refresh@1.2.0(react-refresh@0.17.0)': dependencies: error-stack-parser: 2.1.4 - html-entities: 2.5.2 - optionalDependencies: - react-refresh: 0.14.2 + html-entities: 2.6.0 + react-refresh: 0.17.0 '@rushstack/eslint-patch@1.10.5': {} @@ -12681,7 +12583,7 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.12 - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -12755,16 +12657,6 @@ snapshots: '@types/escodegen@0.0.6': {} - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - '@types/estree@0.0.39': {} '@types/estree@0.0.51': {} @@ -12851,7 +12743,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 18.19.79 + '@types/node': 22.13.9 form-data: 4.0.2 '@types/node-rsa@1.1.4': @@ -13205,82 +13097,6 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - '@xboxreplay/errors@0.1.0': {} '@xboxreplay/xboxlive-auth@3.3.3(debug@4.4.0)': @@ -13331,10 +13147,6 @@ snapshots: '@xobotyi/scrollbar-width@1.9.5': {} - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20)': dependencies: esbuild: 0.18.20 @@ -13361,7 +13173,7 @@ snapshots: flatmap: 0.0.3 long: 5.3.1 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -13397,7 +13209,7 @@ snapshots: flatmap: 0.0.3 long: 5.3.1 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -13498,19 +13310,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -13987,7 +13786,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001702 + caniuse-lite: 1.0.30001713 electron-to-chromium: 1.5.113 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -14096,7 +13895,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001702: {} + caniuse-lite@1.0.30001713: {} canvas@2.11.2(encoding@0.1.13): dependencies: @@ -14219,8 +14018,6 @@ snapshots: chownr@2.0.0: {} - chrome-trace-event@1.0.4: {} - ci-info@3.9.0: {} cipher-base@1.0.6: @@ -14344,7 +14141,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compression@1.8.0: dependencies: @@ -14435,10 +14232,7 @@ snapshots: dependencies: browserslist: 4.24.4 - core-js@3.37.1: {} - - core-js@3.41.0: - optional: true + core-js@3.41.0: {} core-util-is@1.0.2: optional: true @@ -14460,15 +14254,6 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.5.4): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.5.4 - create-ecdh@4.0.4: dependencies: bn.js: 4.12.1 @@ -15043,11 +14828,6 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -15451,11 +15231,6 @@ snapshots: semver: 7.7.1 strip-indent: 3.0.0 - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -15536,8 +15311,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@1.0.1: {} @@ -15879,23 +15652,6 @@ snapshots: forever-agent@0.6.1: optional: true - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.5.4)(webpack@5.98.0(esbuild@0.19.12)): - dependencies: - '@babel/code-frame': 7.26.2 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 8.3.6(typescript@5.5.4) - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.1 - tapable: 2.2.1 - typescript: 5.5.4 - webpack: 5.98.0(esbuild@0.19.12) - form-data@2.3.3: dependencies: asynckit: 0.4.0 @@ -15924,12 +15680,6 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 @@ -15960,8 +15710,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs-monkey@1.0.6: {} - fs.realpath@1.0.0: {} fsevents@1.2.13: @@ -16315,7 +16063,7 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 - html-entities@2.5.2: {} + html-entities@2.6.0: {} html-tags@3.3.1: {} @@ -16420,6 +16168,8 @@ snapshots: ms: 2.1.3 optional: true + hyperdyperid@1.2.0: {} + hyphenate-style-name@1.1.0: {} iconv-lite@0.4.24: @@ -16803,12 +16553,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-worker@27.5.1: - dependencies: - '@types/node': 22.13.9 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jest-worker@29.7.0: dependencies: '@types/node': 22.13.9 @@ -16828,8 +16572,7 @@ snapshots: - debug optional: true - jiti@2.4.2: - optional: true + jiti@2.4.2: {} joi@17.13.3: dependencies: @@ -17077,8 +16820,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - loader-runner@4.3.0: {} - local-pkg@0.4.3: {} locate-path@3.0.0: @@ -17252,12 +16993,12 @@ snapshots: maxrects-packer: '@zardoy/maxrects-packer@2.7.4' zod: 3.24.2 - mcraft-fun-mineflayer@0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13)): + mcraft-fun-mineflayer@0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13)): dependencies: '@zardoy/flying-squid': 0.0.49(encoding@0.1.13) exit-hook: 2.2.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) - mineflayer: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) + mineflayer: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13) prismarine-item: 1.16.0 ws: 8.18.1 transitivePeerDependencies: @@ -17330,9 +17071,12 @@ snapshots: media-typer@0.3.0: {} - memfs@3.5.3: + memfs@4.17.0: dependencies: - fs-monkey: 1.0.6 + '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 memoize-one@6.0.0: {} @@ -17533,8 +17277,6 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} - mime-db@1.54.0: {} mime-types@2.1.35: @@ -17567,40 +17309,14 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8(@types/react@18.3.18)(react@18.3.1): + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1): dependencies: valtio: 1.13.2(@types/react@18.3.18)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13): - dependencies: - '@types/node-rsa': 1.1.4 - '@types/readable-stream': 4.0.18 - aes-js: 3.1.2 - buffer-equal: 1.0.1 - debug: 4.4.0(supports-color@8.1.1) - endian-toggle: 0.0.0 - lodash.get: 4.4.2 - lodash.merge: 4.6.2 - minecraft-data: 3.83.1 - minecraft-folder-path: 1.2.0 - node-fetch: 2.7.0(encoding@0.1.13) - node-rsa: 0.4.2 - prismarine-auth: 2.7.0 - prismarine-chat: 1.11.0 - prismarine-nbt: 2.7.0 - prismarine-realms: 1.3.2(encoding@0.1.13) - protodef: 1.18.0 - readable-stream: 4.7.0 - uuid-1345: 1.0.2 - yggdrasil: 1.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13): + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13): dependencies: '@types/node-rsa': 1.1.4 '@types/readable-stream': 4.0.18 @@ -17650,7 +17366,7 @@ snapshots: uuid: 9.0.1 vec3: 0.1.10 - mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=bck55yjvd4wrgz46x7o4vfur5q)(encoding@0.1.13): + mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13): dependencies: mineflayer: 4.27.0(encoding@0.1.13) sharp: 0.30.7 @@ -17689,7 +17405,7 @@ snapshots: mineflayer-pathfinder@2.4.5: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-entity: 2.5.0 prismarine-item: 1.16.0 prismarine-nbt: 2.7.0 @@ -17699,9 +17415,9 @@ snapshots: mineflayer@4.27.0(encoding@0.1.13): dependencies: minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chat: 1.11.0 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-entity: 2.5.0 @@ -17719,13 +17435,13 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13): + mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13): dependencies: '@nxg-org/mineflayer-physics-util': 1.8.6 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chat: 1.11.0 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-entity: 2.5.0 @@ -17917,7 +17633,7 @@ snapshots: neo-async@2.6.2: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07: dependencies: body-parser: 1.20.3 express: 4.21.2 @@ -17938,8 +17654,6 @@ snapshots: dependencies: semver: 7.7.1 - node-abort-controller@3.1.1: {} - node-addon-api@5.1.0: {} node-canvas-webgl@0.3.0(encoding@0.1.13): @@ -18409,7 +18123,7 @@ snapshots: pirates@4.0.6: {} - pixelarticons@1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa): {} + pixelarticons@1.8.1(patch_hash=d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325): {} pixelmatch@4.0.2: dependencies: @@ -18514,7 +18228,7 @@ snapshots: minecraft-data: 3.83.1 prismarine-registry: 1.11.0 - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0): + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9: dependencies: minecraft-data: 3.83.1 prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) @@ -18522,8 +18236,6 @@ snapshots: prismarine-item: 1.16.0 prismarine-nbt: 2.7.0 prismarine-registry: 1.11.0 - transitivePeerDependencies: - - prismarine-registry prismarine-chat@1.11.0: dependencies: @@ -18534,7 +18246,7 @@ snapshots: prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1): dependencies: prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-registry: 1.11.0 smart-buffer: 4.2.0 @@ -18568,7 +18280,7 @@ snapshots: prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.83.1): dependencies: - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-nbt: 2.7.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c @@ -18592,13 +18304,13 @@ snapshots: prismarine-registry@1.11.0: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-schematic@1.2.3: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c vec3: 0.1.10 @@ -18952,6 +18664,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): dependencies: react: 18.3.1 @@ -19402,19 +19116,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - screenfull@5.2.0: {} sdp@3.2.0: {} @@ -19654,7 +19355,7 @@ snapshots: dependencies: '@types/three': 0.156.0 skinview-utils: 0.7.1 - three: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + three: 0.154.0 slash@3.0.0: {} @@ -20090,8 +19791,6 @@ snapshots: tabbable@6.2.0: {} - tapable@2.2.1: {} - tar-fs@2.1.2: dependencies: chownr: 1.1.4 @@ -20141,17 +19840,6 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.98.0(esbuild@0.19.12)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(esbuild@0.19.12) - optionalDependencies: - esbuild: 0.19.12 - terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -20175,7 +19863,11 @@ snapshots: dependencies: any-promise: 1.3.0 - three-stdlib@2.35.14(three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e)): + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + three-stdlib@2.35.14(three@0.154.0): dependencies: '@types/draco3d': 1.4.10 '@types/offscreencanvas': 2019.7.3 @@ -20183,11 +19875,11 @@ snapshots: draco3d: 1.5.7 fflate: 0.6.10 potpack: 1.0.2 - three: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + three: 0.154.0 three.meshline@1.4.0: {} - three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e): {} + three@0.154.0: {} throttle-debounce@3.0.1: {} @@ -20285,6 +19977,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + trim-newlines@4.1.1: {} trough@2.2.0: {} @@ -20301,6 +19997,18 @@ snapshots: dependencies: typescript: 5.5.4 + ts-checker-rspack-plugin@1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4): + dependencies: + '@babel/code-frame': 7.26.2 + '@rspack/lite-tapable': 1.0.1 + chokidar: 3.6.0 + memfs: 4.17.0 + minimatch: 9.0.5 + picocolors: 1.1.1 + typescript: 5.5.4 + optionalDependencies: + '@rspack/core': 1.3.3(@swc/helpers@0.5.15) + ts-dedent@2.2.0: {} ts-easing@0.2.0: {} @@ -20858,40 +20566,8 @@ snapshots: webidl-conversions@4.0.2: {} - webpack-sources@3.2.3: {} - webpack-virtual-modules@0.6.2: {} - webpack@5.98.0(esbuild@0.19.12): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(esbuild@0.19.12)(webpack@5.98.0(esbuild@0.19.12)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webrtc-adapter@9.0.1: dependencies: sdp: 3.2.0 From 1e622d68b6d942154b932a67706dffd0969bc458 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:26:06 +0300 Subject: [PATCH 002/309] bench clean --- src/benchmark.ts | 10 +++++++++- src/utils.ts | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/benchmark.ts b/src/benchmark.ts index 9539c9b0..42603a10 100644 --- a/src/benchmark.ts +++ b/src/benchmark.ts @@ -34,6 +34,7 @@ const fixtures: Record = { Error.stackTraceLimit = Error.stackTraceLimit < 30 ? 30 : Error.stackTraceLimit +const SESSION_STORAGE_BACKUP_KEY = 'benchmark-backup' export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => { let fixtureNameOpen = appQueryParams.openBenchmark if (!fixtureNameOpen || fixtureNameOpen === '1' || fixtureNameOpen === 'true' || fixtureNameOpen === 'zip') { @@ -41,7 +42,6 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => } - const SESSION_STORAGE_BACKUP_KEY = 'benchmark-backup' if (sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)) { const backup = JSON.stringify(JSON.parse(sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)!), null, 2) setLoadingScreenStatus('Either other tab with benchmark is open or page crashed. Last data backup is downloaded. Reload page to retry.') @@ -103,6 +103,7 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => if (fixture.spawn) { fixtureName += ` - ${fixture.spawn.join(' ')}` } + fixtureName += ` - ${renderDistance}` if (process.env.NODE_ENV !== 'development') { // do not delay setLoadingScreenStatus('Benchmark requested... Getting screen refresh rate') @@ -212,6 +213,7 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => }, } }) + document.addEventListener('cypress-world-ready', () => { clearInterval(saveBackupInterval) sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) @@ -271,6 +273,12 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => }) } +// add before unload +window.addEventListener('beforeunload', () => { + // remove sessionStorage backup + sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) +}) + document.addEventListener('pointerlockchange', (e) => { const panel = document.querySelector('#benchmark-panel') if (panel) { diff --git a/src/utils.ts b/src/utils.ts index 98a4472f..0df6d6d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -103,6 +103,7 @@ export async function getScreenRefreshRate (): Promise { window.setTimeout(() => { window.cancelAnimationFrame(requestId!) requestId = null + resolve(0) }, 500) return new Promise(_resolve => { From c91824989768b2c0d21353614cf28228cea9dc13 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:38:33 +0300 Subject: [PATCH 003/309] file protocol support --- package.json | 2 +- renderer/rsbuildSharedConfig.ts | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c368eb16..32bcff3b 100644 --- a/package.json +++ b/package.json @@ -219,5 +219,5 @@ "minecraft-protocol": "patches/minecraft-protocol.patch" } }, - "packageManager": "pnpm@10.5.2+sha512.da9dc28cd3ff40d0592188235ab25d3202add8a207afbedc682220e4a0029ffbff4562102b9e6e46b4e3f9e8bd53e6d05de48544b0c57d4b0179e22c76d1199b" + "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971" } diff --git a/renderer/rsbuildSharedConfig.ts b/renderer/rsbuildSharedConfig.ts index c39c4454..57eea041 100644 --- a/renderer/rsbuildSharedConfig.ts +++ b/renderer/rsbuildSharedConfig.ts @@ -2,6 +2,7 @@ import { defineConfig, ModifyRspackConfigUtils } from '@rsbuild/core'; import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill'; import { pluginReact } from '@rsbuild/plugin-react'; import path from 'path' +import fs from 'fs' export const appAndRendererSharedConfig = () => defineConfig({ dev: { @@ -60,6 +61,12 @@ export const appAndRendererSharedConfig = () => defineConfig({ ], tools: { rspack (config, helpers) { + const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8')) + const hasFileProtocol = Object.values(packageJson.pnpm.overrides).some((dep) => (dep as string).startsWith('file:')) + if (hasFileProtocol) { + // enable node_modules watching + config.watchOptions.ignored = /\.git/ + } rspackViewerConfig(config, helpers) } }, From cdd0f6c072c32aba9677db5322eacb0942800c67 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:45:50 +0300 Subject: [PATCH 004/309] add builds --- package.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 32bcff3b..3b3fba7d 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,18 @@ "pixelarticons@1.8.1": "patches/pixelarticons@1.8.1.patch", "mineflayer-item-map-downloader@1.2.0": "patches/mineflayer-item-map-downloader@1.2.0.patch", "minecraft-protocol": "patches/minecraft-protocol.patch" - } + }, + "ignoredBuiltDependencies": [ + "canvas", + "core-js", + "gl", + "sharp" + ], + "onlyBuiltDependencies": [ + "cypress", + "esbuild", + "fsevents" + ] }, "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971" } From 425cf520bcbca181bfe301dcf080f917654f9405 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:52:50 +0300 Subject: [PATCH 005/309] strict comment check --- .github/workflows/benchmark.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 18abb9d6..f913b9b6 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -13,7 +13,7 @@ jobs: ( github.event_name == 'issue_comment' && github.event.issue.pull_request != '' && - contains(github.event.comment.body, '/benchmark') + (startsWith(github.event.comment.body, '/benchmark')) ) permissions: pull-requests: write From c755f085d935b3fad0fda7105041075305154629 Mon Sep 17 00:00:00 2001 From: Vitaly Date: Thu, 10 Apr 2025 18:53:33 +0300 Subject: [PATCH 006/309] =?UTF-8?q?fix:=20update=20rsbuild=20and=20pnpm=20?= =?UTF-8?q?to=20latest=20version=20to=20resolve=20long-standi=E2=80=A6=20(?= =?UTF-8?q?#328)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/benchmark.yml | 11 +- CONTRIBUTING.md | 4 +- Dockerfile | 6 +- package.json | 34 +- ...@1.54.0.patch => minecraft-protocol.patch} | 0 patches/three@0.154.0.patch | 16 - pnpm-lock.yaml | 958 ++++++------------ renderer/rsbuildSharedConfig.ts | 7 + src/benchmark.ts | 10 +- src/utils.ts | 1 + 10 files changed, 369 insertions(+), 678 deletions(-) rename patches/{minecraft-protocol@1.54.0.patch => minecraft-protocol.patch} (100%) delete mode 100644 patches/three@0.154.0.patch diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 70a24af9..f913b9b6 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -13,17 +13,17 @@ jobs: ( github.event_name == 'issue_comment' && github.event.issue.pull_request != '' && - contains(github.event.comment.body, '/benchmark') + (startsWith(github.event.comment.body, '/benchmark')) ) permissions: pull-requests: write steps: - run: lscpu + - name: Checkout uses: actions/checkout@v2 - # with: - # ref: refs/pull/${{ github.event.issue.number }}/head - - run: npm i -g pnpm@9.0.4 + - name: Setup pnpm + uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: node-version: 18 @@ -33,8 +33,10 @@ jobs: jq '.dependencies.cypress = .optionalDependencies.cypress | del(.optionalDependencies.cypress)' package.json > package.json.tmp mv package.json.tmp package.json - run: pnpm install --no-frozen-lockfile + - run: pnpm build - run: nohup pnpm prod-start & + - run: pnpm test:benchmark id: benchmark continue-on-error: true @@ -49,6 +51,7 @@ jobs: else echo "BENCHMARK_RESULT=Benchmark failed to run or produce results" >> $GITHUB_ENV fi + - uses: mshick/add-pr-comment@v2 with: allow-repeats: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fb0ae55e..06df61fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,8 +9,10 @@ After forking the repository, run the following commands to get started: 4. Let us know if you are working on something and be sure to open a PR if you got any changes. Happy coding! *(1): If you are getting `Cannot find matching keyid` update corepack to the latest version with `npm i -g corepack`. + *(2): If still something doesn't work ensure you have the right nodejs version with `node -v` (tested on 22.x) -*(3): For GitHub codespaces (cloud ide): Run `pnpm i @rsbuild/core@1.2.4 @rsbuild/plugin-node-polyfill@1.3.0 @rsbuild/plugin-react@1.1.0 @rsbuild/plugin-typed-css-modules@1.0.2` command to avoid crashes because of limited ram + + ## Project Structure diff --git a/Dockerfile b/Dockerfile index 34641353..cd8cfe2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,8 +4,8 @@ FROM node:18-alpine AS build RUN apk add git WORKDIR /app COPY . /app -# install pnpm -RUN npm i -g pnpm@9.0.4 +# install pnpm with corepack +RUN corepack enable # Build arguments ARG DOWNLOAD_SOUNDS=false ARG DISABLE_SERVICE_WORKER=false @@ -35,7 +35,7 @@ WORKDIR /app COPY --from=build /app/dist /app/dist COPY server.js /app/server.js # Install express -RUN npm i -g pnpm@9.0.4 +RUN npm corepack enable RUN npm init -yp RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors EXPOSE 8080 diff --git a/package.json b/package.json index 843f1ff2..3b3fba7d 100644 --- a/package.json +++ b/package.json @@ -81,13 +81,13 @@ "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "jszip": "^3.10.1", "lodash-es": "^4.17.21", + "mcraft-fun-mineflayer": "^0.1.14", "minecraft-data": "3.83.1", "minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol#master", "mineflayer-item-map-downloader": "github:zardoy/mineflayer-item-map-downloader", "mojangson": "^2.0.4", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", - "mcraft-fun-mineflayer": "^0.1.14", "peerjs": "^1.5.0", "pixelarticons": "^1.8.1", "pretty-bytes": "^6.1.1", @@ -119,11 +119,11 @@ "workbox-build": "^7.0.0" }, "devDependencies": { - "@rsbuild/core": "1.0.1-beta.9", - "@rsbuild/plugin-node-polyfill": "1.0.3", - "@rsbuild/plugin-react": "1.0.1-beta.9", - "@rsbuild/plugin-type-check": "1.0.1-beta.9", - "@rsbuild/plugin-typed-css-modules": "1.0.1", + "@rsbuild/core": "1.3.5", + "@rsbuild/plugin-node-polyfill": "1.3.0", + "@rsbuild/plugin-react": "1.2.0", + "@rsbuild/plugin-type-check": "1.2.1", + "@rsbuild/plugin-typed-css-modules": "1.0.2", "@storybook/addon-essentials": "^7.4.6", "@storybook/addon-links": "^7.4.6", "@storybook/blocks": "^7.4.6", @@ -152,16 +152,16 @@ "http-server": "^14.1.1", "https-browserify": "^1.0.0", "mc-assets": "^0.2.52", - "mineflayer-mouse": "^0.1.7", "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", "mineflayer": "github:GenerelSchwerz/mineflayer", + "mineflayer-mouse": "^0.1.7", "mineflayer-pathfinder": "^2.4.4", "npm-run-all": "^4.1.5", "os-browserify": "^0.3.0", "path-browserify": "^1.0.1", "path-exists-cli": "^2.0.0", - "renderer": "link:renderer", "process": "github:PrismarineJS/node-process", + "renderer": "link:renderer", "rimraf": "^5.0.1", "storybook": "^7.4.6", "stream-browserify": "^3.0.0", @@ -214,11 +214,21 @@ "ignoreDependencies": [] }, "patchedDependencies": { - "three@0.154.0": "patches/three@0.154.0.patch", "pixelarticons@1.8.1": "patches/pixelarticons@1.8.1.patch", "mineflayer-item-map-downloader@1.2.0": "patches/mineflayer-item-map-downloader@1.2.0.patch", - "minecraft-protocol@1.54.0": "patches/minecraft-protocol@1.54.0.patch" - } + "minecraft-protocol": "patches/minecraft-protocol.patch" + }, + "ignoredBuiltDependencies": [ + "canvas", + "core-js", + "gl", + "sharp" + ], + "onlyBuiltDependencies": [ + "cypress", + "esbuild", + "fsevents" + ] }, - "packageManager": "pnpm@9.0.4" + "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971" } diff --git a/patches/minecraft-protocol@1.54.0.patch b/patches/minecraft-protocol.patch similarity index 100% rename from patches/minecraft-protocol@1.54.0.patch rename to patches/minecraft-protocol.patch diff --git a/patches/three@0.154.0.patch b/patches/three@0.154.0.patch deleted file mode 100644 index e612415c..00000000 --- a/patches/three@0.154.0.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/examples/jsm/webxr/VRButton.js b/examples/jsm/webxr/VRButton.js -index 6856a21b17aa45d7922bbf776fd2d7e63c7a9b4e..0925b706f7629bd52f0bb5af469536af8f5fce2c 100644 ---- a/examples/jsm/webxr/VRButton.js -+++ b/examples/jsm/webxr/VRButton.js -@@ -62,7 +62,10 @@ class VRButton { - // ('local' is always available for immersive sessions and doesn't need to - // be requested separately.) - -- const sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor', 'hand-tracking', 'layers' ] }; -+ const sessionInit = { -+ optionalFeatures: ['local-floor', 'bounded-floor', 'layers'], -+ domOverlay: { root: document.body }, -+ }; - navigator.xr.requestSession( 'immersive-vr', sessionInit ).then( onSessionStarted ); - - } else { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af2069dd..c9e1e66b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,18 +21,15 @@ overrides: prismarine-item: latest patchedDependencies: - minecraft-protocol@1.54.0: - hash: dkeyukcqlupmk563gwxsmjr3yu - path: patches/minecraft-protocol@1.54.0.patch + minecraft-protocol: + hash: 3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab + path: patches/minecraft-protocol.patch mineflayer-item-map-downloader@1.2.0: - hash: bck55yjvd4wrgz46x7o4vfur5q + hash: a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad path: patches/mineflayer-item-map-downloader@1.2.0.patch pixelarticons@1.8.1: - hash: cclg2qo6d4yjs4evj64nr2mbwa + hash: d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325 path: patches/pixelarticons@1.8.1.patch - three@0.154.0: - hash: sj7ocb4p23jym6bkfgueanti2e - path: patches/three@0.154.0.patch importers: @@ -136,22 +133,22 @@ importers: version: 4.17.21 mcraft-fun-mineflayer: specifier: ^0.1.14 - version: 0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13)) + version: 0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13)) minecraft-data: specifier: 3.83.1 version: 3.83.1 minecraft-protocol: specifier: github:PrismarineJS/node-minecraft-protocol#master - version: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) + version: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mineflayer-item-map-downloader: specifier: github:zardoy/mineflayer-item-map-downloader - version: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=bck55yjvd4wrgz46x7o4vfur5q)(encoding@0.1.13) + version: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13) mojangson: specifier: ^2.0.4 version: 2.0.4 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590 + version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07 node-gzip: specifier: ^1.1.2 version: 1.1.2 @@ -160,7 +157,7 @@ importers: version: 1.5.4 pixelarticons: specifier: ^1.8.1 - version: 1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa) + version: 1.8.1(patch_hash=d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325) pretty-bytes: specifier: ^6.1.1 version: 6.1.1 @@ -242,35 +239,22 @@ importers: workbox-build: specifier: ^7.0.0 version: 7.3.0(@types/babel__core@7.20.5) - optionalDependencies: - cypress: - specifier: ^10.11.0 - version: 10.11.0 - cypress-plugin-snapshots: - specifier: ^1.4.4 - version: 1.4.4(cypress@10.11.0)(debug@4.4.0) - sharp: - specifier: ^0.33.5 - version: 0.33.5 - systeminformation: - specifier: ^5.21.22 - version: 5.25.11 devDependencies: '@rsbuild/core': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9 + specifier: 1.3.5 + version: 1.3.5 '@rsbuild/plugin-node-polyfill': - specifier: 1.0.3 - version: 1.0.3(@rsbuild/core@1.0.1-beta.9) + specifier: 1.3.0 + version: 1.3.0(@rsbuild/core@1.3.5) '@rsbuild/plugin-react': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9) + specifier: 1.2.0 + version: 1.2.0(@rsbuild/core@1.3.5) '@rsbuild/plugin-type-check': - specifier: 1.0.1-beta.9 - version: 1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)(esbuild@0.19.12)(typescript@5.5.4) + specifier: 1.2.1 + version: 1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) '@rsbuild/plugin-typed-css-modules': - specifier: 1.0.1 - version: 1.0.1(@rsbuild/core@1.0.1-beta.9) + specifier: 1.0.2 + version: 1.0.2(@rsbuild/core@1.3.5) '@storybook/addon-essentials': specifier: ^7.4.6 version: 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -357,10 +341,10 @@ importers: version: 0.2.52 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8(@types/react@18.3.18)(react@18.3.1) + version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1) mineflayer: specifier: github:GenerelSchwerz/mineflayer - version: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13) + version: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13) mineflayer-mouse: specifier: ^0.1.7 version: 0.1.7(@types/debug@4.1.12)(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) @@ -396,7 +380,7 @@ importers: version: 3.0.0 three: specifier: 0.154.0 - version: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + version: 0.154.0 timers-browserify: specifier: ^2.0.12 version: 2.0.12 @@ -409,6 +393,19 @@ importers: yaml: specifier: ^2.3.2 version: 2.7.0 + optionalDependencies: + cypress: + specifier: ^10.11.0 + version: 10.11.0 + cypress-plugin-snapshots: + specifier: ^1.4.4 + version: 1.4.4(cypress@10.11.0)(debug@4.4.0) + sharp: + specifier: ^0.33.5 + version: 0.33.5 + systeminformation: + specifier: ^5.21.22 + version: 5.25.11 renderer: dependencies: @@ -438,7 +435,7 @@ importers: version: 1.3.9 prismarine-block: specifier: github:zardoy/prismarine-block#next-era - version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chunk: specifier: github:zardoy/prismarine-chunk#master version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) @@ -459,7 +456,7 @@ importers: version: 4.8.1 three-stdlib: specifier: ^2.26.11 - version: 2.35.14(three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e)) + version: 2.35.14(three@0.154.0) three.meshline: specifier: ^1.3.0 version: 1.4.0 @@ -469,6 +466,10 @@ importers: vec3: specifier: 0.1.10 version: 0.1.10 + devDependencies: + live-server: + specifier: ^1.2.2 + version: 1.2.2 optionalDependencies: canvas: specifier: ^2.11.2 @@ -476,10 +477,6 @@ importers: node-canvas-webgl: specifier: ^0.3.0 version: 0.3.0(encoding@0.1.13) - devDependencies: - live-server: - specifier: ^1.2.2 - version: 1.2.2 renderer/viewer/sign-renderer: dependencies: @@ -1943,6 +1940,24 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.2.0': + resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jspm/core@2.1.0': resolution: {integrity: sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==} @@ -1961,17 +1976,23 @@ packages: peerDependencies: react: ^18.2.0 - '@module-federation/runtime-tools@0.2.3': - resolution: {integrity: sha512-capN8CVTCEqNAjnl102girrkevczoQfnQYyiYC4WuyKsg7+LUqfirIe1Eiyv6VSE2UgvOTZDnqvervA6rBOlmg==} + '@module-federation/error-codes@0.11.2': + resolution: {integrity: sha512-ik1Qnn0I+WyEdprTck9WGlH41vGsVdUg8cfO+ZM02qOb2cZm5Vu3SlxGAobj6g7uAj0g8yINnd7h7Dci40BxQA==} - '@module-federation/runtime@0.2.3': - resolution: {integrity: sha512-N+ZxBUb1mkmfO9XT1BwgYQgShtUTlijHbukqQ4afFka5lRAT+ayC7RKfHJLz0HbuexKPCmPBDfdmCnErR5WyTQ==} + '@module-federation/runtime-core@0.11.2': + resolution: {integrity: sha512-dia5kKybi6MFU0s5PgglJwN27k7n9Sf69Cy5xZ4BWaP0qlaXTsxHKO0PECHNt2Pt8jDdyU29sQ4DwAQfxpnXJQ==} - '@module-federation/sdk@0.2.3': - resolution: {integrity: sha512-W9zrPchLocyCBc/B8CW21akcfJXLl++9xBe1L1EtgxZGfj/xwHt0GcBWE/y+QGvYTL2a1iZjwscbftbUhxgxXg==} + '@module-federation/runtime-tools@0.11.2': + resolution: {integrity: sha512-4MJTGAxVq6vxQRkTtTlH7Mm9AVqgn0X9kdu+7RsL7T/qU+jeYsbrntN2CWG3GVVA8r5JddXyTI1iJ0VXQZLV1w==} - '@module-federation/webpack-bundler-runtime@0.2.3': - resolution: {integrity: sha512-L/jt2uJ+8dwYiyn9GxryzDR6tr/Wk8rpgvelM2EBeLIhu7YxCHSmSjQYhw3BTux9zZIr47d1K9fGjBFsVRd/SQ==} + '@module-federation/runtime@0.11.2': + resolution: {integrity: sha512-Ya9u/L6z2LvhgpqxuKCB7LcigIIRf1BbaxAZIH7mzbq/A7rZtTP7v+73E433jvgiAlbAfPSZkeoYGele6hfRwA==} + + '@module-federation/sdk@0.11.2': + resolution: {integrity: sha512-SBFe5xOamluT900J4AGBx+2/kCH/JbfqXoUwPSAC6PRzb8Y7LB0posnOGzmqYsLZXT37vp3d6AmJDsVoajDqxw==} + + '@module-federation/webpack-bundler-runtime@0.11.2': + resolution: {integrity: sha512-WdwIE6QF+MKs/PdVu0cKPETF743JB9PZ62/qf7Uo3gU4fjsUMc37RnbJZ/qB60EaHHfjwp1v6NnhZw1r4eVsnw==} '@msgpack/msgpack@2.8.0': resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} @@ -2582,104 +2603,111 @@ packages: cpu: [x64] os: [win32] - '@rsbuild/core@1.0.1-beta.9': - resolution: {integrity: sha512-F9npL47TFmNVhPBqoE6jBvKGxXEKNszBA7skhbi3opskmX7Ako9vfXvtgi2W2jQjq837/WUL8gG/ua9zRqKFEQ==} + '@rsbuild/core@1.3.5': + resolution: {integrity: sha512-Fn6nJ4YvLO2UtFcoSPxgJoiUdS0Iix7X1BsyZ+DCj3SGpVCxp3Td9x58F5uhcRraMZFPB91wvcS/OabYwT3N2w==} engines: {node: '>=16.7.0'} hasBin: true - '@rsbuild/plugin-node-polyfill@1.0.3': - resolution: {integrity: sha512-AoPIOV1pyInIz08K1ECwUjFemLLSa5OUq8sfJN1ShXrGR2qc14b1wzwZKwF4vgKnBromqfMLagVbk6KT/nLIvQ==} + '@rsbuild/plugin-node-polyfill@1.3.0': + resolution: {integrity: sha512-KvckyUg9wq3F1Iv/y4+mlcnO/E7vDklvMY7kF6CxnUYImroQVw/EDS0zDezkPvcm7aKTH5b0Jaa0iIcTNFzhVw==} peerDependencies: '@rsbuild/core': 1.x peerDependenciesMeta: '@rsbuild/core': optional: true - '@rsbuild/plugin-react@1.0.1-beta.9': - resolution: {integrity: sha512-MX5bWSEW5Nr8jhNAVxWlNVnraJxtOYTEZna5znaypLv7m4V8w0go1Nzb210ueRSbFCEYvP+zJZzkq33m+3TWXQ==} + '@rsbuild/plugin-react@1.2.0': + resolution: {integrity: sha512-TXd0cvcLPF7OrO215vlGSyRXD6Fc3KQWhFuXFKOtRYp+C1Vc9oeW0GopUIStv2pI2/xtv2XX8GOAdJsnsc6lkA==} peerDependencies: - '@rsbuild/core': ^1.0.1-beta.9 + '@rsbuild/core': 1.x - '@rsbuild/plugin-type-check@1.0.1-beta.9': - resolution: {integrity: sha512-nvH1zoxeWE1S+pg4UQ7PNsBjfa+cOYyApn+2qcmVzgTMbglfyqalPtaUSa8zRFmToooJNK3Ko//6w1zvSbOi8w==} - peerDependencies: - '@rsbuild/core': ^1.0.1-beta.9 - - '@rsbuild/plugin-typed-css-modules@1.0.1': - resolution: {integrity: sha512-biCSm7+vOgqrqXdAjxnjGNA7KPUfBadfndCeINJ2HApWfuQ2TLWuI5R+MzGvslis13SCKQ55K7NMAkvRhXyi8w==} + '@rsbuild/plugin-type-check@1.2.1': + resolution: {integrity: sha512-PtbjeMqDQy8IiPDTuaj8ZmvR42b0AsRq6RUF6wxa8dDsOzD0Dl1GcvemVGCto+/Dh8frLUmnlWF+T8riBw5rtA==} peerDependencies: '@rsbuild/core': 1.x peerDependenciesMeta: '@rsbuild/core': optional: true - '@rspack/binding-darwin-arm64@1.0.0-beta.1': - resolution: {integrity: sha512-KyC+xEMy9Y5JivO2e5rlKFGT74uwDhbwJjSCR5KOLQtZjDWeLwhf7aZhkoSQJUEsK5tAuuUoTP02RJFzK5llpA==} + '@rsbuild/plugin-typed-css-modules@1.0.2': + resolution: {integrity: sha512-QX376pBXWeBrZBvYLP2HGGrHiWA5O0SDHwRoBNto5BqYDXhi6y+Eol2Hb/cY+h2ARKZVanMfUiJRABULOJ/FCQ==} + peerDependencies: + '@rsbuild/core': 1.x || ^1.0.1-beta.0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + + '@rspack/binding-darwin-arm64@1.3.3': + resolution: {integrity: sha512-vbzEdpRCZl5+HXWsVjzSDqB9ZVIlqldV+udHp4YDD8qiwdQznVaBZke0eMzZ7kaInqRPsZ+UHQuVk6JaH/JkMQ==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.0.0-beta.1': - resolution: {integrity: sha512-Onc35+qQ7YwE6+aB66l/ZnRFXfhA1hXH5aNnNJmIFEAmqzkvOGREkWy3CdfsklF/l/xt33iUM7ccnNgdpk7yKw==} + '@rspack/binding-darwin-x64@1.3.3': + resolution: {integrity: sha512-OXtY2s4nlYtUXkeJt8TQKKNIcN7PI8yDq0nqI75OfJoS4u1ZmRXJ8IMeSALLo8I+xD2RAF79tf7yhM/Y/AaiKQ==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.1': - resolution: {integrity: sha512-NlXtRlKcoBzB6EQEiXegW0nMToEPXD+hExaev0j1+uzsFrMJ0uIY49k6+DapwWZ8A2jUdvH7xdWT+eAXD3l/EA==} + '@rspack/binding-linux-arm64-gnu@1.3.3': + resolution: {integrity: sha512-Lluq3RLYzyCMdXr/HyALKEPGsr+196x8Ccuy5AmIRosOdWuwtSiomSRH1Ka8REUFNHfYy5y9SzfmIZo/E0QEmg==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.0.0-beta.1': - resolution: {integrity: sha512-fPS8ukoPgmBSUX4dt74flObcbYzO3uaP1bk4k/98Gr3Bw0ACDZ6h5nqlxoXoeVzhNcNMBcfv45un8H3i411AyA==} + '@rspack/binding-linux-arm64-musl@1.3.3': + resolution: {integrity: sha512-PIsicXWjOqzmoOutUqxpMNkCoKo+8/wxDyKxHFeu+5WIAxVFphe2d3H5qvEjc2MasWSdRmAVn9XiuIj2LIXFzA==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.0.0-beta.1': - resolution: {integrity: sha512-9U78G7BtevPZ9GEJ2AhGHt03n+GEhKVvEZ/tgu+flFV0tYGjq75QQX345x4m+uercTqzRBTyuWITweIzppeWuQ==} + '@rspack/binding-linux-x64-gnu@1.3.3': + resolution: {integrity: sha512-BtksK73ZFdny2T/wU1x0kxBF4ruYUUArZDyeGfpO+vd/1nNYqzzdhGvOksKmtdvsO38ETr2gZ9+XZyr1vpy9uQ==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.0.0-beta.1': - resolution: {integrity: sha512-qqNPseWAOKmV33YL7tihY0N9xwY+N1G9na6lT7iqZnsrzPkIZmESI9Z24fXVJqLC/UhfxAth4RKhVBeKTsPk1w==} + '@rspack/binding-linux-x64-musl@1.3.3': + resolution: {integrity: sha512-jx86CxkTmyBz/eHDqZp1mCqBwY+UTEtaPlPoWFyGkJUR5ey6nQnxS+fhG34Rqz63chW+q/afwpGNGyALYdgc8g==} cpu: [x64] os: [linux] - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-VeBGYItHWqImYt23rBChXrk1o7fQxwTv6BEhtMpTnMJV10O6+Db9NckPEplcKLmNKAAA5anxH40GcpPc4nff8A==} + '@rspack/binding-win32-arm64-msvc@1.3.3': + resolution: {integrity: sha512-uXAdDzajFToVrH3fCNVDP/uKQ9i5FQjJc2aYxsnhS9Su/CZB+UQsOecbq6MnIN2s0B9GBKBG8QdQEtS3RtC6Hg==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-ZxLQ1zOpyCKefsKvDYGGIHM019avNPfesJKdw7wYqeC+EIvWZfs86lnhlSL5PlZzV5AfFZQyQJFRjAv4JPpe4Q==} + '@rspack/binding-win32-ia32-msvc@1.3.3': + resolution: {integrity: sha512-VBE6XsJ3IiAlozAywAIxAZ1Aqc2QVnEwBo0gP9998KkwL7wxB6Bg/OJnPbH3Q0ZaNWAQViC99rPC+5hSIdeSxw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.0.0-beta.1': - resolution: {integrity: sha512-tMrjEA/2SGMVLbh/zOQoZrr1Xx+oI6RZnkXH6l95ON4yZiD+8wM84w8Ernj1N8KwclTuvBzxM0r3DLHTNZcDhw==} + '@rspack/binding-win32-x64-msvc@1.3.3': + resolution: {integrity: sha512-rOsNz4/DFgSENjEh0t9kFn89feuXK14/9wbmmFlT8VMpYOCcj4tKcAHjWg+Nzzj4FL+NSOC/81SrUF9J+C2R7w==} cpu: [x64] os: [win32] - '@rspack/binding@1.0.0-beta.1': - resolution: {integrity: sha512-p7XBvk1+fAmvrlmdeRr5J9wdXx5idVZjHFJu/3qPHWf5mHKRw2/tQVbqzExj+B1nwR6HXFgxCiiddaWauMS/YQ==} + '@rspack/binding@1.3.3': + resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} - '@rspack/core@1.0.0-beta.1': - resolution: {integrity: sha512-aUWR/FUUw7x0L/qEZ0qrXC+7YYOL0Ezwd95TqDIDIYkSODJ6ZPt3a8poPwWc7IBdONgb8sGDPTzAXXEjcsBMwQ==} + '@rspack/core@1.3.3': + resolution: {integrity: sha512-+mXVlFcYr0tWezZfJ/gR0fj8njRc7pzEMtTFa2NO5cfsNAKPF/SXm4rb55kfa63r0b3U3N7f2nKrJG9wyG7zMQ==} engines: {node: '>=16.0.0'} peerDependencies: + '@rspack/tracing': ^1.x '@swc/helpers': '>=0.5.1' peerDependenciesMeta: + '@rspack/tracing': + optional: true '@swc/helpers': optional: true - '@rspack/lite-tapable@1.0.0-beta.1': - resolution: {integrity: sha512-r4xtbJp6QhW6A1twkgTP0UQkPC9cOT3sFjjjlx22j/q669HJRz+CVTlVcNxPomK7Q3Kg6dVsyv16MjGRl/fl5g==} + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} engines: {node: '>=16.0.0'} - '@rspack/plugin-react-refresh@1.0.0-beta.1': - resolution: {integrity: sha512-TLv3aB0NJtGPY38cMktnEkJ64RGLCed7MxQhc7f6V5FzOc3cZldTYSMThTZw1R/APc7GIHC4A26Ny5IogYlzvw==} + '@rspack/plugin-react-refresh@1.2.0': + resolution: {integrity: sha512-DTsbtggCfsiXE5QQtYMS8rKfEF8GIjwPDbgIT6Kg8BlAjpJY4jT5IisyhfIi7YOT3d5RIvu60iFB6Kr9sSMsnA==} peerDependencies: react-refresh: '>=0.10.0 <1.0.0' + webpack-hot-middleware: 2.x peerDependenciesMeta: - react-refresh: + webpack-hot-middleware: optional: true '@rushstack/eslint-patch@1.10.5': @@ -2887,8 +2915,8 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - '@swc/helpers@0.5.11': - resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -2959,12 +2987,6 @@ packages: '@types/escodegen@0.0.6': resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} @@ -3330,51 +3352,6 @@ packages: '@vitest/utils@3.0.8': resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@xboxreplay/errors@0.1.0': resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} @@ -3417,12 +3394,6 @@ packages: '@xobotyi/scrollbar-width@1.9.5': resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} engines: {node: '>=14.15.0'} @@ -3532,24 +3503,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -4038,8 +3991,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001702: - resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + caniuse-lite@1.0.30001713: + resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} canvas@2.11.2: resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} @@ -4111,10 +4064,6 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -4326,9 +4275,6 @@ packages: core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - core-js@3.37.1: - resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==} - core-js@3.41.0: resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} @@ -4350,15 +4296,6 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -4797,10 +4734,6 @@ packages: resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -5041,10 +4974,6 @@ packages: peerDependencies: eslint: '>=8.44.0' - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5092,10 +5021,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -5352,13 +5277,6 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - fork-ts-checker-webpack-plugin@9.0.2: - resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 - form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} @@ -5389,10 +5307,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -5413,9 +5327,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5711,8 +5622,8 @@ packages: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} - html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} @@ -5778,6 +5689,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -6175,10 +6090,6 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6377,10 +6288,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} @@ -6602,8 +6509,8 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} engines: {node: '>= 4.0.0'} memoize-one@6.0.0: @@ -6719,10 +6626,6 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} - engines: {node: '>= 0.6'} - mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} @@ -6770,15 +6673,10 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8} + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00} version: 1.0.1 - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1: - resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1} - version: 1.54.0 - engines: {node: '>=22'} - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284: resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284} version: 1.57.0 @@ -6806,8 +6704,8 @@ packages: resolution: {integrity: sha512-3bxph4jfbkBh5HpeouorxzrfSLNV+i+1gugNJ2jf52HW+rt+tW7eiiFPxrJEsOVkPT/3O/dEIW7j93LRlojMkQ==} engines: {node: '>=22'} - mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448: - resolution: {tarball: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448} + mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a: + resolution: {tarball: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a} version: 4.27.0 engines: {node: '>=22'} @@ -6964,8 +6862,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590} + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07: + resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07} version: 0.2.4 nice-try@1.0.5: @@ -6978,9 +6876,6 @@ packages: resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -7837,6 +7732,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -8186,14 +8085,6 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} - engines: {node: '>= 10.13.0'} - screenfull@5.2.0: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} engines: {node: '>=0.10.0'} @@ -8674,10 +8565,6 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - tar-fs@2.1.2: resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} @@ -8708,22 +8595,6 @@ packages: resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} engines: {node: '>=10'} - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - terser@5.39.0: resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} engines: {node: '>=10'} @@ -8743,6 +8614,12 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + three-stdlib@2.35.14: resolution: {integrity: sha512-kpCaEg59M9usFTgHC+YZNKvx7nMoLI2zQxZBV8pjoNW6vNZmGyXpaLBL09A2oLCsS3KepgMFkOuk6lRoebTNvA==} peerDependencies: @@ -8858,6 +8735,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + trim-newlines@4.1.1: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} @@ -8880,6 +8763,16 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-checker-rspack-plugin@1.1.1: + resolution: {integrity: sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@rspack/core': ^1.0.0 + typescript: '>=3.8.0' + peerDependenciesMeta: + '@rspack/core': + optional: true + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -9441,23 +9334,9 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.98.0: - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - webrtc-adapter@9.0.1: resolution: {integrity: sha512-1AQO+d4ElfVSXyzNVTOewgGT/tAomwwztX/6e3totvyyzXPvXIIuUUjAmyZGbKBKbZOXauuJooZm3g6IuFuiNQ==} engines: {node: '>=6.0.0', npm: '>=3.10.0'} @@ -11371,6 +11250,22 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jspm/core@2.1.0': {} '@juggle/resize-observer@3.3.1': {} @@ -11399,21 +11294,30 @@ snapshots: '@types/react': 18.3.18 react: 18.3.1 - '@module-federation/runtime-tools@0.2.3': - dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/webpack-bundler-runtime': 0.2.3 + '@module-federation/error-codes@0.11.2': {} - '@module-federation/runtime@0.2.3': + '@module-federation/runtime-core@0.11.2': dependencies: - '@module-federation/sdk': 0.2.3 + '@module-federation/error-codes': 0.11.2 + '@module-federation/sdk': 0.11.2 - '@module-federation/sdk@0.2.3': {} - - '@module-federation/webpack-bundler-runtime@0.2.3': + '@module-federation/runtime-tools@0.11.2': dependencies: - '@module-federation/runtime': 0.2.3 - '@module-federation/sdk': 0.2.3 + '@module-federation/runtime': 0.11.2 + '@module-federation/webpack-bundler-runtime': 0.11.2 + + '@module-federation/runtime@0.11.2': + dependencies: + '@module-federation/error-codes': 0.11.2 + '@module-federation/runtime-core': 0.11.2 + '@module-federation/sdk': 0.11.2 + + '@module-federation/sdk@0.11.2': {} + + '@module-federation/webpack-bundler-runtime@0.11.2': + dependencies: + '@module-federation/runtime': 0.11.2 + '@module-federation/sdk': 0.11.2 '@msgpack/msgpack@2.8.0': {} @@ -11469,7 +11373,7 @@ snapshots: '@nxg-org/mineflayer-util-plugin': 1.8.4 minecraft-data: 3.83.1 mineflayer: 4.27.0(encoding@0.1.13) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-item: 1.16.0 prismarine-physics: https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b vec3: 0.1.10 @@ -11974,17 +11878,17 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.34.9': optional: true - '@rsbuild/core@1.0.1-beta.9': + '@rsbuild/core@1.3.5': dependencies: - '@rspack/core': 1.0.0-beta.1(@swc/helpers@0.5.11) - '@rspack/lite-tapable': 1.0.0-beta.1 - '@swc/helpers': 0.5.11 - caniuse-lite: 1.0.30001702 - core-js: 3.37.1 - optionalDependencies: - fsevents: 2.3.3 + '@rspack/core': 1.3.3(@swc/helpers@0.5.15) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.15 + core-js: 3.41.0 + jiti: 2.4.2 + transitivePeerDependencies: + - '@rspack/tracing' - '@rsbuild/plugin-node-polyfill@1.0.3(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-node-polyfill@1.3.0(@rsbuild/core@1.3.5)': dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -12010,89 +11914,87 @@ snapshots: util: 0.12.5 vm-browserify: 1.1.2 optionalDependencies: - '@rsbuild/core': 1.0.1-beta.9 + '@rsbuild/core': 1.3.5 - '@rsbuild/plugin-react@1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-react@1.2.0(@rsbuild/core@1.3.5)': dependencies: - '@rsbuild/core': 1.0.1-beta.9 - '@rspack/plugin-react-refresh': 1.0.0-beta.1(react-refresh@0.14.2) - react-refresh: 0.14.2 + '@rsbuild/core': 1.3.5 + '@rspack/plugin-react-refresh': 1.2.0(react-refresh@0.17.0) + react-refresh: 0.17.0 + transitivePeerDependencies: + - webpack-hot-middleware - '@rsbuild/plugin-type-check@1.0.1-beta.9(@rsbuild/core@1.0.1-beta.9)(esbuild@0.19.12)(typescript@5.5.4)': + '@rsbuild/plugin-type-check@1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4)': dependencies: - '@rsbuild/core': 1.0.1-beta.9 deepmerge: 4.3.1 - fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.5.4)(webpack@5.98.0(esbuild@0.19.12)) json5: 2.2.3 reduce-configs: 1.1.0 - webpack: 5.98.0(esbuild@0.19.12) + ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) + optionalDependencies: + '@rsbuild/core': 1.3.5 transitivePeerDependencies: - - '@swc/core' - - esbuild + - '@rspack/core' - typescript - - uglify-js - - webpack-cli - '@rsbuild/plugin-typed-css-modules@1.0.1(@rsbuild/core@1.0.1-beta.9)': + '@rsbuild/plugin-typed-css-modules@1.0.2(@rsbuild/core@1.3.5)': optionalDependencies: - '@rsbuild/core': 1.0.1-beta.9 + '@rsbuild/core': 1.3.5 - '@rspack/binding-darwin-arm64@1.0.0-beta.1': + '@rspack/binding-darwin-arm64@1.3.3': optional: true - '@rspack/binding-darwin-x64@1.0.0-beta.1': + '@rspack/binding-darwin-x64@1.3.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.0.0-beta.1': + '@rspack/binding-linux-arm64-gnu@1.3.3': optional: true - '@rspack/binding-linux-arm64-musl@1.0.0-beta.1': + '@rspack/binding-linux-arm64-musl@1.3.3': optional: true - '@rspack/binding-linux-x64-gnu@1.0.0-beta.1': + '@rspack/binding-linux-x64-gnu@1.3.3': optional: true - '@rspack/binding-linux-x64-musl@1.0.0-beta.1': + '@rspack/binding-linux-x64-musl@1.3.3': optional: true - '@rspack/binding-win32-arm64-msvc@1.0.0-beta.1': + '@rspack/binding-win32-arm64-msvc@1.3.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.0.0-beta.1': + '@rspack/binding-win32-ia32-msvc@1.3.3': optional: true - '@rspack/binding-win32-x64-msvc@1.0.0-beta.1': + '@rspack/binding-win32-x64-msvc@1.3.3': optional: true - '@rspack/binding@1.0.0-beta.1': + '@rspack/binding@1.3.3': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.0.0-beta.1 - '@rspack/binding-darwin-x64': 1.0.0-beta.1 - '@rspack/binding-linux-arm64-gnu': 1.0.0-beta.1 - '@rspack/binding-linux-arm64-musl': 1.0.0-beta.1 - '@rspack/binding-linux-x64-gnu': 1.0.0-beta.1 - '@rspack/binding-linux-x64-musl': 1.0.0-beta.1 - '@rspack/binding-win32-arm64-msvc': 1.0.0-beta.1 - '@rspack/binding-win32-ia32-msvc': 1.0.0-beta.1 - '@rspack/binding-win32-x64-msvc': 1.0.0-beta.1 + '@rspack/binding-darwin-arm64': 1.3.3 + '@rspack/binding-darwin-x64': 1.3.3 + '@rspack/binding-linux-arm64-gnu': 1.3.3 + '@rspack/binding-linux-arm64-musl': 1.3.3 + '@rspack/binding-linux-x64-gnu': 1.3.3 + '@rspack/binding-linux-x64-musl': 1.3.3 + '@rspack/binding-win32-arm64-msvc': 1.3.3 + '@rspack/binding-win32-ia32-msvc': 1.3.3 + '@rspack/binding-win32-x64-msvc': 1.3.3 - '@rspack/core@1.0.0-beta.1(@swc/helpers@0.5.11)': + '@rspack/core@1.3.3(@swc/helpers@0.5.15)': dependencies: - '@module-federation/runtime-tools': 0.2.3 - '@rspack/binding': 1.0.0-beta.1 - '@rspack/lite-tapable': 1.0.0-beta.1 - caniuse-lite: 1.0.30001702 + '@module-federation/runtime-tools': 0.11.2 + '@rspack/binding': 1.3.3 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001713 optionalDependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.15 - '@rspack/lite-tapable@1.0.0-beta.1': {} + '@rspack/lite-tapable@1.0.1': {} - '@rspack/plugin-react-refresh@1.0.0-beta.1(react-refresh@0.14.2)': + '@rspack/plugin-react-refresh@1.2.0(react-refresh@0.17.0)': dependencies: error-stack-parser: 2.1.4 - html-entities: 2.5.2 - optionalDependencies: - react-refresh: 0.14.2 + html-entities: 2.6.0 + react-refresh: 0.17.0 '@rushstack/eslint-patch@1.10.5': {} @@ -12681,7 +12583,7 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.12 - '@swc/helpers@0.5.11': + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -12755,16 +12657,6 @@ snapshots: '@types/escodegen@0.0.6': {} - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - '@types/estree@0.0.39': {} '@types/estree@0.0.51': {} @@ -12851,7 +12743,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 18.19.79 + '@types/node': 22.13.9 form-data: 4.0.2 '@types/node-rsa@1.1.4': @@ -13205,82 +13097,6 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - '@xboxreplay/errors@0.1.0': {} '@xboxreplay/xboxlive-auth@3.3.3(debug@4.4.0)': @@ -13331,10 +13147,6 @@ snapshots: '@xobotyi/scrollbar-width@1.9.5': {} - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20)': dependencies: esbuild: 0.18.20 @@ -13361,7 +13173,7 @@ snapshots: flatmap: 0.0.3 long: 5.3.1 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -13397,7 +13209,7 @@ snapshots: flatmap: 0.0.3 long: 5.3.1 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) mkdirp: 2.1.6 node-gzip: 1.1.2 node-rsa: 1.1.1 @@ -13498,19 +13310,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -13987,7 +13786,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001702 + caniuse-lite: 1.0.30001713 electron-to-chromium: 1.5.113 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -14096,7 +13895,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001702: {} + caniuse-lite@1.0.30001713: {} canvas@2.11.2(encoding@0.1.13): dependencies: @@ -14219,8 +14018,6 @@ snapshots: chownr@2.0.0: {} - chrome-trace-event@1.0.4: {} - ci-info@3.9.0: {} cipher-base@1.0.6: @@ -14344,7 +14141,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compression@1.8.0: dependencies: @@ -14435,10 +14232,7 @@ snapshots: dependencies: browserslist: 4.24.4 - core-js@3.37.1: {} - - core-js@3.41.0: - optional: true + core-js@3.41.0: {} core-util-is@1.0.2: optional: true @@ -14460,15 +14254,6 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cosmiconfig@8.3.6(typescript@5.5.4): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.5.4 - create-ecdh@4.0.4: dependencies: bn.js: 4.12.1 @@ -15043,11 +14828,6 @@ snapshots: - supports-color - utf-8-validate - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -15451,11 +15231,6 @@ snapshots: semver: 7.7.1 strip-indent: 3.0.0 - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 @@ -15536,8 +15311,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@1.0.1: {} @@ -15879,23 +15652,6 @@ snapshots: forever-agent@0.6.1: optional: true - fork-ts-checker-webpack-plugin@9.0.2(typescript@5.5.4)(webpack@5.98.0(esbuild@0.19.12)): - dependencies: - '@babel/code-frame': 7.26.2 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 8.3.6(typescript@5.5.4) - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.1 - tapable: 2.2.1 - typescript: 5.5.4 - webpack: 5.98.0(esbuild@0.19.12) - form-data@2.3.3: dependencies: asynckit: 0.4.0 @@ -15924,12 +15680,6 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@11.1.1: dependencies: graceful-fs: 4.2.11 @@ -15960,8 +15710,6 @@ snapshots: dependencies: minipass: 3.3.6 - fs-monkey@1.0.6: {} - fs.realpath@1.0.0: {} fsevents@1.2.13: @@ -16315,7 +16063,7 @@ snapshots: dependencies: whatwg-encoding: 2.0.0 - html-entities@2.5.2: {} + html-entities@2.6.0: {} html-tags@3.3.1: {} @@ -16420,6 +16168,8 @@ snapshots: ms: 2.1.3 optional: true + hyperdyperid@1.2.0: {} + hyphenate-style-name@1.1.0: {} iconv-lite@0.4.24: @@ -16803,12 +16553,6 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-worker@27.5.1: - dependencies: - '@types/node': 22.13.9 - merge-stream: 2.0.0 - supports-color: 8.1.1 - jest-worker@29.7.0: dependencies: '@types/node': 22.13.9 @@ -16828,8 +16572,7 @@ snapshots: - debug optional: true - jiti@2.4.2: - optional: true + jiti@2.4.2: {} joi@17.13.3: dependencies: @@ -17077,8 +16820,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - loader-runner@4.3.0: {} - local-pkg@0.4.3: {} locate-path@3.0.0: @@ -17252,12 +16993,12 @@ snapshots: maxrects-packer: '@zardoy/maxrects-packer@2.7.4' zod: 3.24.2 - mcraft-fun-mineflayer@0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13)): + mcraft-fun-mineflayer@0.1.14(encoding@0.1.13)(mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13)): dependencies: '@zardoy/flying-squid': 0.0.49(encoding@0.1.13) exit-hook: 2.2.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13) - mineflayer: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) + mineflayer: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13) prismarine-item: 1.16.0 ws: 8.18.1 transitivePeerDependencies: @@ -17330,9 +17071,12 @@ snapshots: media-typer@0.3.0: {} - memfs@3.5.3: + memfs@4.17.0: dependencies: - fs-monkey: 1.0.6 + '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 memoize-one@6.0.0: {} @@ -17533,8 +17277,6 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} - mime-db@1.54.0: {} mime-types@2.1.35: @@ -17567,40 +17309,14 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/75e940a4cd50d89e0ba03db3733d5d704917a3c8(@types/react@18.3.18)(react@18.3.1): + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1): dependencies: valtio: 1.13.2(@types/react@18.3.18)(react@18.3.1) transitivePeerDependencies: - '@types/react' - react - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/3bd4dc1b2002cd7badfa5b9cf8dda35cd6cc9ac1(patch_hash=dkeyukcqlupmk563gwxsmjr3yu)(encoding@0.1.13): - dependencies: - '@types/node-rsa': 1.1.4 - '@types/readable-stream': 4.0.18 - aes-js: 3.1.2 - buffer-equal: 1.0.1 - debug: 4.4.0(supports-color@8.1.1) - endian-toggle: 0.0.0 - lodash.get: 4.4.2 - lodash.merge: 4.6.2 - minecraft-data: 3.83.1 - minecraft-folder-path: 1.2.0 - node-fetch: 2.7.0(encoding@0.1.13) - node-rsa: 0.4.2 - prismarine-auth: 2.7.0 - prismarine-chat: 1.11.0 - prismarine-nbt: 2.7.0 - prismarine-realms: 1.3.2(encoding@0.1.13) - protodef: 1.18.0 - readable-stream: 4.7.0 - uuid-1345: 1.0.2 - yggdrasil: 1.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13): + minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13): dependencies: '@types/node-rsa': 1.1.4 '@types/readable-stream': 4.0.18 @@ -17650,7 +17366,7 @@ snapshots: uuid: 9.0.1 vec3: 0.1.10 - mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=bck55yjvd4wrgz46x7o4vfur5q)(encoding@0.1.13): + mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13): dependencies: mineflayer: 4.27.0(encoding@0.1.13) sharp: 0.30.7 @@ -17689,7 +17405,7 @@ snapshots: mineflayer-pathfinder@2.4.5: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-entity: 2.5.0 prismarine-item: 1.16.0 prismarine-nbt: 2.7.0 @@ -17699,9 +17415,9 @@ snapshots: mineflayer@4.27.0(encoding@0.1.13): dependencies: minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chat: 1.11.0 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-entity: 2.5.0 @@ -17719,13 +17435,13 @@ snapshots: - encoding - supports-color - mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/fca01b0c5072dcfc296ddd6a0f6dbf54028b1448(encoding@0.1.13): + mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13): dependencies: '@nxg-org/mineflayer-physics-util': 1.8.6 minecraft-data: 3.83.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(encoding@0.1.13) + minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chat: 1.11.0 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-entity: 2.5.0 @@ -17917,7 +17633,7 @@ snapshots: neo-async@2.6.2: {} - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/624cc67c16f5e8b23b772e7eaabae16ba84b8590: + net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/92707300cce08287ed7750f4447be350fc342d07: dependencies: body-parser: 1.20.3 express: 4.21.2 @@ -17938,8 +17654,6 @@ snapshots: dependencies: semver: 7.7.1 - node-abort-controller@3.1.1: {} - node-addon-api@5.1.0: {} node-canvas-webgl@0.3.0(encoding@0.1.13): @@ -18409,7 +18123,7 @@ snapshots: pirates@4.0.6: {} - pixelarticons@1.8.1(patch_hash=cclg2qo6d4yjs4evj64nr2mbwa): {} + pixelarticons@1.8.1(patch_hash=d6a3d784047beba873565d1198bed425d9eb2de942e3fc8edac55f25473e4325): {} pixelmatch@4.0.2: dependencies: @@ -18514,7 +18228,7 @@ snapshots: minecraft-data: 3.83.1 prismarine-registry: 1.11.0 - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0): + prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9: dependencies: minecraft-data: 3.83.1 prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) @@ -18522,8 +18236,6 @@ snapshots: prismarine-item: 1.16.0 prismarine-nbt: 2.7.0 prismarine-registry: 1.11.0 - transitivePeerDependencies: - - prismarine-registry prismarine-chat@1.11.0: dependencies: @@ -18534,7 +18246,7 @@ snapshots: prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1): dependencies: prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-registry: 1.11.0 smart-buffer: 4.2.0 @@ -18568,7 +18280,7 @@ snapshots: prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.83.1): dependencies: - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/e68e9a423b5b1907535878fb636f12c28a1a9374(minecraft-data@3.83.1) prismarine-nbt: 2.7.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c @@ -18592,13 +18304,13 @@ snapshots: prismarine-registry@1.11.0: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-schematic@1.2.3: dependencies: minecraft-data: 3.83.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9(prismarine-registry@1.11.0) + prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 prismarine-nbt: 2.7.0 prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c vec3: 0.1.10 @@ -18952,6 +18664,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): dependencies: react: 18.3.1 @@ -19402,19 +19116,6 @@ snapshots: dependencies: loose-envify: 1.4.0 - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - screenfull@5.2.0: {} sdp@3.2.0: {} @@ -19654,7 +19355,7 @@ snapshots: dependencies: '@types/three': 0.156.0 skinview-utils: 0.7.1 - three: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + three: 0.154.0 slash@3.0.0: {} @@ -20090,8 +19791,6 @@ snapshots: tabbable@6.2.0: {} - tapable@2.2.1: {} - tar-fs@2.1.2: dependencies: chownr: 1.1.4 @@ -20141,17 +19840,6 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 - terser-webpack-plugin@5.3.14(esbuild@0.19.12)(webpack@5.98.0(esbuild@0.19.12)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.98.0(esbuild@0.19.12) - optionalDependencies: - esbuild: 0.19.12 - terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -20175,7 +19863,11 @@ snapshots: dependencies: any-promise: 1.3.0 - three-stdlib@2.35.14(three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e)): + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + three-stdlib@2.35.14(three@0.154.0): dependencies: '@types/draco3d': 1.4.10 '@types/offscreencanvas': 2019.7.3 @@ -20183,11 +19875,11 @@ snapshots: draco3d: 1.5.7 fflate: 0.6.10 potpack: 1.0.2 - three: 0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e) + three: 0.154.0 three.meshline@1.4.0: {} - three@0.154.0(patch_hash=sj7ocb4p23jym6bkfgueanti2e): {} + three@0.154.0: {} throttle-debounce@3.0.1: {} @@ -20285,6 +19977,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + trim-newlines@4.1.1: {} trough@2.2.0: {} @@ -20301,6 +19997,18 @@ snapshots: dependencies: typescript: 5.5.4 + ts-checker-rspack-plugin@1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4): + dependencies: + '@babel/code-frame': 7.26.2 + '@rspack/lite-tapable': 1.0.1 + chokidar: 3.6.0 + memfs: 4.17.0 + minimatch: 9.0.5 + picocolors: 1.1.1 + typescript: 5.5.4 + optionalDependencies: + '@rspack/core': 1.3.3(@swc/helpers@0.5.15) + ts-dedent@2.2.0: {} ts-easing@0.2.0: {} @@ -20858,40 +20566,8 @@ snapshots: webidl-conversions@4.0.2: {} - webpack-sources@3.2.3: {} - webpack-virtual-modules@0.6.2: {} - webpack@5.98.0(esbuild@0.19.12): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(esbuild@0.19.12)(webpack@5.98.0(esbuild@0.19.12)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webrtc-adapter@9.0.1: dependencies: sdp: 3.2.0 diff --git a/renderer/rsbuildSharedConfig.ts b/renderer/rsbuildSharedConfig.ts index c39c4454..57eea041 100644 --- a/renderer/rsbuildSharedConfig.ts +++ b/renderer/rsbuildSharedConfig.ts @@ -2,6 +2,7 @@ import { defineConfig, ModifyRspackConfigUtils } from '@rsbuild/core'; import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill'; import { pluginReact } from '@rsbuild/plugin-react'; import path from 'path' +import fs from 'fs' export const appAndRendererSharedConfig = () => defineConfig({ dev: { @@ -60,6 +61,12 @@ export const appAndRendererSharedConfig = () => defineConfig({ ], tools: { rspack (config, helpers) { + const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8')) + const hasFileProtocol = Object.values(packageJson.pnpm.overrides).some((dep) => (dep as string).startsWith('file:')) + if (hasFileProtocol) { + // enable node_modules watching + config.watchOptions.ignored = /\.git/ + } rspackViewerConfig(config, helpers) } }, diff --git a/src/benchmark.ts b/src/benchmark.ts index 9539c9b0..42603a10 100644 --- a/src/benchmark.ts +++ b/src/benchmark.ts @@ -34,6 +34,7 @@ const fixtures: Record = { Error.stackTraceLimit = Error.stackTraceLimit < 30 ? 30 : Error.stackTraceLimit +const SESSION_STORAGE_BACKUP_KEY = 'benchmark-backup' export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => { let fixtureNameOpen = appQueryParams.openBenchmark if (!fixtureNameOpen || fixtureNameOpen === '1' || fixtureNameOpen === 'true' || fixtureNameOpen === 'zip') { @@ -41,7 +42,6 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => } - const SESSION_STORAGE_BACKUP_KEY = 'benchmark-backup' if (sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)) { const backup = JSON.stringify(JSON.parse(sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)!), null, 2) setLoadingScreenStatus('Either other tab with benchmark is open or page crashed. Last data backup is downloaded. Reload page to retry.') @@ -103,6 +103,7 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => if (fixture.spawn) { fixtureName += ` - ${fixture.spawn.join(' ')}` } + fixtureName += ` - ${renderDistance}` if (process.env.NODE_ENV !== 'development') { // do not delay setLoadingScreenStatus('Benchmark requested... Getting screen refresh rate') @@ -212,6 +213,7 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => }, } }) + document.addEventListener('cypress-world-ready', () => { clearInterval(saveBackupInterval) sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) @@ -271,6 +273,12 @@ export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => }) } +// add before unload +window.addEventListener('beforeunload', () => { + // remove sessionStorage backup + sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) +}) + document.addEventListener('pointerlockchange', (e) => { const panel = document.querySelector('#benchmark-panel') if (panel) { diff --git a/src/utils.ts b/src/utils.ts index 98a4472f..0df6d6d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -103,6 +103,7 @@ export async function getScreenRefreshRate (): Promise { window.setTimeout(() => { window.cancelAnimationFrame(requestId!) requestId = null + resolve(0) }, 500) return new Promise(_resolve => { From 024da5bf6d27ba230762837794a194babff4c426 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 18:54:02 +0300 Subject: [PATCH 007/309] fix: now media dont receive global lighting by default --- renderer/viewer/three/threeJsMedia.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/renderer/viewer/three/threeJsMedia.ts b/renderer/viewer/three/threeJsMedia.ts index af95f416..b6e3bd34 100644 --- a/renderer/viewer/three/threeJsMedia.ts +++ b/renderer/viewer/three/threeJsMedia.ts @@ -16,6 +16,8 @@ interface MediaProperties { loop?: boolean volume?: number autoPlay?: boolean + + allowLighting?: boolean } export class ThreeJsMedia { @@ -212,7 +214,8 @@ export class ThreeJsMedia { const geometry = new THREE.PlaneGeometry(1, 1) // Create material with initial properties using background texture - const material = new THREE.MeshLambertMaterial({ + const MaterialClass = props.allowLighting ? THREE.MeshLambertMaterial : THREE.MeshBasicMaterial + const material = new MaterialClass({ map: backgroundTexture, transparent: true, side: props.doubleSide ? THREE.DoubleSide : THREE.FrontSide, From deb8ec6c0fdb5bf67f7fd35bc0bf4829617d5f23 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 19:25:43 +0300 Subject: [PATCH 008/309] build sharp to avoid crashes --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3b3fba7d..42f48706 100644 --- a/package.json +++ b/package.json @@ -221,10 +221,10 @@ "ignoredBuiltDependencies": [ "canvas", "core-js", - "gl", - "sharp" + "gl" ], "onlyBuiltDependencies": [ + "sharp", "cypress", "esbuild", "fsevents" From 77449c5c12d4fd5551711d2e474d43fef043b260 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 10 Apr 2025 19:33:39 +0300 Subject: [PATCH 009/309] forgot to fix what codereabbit told to fix --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cd8cfe2d..74f953cd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ WORKDIR /app COPY --from=build /app/dist /app/dist COPY server.js /app/server.js # Install express -RUN npm corepack enable +RUN corepack enable RUN npm init -yp RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors EXPOSE 8080 From 27df313f26c596d33542020601252b244fc9543d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 11 Apr 2025 18:08:21 +0300 Subject: [PATCH 010/309] microoptimisation on big number of chunks load --- renderer/viewer/lib/ui/newStats.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renderer/viewer/lib/ui/newStats.ts b/renderer/viewer/lib/ui/newStats.ts index 4a1b0a0f..7af5e897 100644 --- a/renderer/viewer/lib/ui/newStats.ts +++ b/renderer/viewer/lib/ui/newStats.ts @@ -26,7 +26,7 @@ export const addNewStat = (id: string, width = 80, x = rightOffset, y = lastY) = return { updateText (text: string) { - if (pane.innerText === text) return + if (pane.innerText === text || pane.style.display === 'none') return pane.innerText = text }, setVisibility (visible: boolean) { From 4b85b16b73316551868748eaffd97010b5fd63d7 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 11 Apr 2025 21:42:55 +0300 Subject: [PATCH 011/309] feat(experimental-part1): rework chunk loading strategy by forcing spiral order loading into renderer processor and ignoring server order --- renderer/viewer/lib/worldDataEmitter.ts | 44 +++++++++++++++++++++---- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/renderer/viewer/lib/worldDataEmitter.ts b/renderer/viewer/lib/worldDataEmitter.ts index b7c2139f..c9329d01 100644 --- a/renderer/viewer/lib/worldDataEmitter.ts +++ b/renderer/viewer/lib/worldDataEmitter.ts @@ -12,8 +12,8 @@ import { delayedIterator } from '../../playground/shared' import { playerState } from '../../../src/mineflayer/playerState' import { chunkPos } from './simpleUtils' -export type ChunkPosKey = string -type ChunkPos = { x: number, z: number } +export type ChunkPosKey = string // like '16,16' +type ChunkPos = { x: number, z: number } // like { x: 16, z: 16 } export type WorldDataEmitterEvents = { chunkPosUpdate: (data: { pos: Vec3 }) => void @@ -41,6 +41,9 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter = {} private readonly emitter: WorldDataEmitter + + waitingSpiralChunksLoad = {} as Record void> + addWaitTime = 1 /* config */ keepChunksDistance = 0 /* config */ isPlayground = false @@ -65,7 +68,7 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter TypedEmitter { - void this.loadChunk(pos) + if (this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`]) { + this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`](true) + delete this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`] + } }, chunkColumnUnload: (pos: Vec3) => { this.unloadChunk(pos) @@ -134,7 +140,9 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter { const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) - void this.loadChunk(chunkPos, true) + if (!this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`]) { + void this.loadChunk(chunkPos, true) + } }) this.emitter.on('listening', () => { @@ -188,9 +196,27 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter> - await delayedIterator(positions, this.addWaitTime, (pos) => { - promises.push(this.loadChunk(pos)) + let continueLoading = true + await delayedIterator(positions, this.addWaitTime, async (pos) => { + const promise = (async () => { + if (!continueLoading || this.loadedChunks[`${pos.x},${pos.z}`]) return + + if (!this.world.getColumnAt(pos)) { + continueLoading = await new Promise(resolve => { + this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`] = resolve + }) + } + if (!continueLoading) return + await this.loadChunk(pos) + })() + promises.push(promise) }) await Promise.all(promises) } @@ -261,6 +287,8 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter TypedEmitter { const pos = new Vec3((botX + x) * 16, 0, (botZ + z) * 16) if (!this.loadedChunks[`${pos.x},${pos.z}`]) return pos From 7e5a12934c3bd1956d9fb3d49e3c005ee418ad2d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 11 Apr 2025 21:44:08 +0300 Subject: [PATCH 012/309] fix: fix looking camera desync in local saves --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 42f48706..ce04e875 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", "filesize": "^10.0.12", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.58", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.59", "fs-extra": "^11.1.1", "google-drive-browserfs": "github:zardoy/browserfs#google-drive", "jszip": "^3.10.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9e1e66b..388994fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,8 +117,8 @@ importers: specifier: ^10.0.12 version: 10.1.6 flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.58 - version: '@zardoy/flying-squid@0.0.58(encoding@0.1.13)' + specifier: npm:@zardoy/flying-squid@^0.0.59 + version: '@zardoy/flying-squid@0.0.59(encoding@0.1.13)' fs-extra: specifier: ^11.1.1 version: 11.3.0 @@ -3413,8 +3413,8 @@ packages: engines: {node: '>=8'} hasBin: true - '@zardoy/flying-squid@0.0.58': - resolution: {integrity: sha512-qkSoaYRpVQaAvcVgZDTe0i4PxaK2l2B6i7GfRCEsyYFl3UaNQYBwwocXqLrIwhsc63bwXa0XQe8UNUubz+A4eA==} + '@zardoy/flying-squid@0.0.59': + resolution: {integrity: sha512-Ztrmv127csGovqJEWEtT19y1wGEB5tIVfneQ3+p/TirP/bTGYpLlW+Ns4sSAc4KrewUP9PW/6L0AtB69CWhQFQ==} engines: {node: '>=8'} hasBin: true @@ -13198,7 +13198,7 @@ snapshots: - encoding - supports-color - '@zardoy/flying-squid@0.0.58(encoding@0.1.13)': + '@zardoy/flying-squid@0.0.59(encoding@0.1.13)': dependencies: '@tootallnate/once': 2.0.0 chalk: 5.4.1 From 70557a62827f8dfaab1feb1948670f042d09b660 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 11 Apr 2025 21:44:40 +0300 Subject: [PATCH 013/309] fix dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 74f953cd..22bcfac6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,7 +35,7 @@ WORKDIR /app COPY --from=build /app/dist /app/dist COPY server.js /app/server.js # Install express -RUN corepack enable +RUN npm i -g pnpm@10.8.0 RUN npm init -yp RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors EXPOSE 8080 From 83502eba609ab7157c7496727b1cae768c2733fb Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 12 Apr 2025 03:10:29 +0300 Subject: [PATCH 014/309] fix(important): Formatted text display: fix reading extra when its text which might happen in kick messages or server info --- src/chatUtils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/chatUtils.ts b/src/chatUtils.ts index 5143c10f..ade800ac 100644 --- a/src/chatUtils.ts +++ b/src/chatUtils.ts @@ -89,7 +89,10 @@ export const formatMessage = (message: MessageInput, mcData: IndexedData = globa } if (msg.extra) { - for (const ex of msg.extra) { + for (let ex of msg.extra) { + if (typeof ex === 'string') { + ex = { text: ex } + } readMsg({ ...styles, ...ex }) } } From 7a53d4de63d6e8c44ee17ae2fdde8d077490f375 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 14 Apr 2025 17:06:13 +0300 Subject: [PATCH 015/309] fix(feedback-controls): prevent default action for side mouse buttons to avoid page leave annoying modal on accidental clicks --- src/controls.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/controls.ts b/src/controls.ts index 0633ea8e..c8ff2279 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -761,6 +761,11 @@ const selectItem = async () => { } addEventListener('mousedown', async (e) => { + // always prevent default for side buttons (back / forward navigation) + if (e.button === 3 || e.button === 4) { + e.preventDefault() + } + if ((e.target as HTMLElement).matches?.('#VRButton')) return if (!isInRealGameSession() && !(e.target as HTMLElement).id.includes('ui-root')) return void pointerLock.requestPointerLock() From c5e8fcb90c8ca23b77ea9704c6ee9b91676d72bc Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 14 Apr 2025 17:21:22 +0300 Subject: [PATCH 016/309] feat: add controls debug interface! Debug happening actions in your game & keyboard buttons!!!! --- src/controls.ts | 1 + src/optionsGuiScheme.tsx | 5 +++ src/optionsStorage.ts | 1 + src/react/ControDebug.tsx | 71 +++++++++++++++++++++++++++++++++++++++ src/reactUi.tsx | 2 ++ 5 files changed, 80 insertions(+) create mode 100644 src/react/ControDebug.tsx diff --git a/src/controls.ts b/src/controls.ts index c8ff2279..0716d68d 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -177,6 +177,7 @@ contro.on('movementUpdate', ({ vector, soleVector, gamepadIndex }) => { if (action) { void contro.emit('trigger', { command: 'general.forward' } as any) } else { + void contro.emit('release', { command: 'general.forward' } as any) setSprinting(false) } } diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index ef8d9a8e..55d107ce 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -569,6 +569,11 @@ export const guiOptionsScheme: { ], }, }, + { + debugContro: { + text: 'Debug Controls', + }, + } ], 'export-import': [ { diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 4d76ba0c..a69d4e16 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -66,6 +66,7 @@ const defaultOptions = { jeiEnabled: true as boolean | Array<'creative' | 'survival' | 'adventure' | 'spectator'>, preventBackgroundTimeoutKick: false, preventSleep: false, + debugContro: false, // antiAliasing: false, diff --git a/src/react/ControDebug.tsx b/src/react/ControDebug.tsx new file mode 100644 index 00000000..9c5f272c --- /dev/null +++ b/src/react/ControDebug.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react' +import { options } from '../optionsStorage' +import { contro } from '../controls' + +export default () => { + const [pressedKeys, setPressedKeys] = useState>(new Set()) + const [actions, setActions] = useState([]) + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + setPressedKeys(prev => new Set([...prev, e.code])) + } + + const handleKeyUp = (e: KeyboardEvent) => { + setPressedKeys(prev => { + const newSet = new Set(prev) + newSet.delete(e.code) + return newSet + }) + } + + const handleBlur = () => { + setPressedKeys(new Set()) + } + + const handleControTrigger = ({ command }) => { + setActions(prev => [...prev, command]) + } + + const handleControReleased = ({ command }) => { + setActions(prev => prev.filter(action => action !== command)) + } + + window.addEventListener('keydown', handleKeyDown) + window.addEventListener('keyup', handleKeyUp) + window.addEventListener('blur', handleBlur) + + contro.on('trigger', handleControTrigger) + contro.on('release', handleControReleased) + + return () => { + window.removeEventListener('keydown', handleKeyDown) + window.removeEventListener('keyup', handleKeyUp) + window.removeEventListener('blur', handleBlur) + contro.off('trigger', handleControTrigger) + contro.off('released', handleControReleased) + } + }, []) + + if (!options.debugContro) return null + + return ( +
+
Keys: {[...pressedKeys].join(', ')}
+
Actions: {actions.join(', ')}
+
+ ) +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 15c09939..bbfbc2ee 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -54,6 +54,7 @@ import { useAppScale } from './scaleInterface' import PacketsReplayProvider from './react/PacketsReplayProvider' import TouchInteractionHint from './react/TouchInteractionHint' import { ua } from './react/utils' +import ControDebug from './react/ControDebug' const isFirefox = ua.getBrowser().name === 'Firefox' if (isFirefox) { @@ -208,6 +209,7 @@ const App = () => { +
From a541e82e04ccd7aece66417b58bfbe92afbfa5a7 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 15 Apr 2025 02:29:09 +0300 Subject: [PATCH 017/309] fix: add freezeSettings param --- src/appParams.ts | 1 + src/optionsStorage.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/appParams.ts b/src/appParams.ts index 994a5e16..4112a99c 100644 --- a/src/appParams.ts +++ b/src/appParams.ts @@ -42,6 +42,7 @@ export type AppQsParams = { suggest_save?: string noPacketsValidation?: string testCrashApp?: string + freezeSettings?: string // Replay params replayFilter?: string diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index a69d4e16..c8e6298e 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -1,7 +1,7 @@ import { proxy, subscribe } from 'valtio/vanilla' import { subscribeKey } from 'valtio/utils' import { omitObj } from '@zardoy/utils' -import { appQueryParamsArray } from './appParams' +import { appQueryParams, appQueryParamsArray } from './appParams' import type { AppConfig } from './appConfig' import { appStorage } from './react/appStorageProvider' @@ -236,6 +236,7 @@ Object.defineProperty(window, 'debugChangedOptions', { }) subscribe(options, (ops) => { + if (appQueryParams.freezeSettings === 'true') return for (const op of ops) { const [type, path, value] = op // let patch From 6a8de1fdfb78f8ce9c89d4e5e07e8800cdd152b3 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 16 Apr 2025 03:22:25 +0300 Subject: [PATCH 018/309] fix: sometimes auto login suggestion was not visible due to overlapping notification issue --- src/react/ChatProvider.tsx | 3 ++- src/utils.ts | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/react/ChatProvider.tsx b/src/react/ChatProvider.tsx index 0b913875..4376006d 100644 --- a/src/react/ChatProvider.tsx +++ b/src/react/ChatProvider.tsx @@ -7,7 +7,7 @@ import { options } from '../optionsStorage' import { viewerVersionState } from '../viewerConnector' import Chat, { Message, fadeMessage } from './Chat' import { useIsModalActive } from './utilsApp' -import { hideNotification, showNotification } from './NotificationProvider' +import { hideNotification, notificationProxy, showNotification } from './NotificationProvider' import { updateLoadedServerData } from './serversStorage' import { lastConnectOptions } from './AppStatusProvider' @@ -65,6 +65,7 @@ export default () => { }) hideNotification() }) + notificationProxy.id = 'auto-login' const listener = () => { hideNotification() } diff --git a/src/utils.ts b/src/utils.ts index 0df6d6d2..93e2eb7b 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -39,6 +39,7 @@ export const pointerLock = { void goFullscreen() } const displayBrowserProblem = () => { + if (notificationProxy.id === 'auto-login') return // prevent notification hide showNotification('Browser Delay Limitation', navigator['keyboard'] ? 'Click on screen, enable Auto Fullscreen or F11' : 'Click on screen or use fullscreen in Chrome') notificationProxy.id = 'pointerlockchange' } From f5ed17d2fbcce45fb6683872f561597dd8467c35 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 16 Apr 2025 03:23:41 +0300 Subject: [PATCH 019/309] fix(critical-regression): FIX broken inventory! There was a huge regression with a month-old inventory update which was breaking it in some ways --- pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 388994fe..f3059dac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -341,7 +341,7 @@ importers: version: 0.2.52 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next - version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1) + version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/98bc5bb8ee6da8b4b771c05b404cee796318ccd4(@types/react@18.3.18)(react@18.3.1) mineflayer: specifier: github:GenerelSchwerz/mineflayer version: https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13) @@ -6673,8 +6673,8 @@ packages: minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00} + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/98bc5bb8ee6da8b4b771c05b404cee796318ccd4: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/98bc5bb8ee6da8b4b771c05b404cee796318ccd4} version: 1.0.1 minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284: @@ -17309,7 +17309,7 @@ snapshots: minecraft-folder-path@1.2.0: {} - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/f57dd78ca8e3b7cdd724d4272d8cbf6743b0cf00(@types/react@18.3.18)(react@18.3.1): + minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/98bc5bb8ee6da8b4b771c05b404cee796318ccd4(@types/react@18.3.18)(react@18.3.1): dependencies: valtio: 1.13.2(@types/react@18.3.18)(react@18.3.1) transitivePeerDependencies: From 143d4a3bb3d7b18ac9ceb36eb0dc5a3336d65e26 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 16 Apr 2025 14:34:51 +0300 Subject: [PATCH 020/309] fix: fix double chests. fix inventory crashing when it doesnt know the texture to render --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/inventoryWindows.ts | 6 +++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ce04e875..ee07230d 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "http-browserify": "^1.7.0", "http-server": "^14.1.1", "https-browserify": "^1.0.0", - "mc-assets": "^0.2.52", + "mc-assets": "^0.2.53", "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", "mineflayer": "github:GenerelSchwerz/mineflayer", "mineflayer-mouse": "^0.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3059dac..d7b1da61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -337,8 +337,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 mc-assets: - specifier: ^0.2.52 - version: 0.2.52 + specifier: ^0.2.53 + version: 0.2.53 minecraft-inventory-gui: specifier: github:zardoy/minecraft-inventory-gui#next version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/98bc5bb8ee6da8b4b771c05b404cee796318ccd4(@types/react@18.3.18)(react@18.3.1) @@ -6455,8 +6455,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mc-assets@0.2.52: - resolution: {integrity: sha512-6mUI63fcUIjB0Ghjls7bLMnse2XUgvhPajsFkRQf10PcXYbfS/OAnX51X8sNx2pzfoHSlA81U7v+v906YwoAUw==} + mc-assets@0.2.53: + resolution: {integrity: sha512-Ucsu2pDLr/cs8bxbxU9KTszdf/vPTLphYgEHUEWxuYlMkPQUCpsQwkn3YgyykJ7RXaca7zZGlZXaTPXBAqJT6A==} engines: {node: '>=18.0.0'} mcraft-fun-mineflayer@0.1.14: @@ -16988,7 +16988,7 @@ snapshots: math-intrinsics@1.1.0: {} - mc-assets@0.2.52: + mc-assets@0.2.53: dependencies: maxrects-packer: '@zardoy/maxrects-packer@2.7.4' zod: 3.24.2 diff --git a/src/inventoryWindows.ts b/src/inventoryWindows.ts index 40b0e4d7..2906177b 100644 --- a/src/inventoryWindows.ts +++ b/src/inventoryWindows.ts @@ -216,6 +216,8 @@ export const renderSlot = (model: ResolvedItemModelRender, debugIsQuickbar = fal } } + const blockToTopTexture = (r) => r.top ?? r + try { assertDefined(appViewer.resourcesManager.currentResources?.itemsRenderer) itemTexture = @@ -224,9 +226,11 @@ export const renderSlot = (model: ResolvedItemModelRender, debugIsQuickbar = fal ?? appViewer.resourcesManager.currentResources.itemsRenderer.getItemTexture('item/missing_texture')! } catch (err) { inGameError(`Failed to render item ${itemModelName} (original: ${originalItemName}) on ${bot.version} (resourcepack: ${options.enabledResourcepack}): ${err.stack}`) - itemTexture = appViewer.resourcesManager.currentResources!.itemsRenderer.getItemTexture('block/errored')! + itemTexture = blockToTopTexture(appViewer.resourcesManager.currentResources!.itemsRenderer.getItemTexture('errored')!) } + itemTexture ??= blockToTopTexture(appViewer.resourcesManager.currentResources!.itemsRenderer.getItemTexture('unknown')!) + if ('type' in itemTexture) { // is item From 73ccb48d02eeaa2962ac43d07bcd3227edd6a94d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Wed, 16 Apr 2025 18:24:19 +0300 Subject: [PATCH 021/309] feat: Add F3+H chunks debug screen! not really useful for now since chunks not visible bug was not fixed yet --- renderer/viewer/lib/worldDataEmitter.ts | 8 +- src/controls.ts | 7 ++ src/react/ChunksDebug.tsx | 130 ++++++++++++++++++++++++ src/react/ChunksDebugScreen.tsx | 100 ++++++++++++++++++ src/react/DebugOverlay.tsx | 1 + src/reactUi.tsx | 3 + 6 files changed, 246 insertions(+), 3 deletions(-) create mode 100644 src/react/ChunksDebug.tsx create mode 100644 src/react/ChunksDebugScreen.tsx diff --git a/renderer/viewer/lib/worldDataEmitter.ts b/renderer/viewer/lib/worldDataEmitter.ts index c9329d01..5e28c007 100644 --- a/renderer/viewer/lib/worldDataEmitter.ts +++ b/renderer/viewer/lib/worldDataEmitter.ts @@ -37,8 +37,8 @@ export type WorldDataEmitterEvents = { * It's up to the consumer to serialize the data if needed */ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter) { - private loadedChunks: Record - private readonly lastPos: Vec3 + loadedChunks: Record + readonly lastPos: Vec3 private eventListeners: Record = {} private readonly emitter: WorldDataEmitter @@ -140,7 +140,7 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter { const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) - if (!this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`]) { + if (!this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`] && this.loadedChunks[`${chunkX},${chunkZ}`]) { void this.loadChunk(chunkPos, true) } }) @@ -242,6 +242,8 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter = { + 'server-waiting': 'gray', + 'order-queued': 'darkorange', + 'client-waiting': 'yellow', + 'client-processing': 'yellow', + 'done-empty': 'darkgreen', + 'done': 'limegreen', +} + +export default ({ + chunks, + playerChunk, + maxDistance, + tileSize = 16, + fontSize = 5, +}: { + chunks: ChunkDebug[] + playerChunk: { x: number, z: number } + maxDistance: number, + tileSize?: number + fontSize?: number +}) => { + const [selectedChunk, setSelectedChunk] = useState(null) + const [showSidebar, setShowSidebar] = useState(false) + + // Calculate grid dimensions based on maxDistance + const gridSize = maxDistance * 2 + 1 + const centerIndex = maxDistance + + // Process chunks to get only the last one for each position and within maxDistance + const processedChunks = chunks.reduce>((acc, chunk) => { + const relX = Math.floor((chunk.x - playerChunk.x) / 16) + const relZ = Math.floor((chunk.z - playerChunk.z) / 16) + + // Skip chunks outside maxDistance + if (Math.abs(relX) > maxDistance || Math.abs(relZ) > maxDistance) return acc + + const key = `${chunk.x},${chunk.z}` + acc[key] = { + ...chunk, + relX, + relZ, + displayLines: [`${relX},${relZ} (${chunk.x},${chunk.z})`, ...chunk.lines] + } + return acc + }, {}) + + return ( +
+
+ {Array.from({ length: gridSize * gridSize }).map((_, i) => { + const relX = -maxDistance + (i % gridSize) + const relZ = -maxDistance + Math.floor(i / gridSize) + const x = playerChunk.x + relX * 16 + const z = playerChunk.z + relZ * 16 + const chunk = processedChunks[`${x},${z}`] + + return ( +
{ + if (chunk) { + setSelectedChunk(chunk) + setShowSidebar(true) + } + }} + style={{ + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + background: chunk ? stateColors[chunk.state] : 'black', + color: 'white', + fontSize: `${fontSize}px`, + cursor: chunk ? 'pointer' : 'default', + position: 'relative', + width: `${tileSize}px`, + height: `${tileSize}px`, + // pre-wrap + whiteSpace: 'pre', + }} + > + {relX}, {relZ}{'\n'} + {chunk?.lines.join('\n')} +
+ ) + })} +
+ + {showSidebar && selectedChunk && ( +
+ {selectedChunk.displayLines.map((line, i) => ( +
+ {line} +
+ ))} +
+
Sidebar Info:
+ {selectedChunk.sidebarLines.map((line, i) => ( +
{line}
+ ))} +
+
+ )} +
+ ) +} diff --git a/src/react/ChunksDebugScreen.tsx b/src/react/ChunksDebugScreen.tsx new file mode 100644 index 00000000..c65eee16 --- /dev/null +++ b/src/react/ChunksDebugScreen.tsx @@ -0,0 +1,100 @@ +import { useEffect, useState } from 'react' +import { useUtilsEffect } from '@zardoy/react-util' +import { WorldRendererCommon } from 'renderer/viewer/lib/worldrendererCommon' +import { WorldRendererThree } from 'renderer/viewer/three/worldrendererThree' +import Screen from './Screen' +import ChunksDebug, { ChunkDebug } from './ChunksDebug' +import { useIsModalActive } from './utilsApp' + +const Inner = () => { + const [playerX, setPlayerX] = useState(Math.floor(worldView!.lastPos.x / 16) * 16) + const [playerZ, setPlayerZ] = useState(Math.floor(worldView!.lastPos.z / 16) * 16) + const [update, setUpdate] = useState(0) + + useUtilsEffect(({ interval }) => { + interval( + 500, + () => { + setPlayerX(Math.floor(worldView!.lastPos.x / 16) * 16) + setPlayerZ(Math.floor(worldView!.lastPos.z / 16) * 16) + setUpdate(u => u + 1) + } + ) + }, []) + + const chunksWaitingServer = Object.keys(worldView!.waitingSpiralChunksLoad).map((x): ChunkDebug => ({ + x: Number(x.split(',')[0]), + z: Number(x.split(',')[1]), + state: 'server-waiting', + lines: [], + sidebarLines: [], + })) + + const world = globalThis.world as WorldRendererThree + + const loadedSectionsChunks = Object.fromEntries(Object.keys(world.sectionObjects).map(sectionPos => { + const [x, y, z] = sectionPos.split(',').map(Number) + return [`${x},${z}`, true] + })) + + const chunksWaitingClient = Object.keys(worldView!.loadedChunks).map((x): ChunkDebug => ({ + x: Number(x.split(',')[0]), + z: Number(x.split(',')[1]), + state: 'client-waiting', + lines: [], + sidebarLines: [], + })) + + const clientProcessingChunks = Object.keys(world.loadedChunks).map((x): ChunkDebug => ({ + x: Number(x.split(',')[0]), + z: Number(x.split(',')[1]), + state: 'client-processing', + lines: [], + sidebarLines: [], + })) + + const chunksDoneEmpty = Object.keys(world.finishedChunks) + .filter(chunkPos => !loadedSectionsChunks[chunkPos]) + .map((x): ChunkDebug => ({ + x: Number(x.split(',')[0]), + z: Number(x.split(',')[1]), + state: 'done-empty', + lines: [], + sidebarLines: [], + })) + + const chunksDone = Object.keys(world.finishedChunks).map((x): ChunkDebug => ({ + x: Number(x.split(',')[0]), + z: Number(x.split(',')[1]), + state: 'done', + lines: [], + sidebarLines: [], + })) + + const allChunks = [ + ...chunksWaitingServer, + ...chunksWaitingClient, + ...clientProcessingChunks, + ...chunksDone, + ...chunksDoneEmpty, + ] + return + + +} + +export default () => { + const isActive = useIsModalActive('chunks-debug') + if (!isActive) return null + + return +} diff --git a/src/react/DebugOverlay.tsx b/src/react/DebugOverlay.tsx index af0d6675..610bcea9 100644 --- a/src/react/DebugOverlay.tsx +++ b/src/react/DebugOverlay.tsx @@ -180,6 +180,7 @@ export default () => {

XYZ: {pos.x.toFixed(3)} / {pos.y.toFixed(3)} / {pos.z.toFixed(3)}

Chunk: {Math.floor(pos.x % 16)} ~ {Math.floor(pos.z % 16)} in {Math.floor(pos.x / 16)} ~ {Math.floor(pos.z / 16)}

+

Section: {Math.floor(pos.x / 16) * 16}, {Math.floor(pos.y / 16) * 16}, {Math.floor(pos.z / 16) * 16}

Packets: {packetsString}

Client TPS: {clientTps}

Facing (viewer): {bot.entity.yaw.toFixed(3)} {bot.entity.pitch.toFixed(3)}

diff --git a/src/reactUi.tsx b/src/reactUi.tsx index bbfbc2ee..93db7706 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -55,6 +55,8 @@ import PacketsReplayProvider from './react/PacketsReplayProvider' import TouchInteractionHint from './react/TouchInteractionHint' import { ua } from './react/utils' import ControDebug from './react/ControDebug' +import ChunksDebug from './react/ChunksDebug' +import ChunksDebugScreen from './react/ChunksDebugScreen' const isFirefox = ua.getBrowser().name === 'Firefox' if (isFirefox) { @@ -157,6 +159,7 @@ const InGameUi = () => { {!disabledUiParts.includes('crosshair') && } {!disabledUiParts.includes('books') && } {!disabledUiParts.includes('bossbars') && displayBossBars && } +
From e8b1f190a7d50c0ebe42b1b973a6887076ff1f46 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 17 Apr 2025 19:58:03 +0300 Subject: [PATCH 022/309] add more debug into to f3+h --- src/react/ChunksDebug.tsx | 4 +-- src/react/ChunksDebugScreen.tsx | 54 ++++++++++++--------------------- 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/react/ChunksDebug.tsx b/src/react/ChunksDebug.tsx index d3eb52a7..7b42cf4d 100644 --- a/src/react/ChunksDebug.tsx +++ b/src/react/ChunksDebug.tsx @@ -111,13 +111,13 @@ export default ({
{showSidebar && selectedChunk && ( -
+
{selectedChunk.displayLines.map((line, i) => (
{line}
))} -
+
Sidebar Info:
{selectedChunk.sidebarLines.map((line, i) => (
{line}
diff --git a/src/react/ChunksDebugScreen.tsx b/src/react/ChunksDebugScreen.tsx index c65eee16..80e926d8 100644 --- a/src/react/ChunksDebugScreen.tsx +++ b/src/react/ChunksDebugScreen.tsx @@ -22,13 +22,21 @@ const Inner = () => { ) }, []) - const chunksWaitingServer = Object.keys(worldView!.waitingSpiralChunksLoad).map((x): ChunkDebug => ({ - x: Number(x.split(',')[0]), - z: Number(x.split(',')[1]), - state: 'server-waiting', - lines: [], - sidebarLines: [], - })) + const mapChunk = (key: string, state: ChunkDebug['state']): ChunkDebug => { + const chunk = worldView!.debugChunksInfo[key] + return { + x: Number(key.split(',')[0]), + z: Number(key.split(',')[1]), + state, + lines: [String(chunk?.loads.length ?? 0)], + sidebarLines: [ + `loads: ${chunk.loads.map(l => `${l.reason} ${l.dataLength} ${l.time}`).join('\n')}`, + // `blockUpdates: ${chunk.blockUpdates}`, + ], + } + } + + const chunksWaitingServer = Object.keys(worldView!.waitingSpiralChunksLoad).map(key => mapChunk(key, 'server-waiting')) const world = globalThis.world as WorldRendererThree @@ -37,39 +45,15 @@ const Inner = () => { return [`${x},${z}`, true] })) - const chunksWaitingClient = Object.keys(worldView!.loadedChunks).map((x): ChunkDebug => ({ - x: Number(x.split(',')[0]), - z: Number(x.split(',')[1]), - state: 'client-waiting', - lines: [], - sidebarLines: [], - })) + const chunksWaitingClient = Object.keys(worldView!.loadedChunks).map(key => mapChunk(key, 'client-waiting')) - const clientProcessingChunks = Object.keys(world.loadedChunks).map((x): ChunkDebug => ({ - x: Number(x.split(',')[0]), - z: Number(x.split(',')[1]), - state: 'client-processing', - lines: [], - sidebarLines: [], - })) + const clientProcessingChunks = Object.keys(world.loadedChunks).map(key => mapChunk(key, 'client-processing')) const chunksDoneEmpty = Object.keys(world.finishedChunks) .filter(chunkPos => !loadedSectionsChunks[chunkPos]) - .map((x): ChunkDebug => ({ - x: Number(x.split(',')[0]), - z: Number(x.split(',')[1]), - state: 'done-empty', - lines: [], - sidebarLines: [], - })) + .map(key => mapChunk(key, 'done-empty')) - const chunksDone = Object.keys(world.finishedChunks).map((x): ChunkDebug => ({ - x: Number(x.split(',')[0]), - z: Number(x.split(',')[1]), - state: 'done', - lines: [], - sidebarLines: [], - })) + const chunksDone = Object.keys(world.finishedChunks).map(key => mapChunk(key, 'done')) const allChunks = [ ...chunksWaitingServer, From 1582e16d3b72ee9d35f6af98fb6938f89b99e28f Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Thu, 17 Apr 2025 19:58:30 +0300 Subject: [PATCH 023/309] fix critical regression that led to not loading chunks twice that was a valid behavior before --- renderer/viewer/lib/worldDataEmitter.ts | 36 +++++++++++++++++++------ 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/renderer/viewer/lib/worldDataEmitter.ts b/renderer/viewer/lib/worldDataEmitter.ts index 5e28c007..7dc49ac3 100644 --- a/renderer/viewer/lib/worldDataEmitter.ts +++ b/renderer/viewer/lib/worldDataEmitter.ts @@ -41,6 +41,14 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter = {} private readonly emitter: WorldDataEmitter + debugChunksInfo: Record + // blockUpdates: number + }> = {} waitingSpiralChunksLoad = {} as Record void> @@ -66,12 +74,12 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter | void if (val) throw new Error('setBlockStateId returned promise (not supported)') - const chunkX = Math.floor(position.x / 16) - const chunkZ = Math.floor(position.z / 16) - if (!this.loadedChunks[`${chunkX},${chunkZ}`] && !this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`]) { - void this.loadChunk({ x: chunkX, z: chunkZ }) - return - } + // const chunkX = Math.floor(position.x / 16) + // const chunkZ = Math.floor(position.z / 16) + // if (!this.loadedChunks[`${chunkX},${chunkZ}`] && !this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`]) { + // void this.loadChunk({ x: chunkX, z: chunkZ }) + // return + // } this.emit('blockUpdate', { pos: position, stateId }) } @@ -117,6 +125,8 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter { @@ -141,7 +151,7 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter { const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) if (!this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`] && this.loadedChunks[`${chunkX},${chunkZ}`]) { - void this.loadChunk(chunkPos, true) + void this.loadChunk(chunkPos, true, 'update_light') } }) @@ -240,7 +250,7 @@ export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter TypedEmitter TypedEmitter Date: Thu, 17 Apr 2025 20:51:06 +0300 Subject: [PATCH 024/309] sync for changes between forks fix: sometimes autlogin save prompt is not displayed fix: add connect server only ui add some other components for future usage fix: make some fields custommization in main menu from config.json fix: adjust logic on player disconnect in some rare cases --- config.json | 2 + src/appConfig.ts | 2 + src/appParams.ts | 2 + src/cameraRotationControls.ts | 5 +- src/controls.ts | 21 ++++++-- src/core/progressReporter.ts | 5 +- src/customChannels.ts | 4 -- src/globalState.ts | 14 ++++-- src/index.ts | 34 +++++++++++-- src/react/Chat.tsx | 6 +-- src/react/ConnectOnlyServerUi.tsx | 80 ++++++++++++++++++++++++++++++ src/react/MainMenu.tsx | 8 ++- src/react/NotificationProvider.tsx | 14 ++++-- src/react/VoiceMicrophone.tsx | 77 ++++++++++++++++++++++++++++ src/reactUi.tsx | 4 ++ src/screens.css | 1 + src/shims/patchShims.ts | 2 + 17 files changed, 246 insertions(+), 35 deletions(-) create mode 100644 src/react/ConnectOnlyServerUi.tsx create mode 100644 src/react/VoiceMicrophone.tsx diff --git a/config.json b/config.json index 2ede8070..ea27ca5a 100644 --- a/config.json +++ b/config.json @@ -25,6 +25,8 @@ "description": "Very nice a polite server. Must try for everyone!" } ], + "rightSideText": "A Minecraft client clone in the browser!", + "splashText": "Gen is cooking!", "pauseLinks": [ [ { diff --git a/src/appConfig.ts b/src/appConfig.ts index b8f83ad1..c5b61b69 100644 --- a/src/appConfig.ts +++ b/src/appConfig.ts @@ -15,11 +15,13 @@ export type AppConfig = { mapsProvider?: string appParams?: Record // query string params + rightSideText?: string defaultSettings?: Record forceSettings?: Record // hideSettings?: Record allowAutoConnect?: boolean + splashText?: string pauseLinks?: Array>> } diff --git a/src/appParams.ts b/src/appParams.ts index 4112a99c..aec6fd0b 100644 --- a/src/appParams.ts +++ b/src/appParams.ts @@ -42,6 +42,8 @@ export type AppQsParams = { suggest_save?: string noPacketsValidation?: string testCrashApp?: string + onlyConnect?: string + connectText?: string freezeSettings?: string // Replay params diff --git a/src/cameraRotationControls.ts b/src/cameraRotationControls.ts index 8b21e53d..3368666f 100644 --- a/src/cameraRotationControls.ts +++ b/src/cameraRotationControls.ts @@ -74,9 +74,8 @@ export const onControInit = () => { } function pointerLockChangeCallback () { - if (notificationProxy.id === 'pointerlockchange') { - hideNotification() - } + hideNotification('pointerlockchange') + if (appViewer.rendererState.preventEscapeMenu) return if (!pointerLock.hasPointerLock && activeModalStack.length === 0 && miscUiState.gameLoaded) { showModal({ reactType: 'pause-screen' }) diff --git a/src/controls.ts b/src/controls.ts index 83a5f4eb..f8160cfd 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -41,36 +41,43 @@ const controlOptions = { export const contro = new ControMax({ commands: { general: { + // movement jump: ['Space', 'A'], inventory: ['KeyE', 'X'], drop: ['KeyQ', 'B'], sneak: ['ShiftLeft'], toggleSneakOrDown: [null, 'Right Stick'], sprint: ['ControlLeft', 'Left Stick'], + // game interactions nextHotbarSlot: [null, 'Right Bumper'], prevHotbarSlot: [null, 'Left Bumper'], attackDestroy: [null, 'Right Trigger'], interactPlace: [null, 'Left Trigger'], - chat: [['KeyT', 'Enter']], - command: ['Slash'], swapHands: ['KeyF'], - zoom: ['KeyC'], selectItem: ['KeyH'], // default will be removed rotateCameraLeft: [null], rotateCameraRight: [null], rotateCameraUp: [null], rotateCameraDown: [null], - viewerConsole: ['Backquote'] + // ui? + chat: [['KeyT', 'Enter']], + command: ['Slash'], + // client side + zoom: ['KeyC'], + viewerConsole: ['Backquote'], }, ui: { toggleFullscreen: ['F11'], back: [null/* 'Escape' */, 'B'], - toggleMap: ['KeyM'], + toggleMap: ['KeyJ'], leftClick: [null, 'A'], rightClick: [null, 'Y'], speedupCursor: [null, 'Left Stick'], pauseMenu: [null, 'Start'] }, + communication: { + toggleMicrophone: ['KeyK'], + }, advanced: { lockUrl: ['KeyY'], }, @@ -550,6 +557,10 @@ contro.on('trigger', ({ command }) => { } } + if (command === 'communication.toggleMicrophone') { + // toggleMicrophoneMuted() + } + if (command === 'ui.pauseMenu') { showModal({ reactType: 'pause-screen' }) } diff --git a/src/core/progressReporter.ts b/src/core/progressReporter.ts index f4e4e701..a222272d 100644 --- a/src/core/progressReporter.ts +++ b/src/core/progressReporter.ts @@ -163,15 +163,16 @@ export const createFullScreenProgressReporter = (): ProgressReporter => { } export const createNotificationProgressReporter = (endMessage?: string): ProgressReporter => { + const id = `progress-reporter-${Math.random().toString(36).slice(2)}` return createProgressReporter({ setMessage (message: string) { - showNotification(`${message}...`, '', false, '', undefined, true) + showNotification(`${message}...`, '', false, '', undefined, true, id) }, end () { if (endMessage) { showNotification(endMessage, '', false, '', undefined, true) } else { - hideNotification() + hideNotification(id) } }, diff --git a/src/customChannels.ts b/src/customChannels.ts index 7cdd6c32..57c057d5 100644 --- a/src/customChannels.ts +++ b/src/customChannels.ts @@ -218,10 +218,6 @@ const registerMediaChannels = () => { { name: 'z', type: 'f32' }, { name: 'width', type: 'f32' }, { name: 'height', type: 'f32' }, - // N, 0 - // W, 3 - // S, 2 - // E, 1 { name: 'rotation', type: 'i16' }, // 0: 0° - towards positive z, 1: 90° - positive x, 2: 180° - negative z, 3: 270° - negative x (3-6 is same but double side) { name: 'source', type: ['pstring', { countType: 'i16' }] }, { name: 'loop', type: 'bool' }, diff --git a/src/globalState.ts b/src/globalState.ts index 2d77b720..bd845195 100644 --- a/src/globalState.ts +++ b/src/globalState.ts @@ -8,7 +8,11 @@ import { AppConfig } from './appConfig' // todo: refactor structure with support of hideNext=false -export const notHideableModalsWithoutForce = new Set(['app-status']) +export const notHideableModalsWithoutForce = new Set([ + 'app-status', + 'divkit:nonclosable', + 'only-connect-server', +]) type Modal = ({ elem?: HTMLElement & Record } & { reactType: string }) @@ -35,10 +39,10 @@ const showModalInner = (modal: Modal) => { return true } -export const showModal = (elem: /* (HTMLElement & Record) | */{ reactType: string }) => { - const resolved = elem +export const showModal = (elem: /* (HTMLElement & Record) | */{ reactType: string } | string) => { + const resolved = typeof elem === 'string' ? { reactType: elem } : elem const curModal = activeModalStack.at(-1) - if (/* elem === curModal?.elem || */(elem.reactType && elem.reactType === curModal?.reactType) || !showModalInner(resolved)) return + if ((resolved.reactType && resolved.reactType === curModal?.reactType) || !showModalInner(resolved)) return activeModalStack.push(resolved) } @@ -49,7 +53,7 @@ export const showModal = (elem: /* (HTMLElement & Record) | */{ re export const hideModal = (modal = activeModalStack.at(-1), data: any = undefined, options: { force?: boolean; restorePrevious?: boolean } = {}) => { const { force = false, restorePrevious = true } = options if (!modal) return - let cancel = notHideableModalsWithoutForce.has(modal.reactType) ? !force : undefined + let cancel = [...notHideableModalsWithoutForce].some(m => modal.reactType.startsWith(m)) ? !force : undefined if (force) { cancel = undefined } diff --git a/src/index.ts b/src/index.ts index 42346606..3da14257 100644 --- a/src/index.ts +++ b/src/index.ts @@ -97,6 +97,7 @@ import { createConsoleLogProgressReporter, createFullScreenProgressReporter, Pro import { appViewer } from './appViewer' import './appViewerLoad' import { registerOpenBenchmarkListener } from './benchmark' +import { tryHandleBuiltinCommand } from './builtinCommands' window.debug = debug window.beforeRenderFrame = [] @@ -208,8 +209,12 @@ export async function connect (connectOptions: ConnectOptions) { let ended = false let bot!: typeof __type_bot - const destroyAll = () => { + const destroyAll = (wasKicked = false) => { if (ended) return + const hadConnected = !!bot + if (!wasKicked && miscUiState.appConfig?.allowAutoConnect && appQueryParams.autoConnect && hadConnected) { + location.reload() + } errorAbortController.abort() ended = true progress.end() @@ -251,6 +256,10 @@ export async function connect (connectOptions: ConnectOptions) { if (isCypress()) throw err miscUiState.hasErrors = true if (miscUiState.gameLoaded) return + // close all modals + for (const modal of activeModalStack) { + hideModal(modal) + } setLoadingScreenStatus(`Error encountered. ${err}`, true) appStatusState.showReconnect = true @@ -280,7 +289,7 @@ export async function connect (connectOptions: ConnectOptions) { if (connectOptions.server && !connectOptions.viewerWsConnect && !parsedServer.isWebSocket) { console.log(`using proxy ${proxy.host}:${proxy.port || location.port}`) - net['setProxy']({ hostname: proxy.host, port: proxy.port }) + net['setProxy']({ hostname: proxy.host, port: proxy.port, headers: { Authorization: `Bearer ${new URLSearchParams(location.search).get('token') ?? ''}` } }) } const renderDistance = singleplayer ? renderDistanceSingleplayer : multiplayerRenderDistance @@ -622,9 +631,13 @@ export async function connect (connectOptions: ConnectOptions) { bot.on('kicked', (kickReason) => { console.log('You were kicked!', kickReason) const { formatted: kickReasonFormatted, plain: kickReasonString } = parseFormattedMessagePacket(kickReason) + // close all modals + for (const modal of activeModalStack) { + hideModal(modal) + } setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${kickReasonString}`, true, undefined, undefined, kickReasonFormatted) appStatusState.showReconnect = true - destroyAll() + destroyAll(true) }) const packetBeforePlay = (_, __, ___, fullBuffer) => { @@ -644,6 +657,10 @@ export async function connect (connectOptions: ConnectOptions) { if (endReason === 'socketClosed') { endReason = lastKnownKickReason ?? 'Connection with proxy server lost' } + // close all modals + for (const modal of activeModalStack) { + hideModal(modal) + } setLoadingScreenStatus(`You have been disconnected from the server. End reason:\n${endReason}`, true) appStatusState.showReconnect = true onPossibleErrorDisconnect() @@ -799,7 +816,10 @@ export async function connect (connectOptions: ConnectOptions) { const commands = appQueryParamsArray.command ?? [] for (let command of commands) { if (!command.startsWith('/')) command = `/${command}` - bot.chat(command) + const builtinHandled = tryHandleBuiltinCommand(command) + if (!builtinHandled) { + bot.chat(command) + } } }) } @@ -888,7 +908,11 @@ if (!reconnectOptions) { const waitAppConfigLoad = !appQueryParams.proxy const openServerEditor = () => { hideModal() - showModal({ reactType: 'editServer' }) + if (appQueryParams.onlyConnect) { + showModal({ reactType: 'only-connect-server' }) + } else { + showModal({ reactType: 'editServer' }) + } } showModal({ reactType: 'empty' }) if (waitAppConfigLoad) { diff --git a/src/react/Chat.tsx b/src/react/Chat.tsx index 78c69bec..0a2843c8 100644 --- a/src/react/Chat.tsx +++ b/src/react/Chat.tsx @@ -283,10 +283,8 @@ export default ({ const message = chatInput.current.value if (message) { setSendHistory([...sendHistoryRef.current, message]) - const result = sendMessage?.(message) - if (result !== false) { - onClose?.() - } + onClose?.() + sendMessage?.(message) // Always scroll to bottom after sending a message scrollToBottom() } diff --git a/src/react/ConnectOnlyServerUi.tsx b/src/react/ConnectOnlyServerUi.tsx new file mode 100644 index 00000000..213fa19b --- /dev/null +++ b/src/react/ConnectOnlyServerUi.tsx @@ -0,0 +1,80 @@ +import { useMemo } from 'react' +import { useSnapshot } from 'valtio' +import { appQueryParams } from '../appParams' +import { ConnectOptions } from '../connect' +import { lastConnectOptions } from './AppStatusProvider' +import PixelartIcon, { pixelartIcons } from './PixelartIcon' +import { useIsModalActive } from './utilsApp' +import Button from './Button' + +const VERTICAL_LAYOUT = false + +export default () => { + const { ip, version, proxy, username, connectText } = appQueryParams + const isModalActive = useIsModalActive('only-connect-server') + + if (!isModalActive) return null + + const handleConnect = () => { + const connectOptions: ConnectOptions = { + username: username || '', + server: ip, + proxy, + botVersion: version, + } + window.dispatchEvent(new CustomEvent('connect', { detail: connectOptions })) + } + + return ( +
+
+
+
+ + {ip} + {proxy && ({proxy})} +
+
+ + {username} + {version && ({version})} +
+
+ +
+
+ ) +} diff --git a/src/react/MainMenu.tsx b/src/react/MainMenu.tsx index 85c5367e..7ed257c0 100644 --- a/src/react/MainMenu.tsx +++ b/src/react/MainMenu.tsx @@ -1,7 +1,9 @@ import React from 'react' import { openURL } from 'renderer/viewer/lib/simpleUtils' +import { useSnapshot } from 'valtio' import { haveDirectoryPicker } from '../utils' import { ConnectOptions } from '../connect' +import { miscUiState } from '../globalState' import styles from './mainMenu.module.css' import Button from './Button' import ButtonWithTooltip from './ButtonWithTooltip' @@ -44,6 +46,8 @@ export default ({ bottomRightLinks, singleplayerAvailable = true }: Props) => { + const { appConfig } = useSnapshot(miscUiState) + if (!bottomRightLinks?.trim()) bottomRightLinks = undefined // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion const linksParsed = bottomRightLinks?.split(/;|\n/g).map(l => { @@ -89,7 +93,7 @@ export default ({
- Prismarine is a beautiful block + {appConfig?.splashText}
@@ -177,7 +181,7 @@ export default ({
})}
- A Minecraft client clone in the browser! + {appConfig?.rightSideText}
diff --git a/src/react/NotificationProvider.tsx b/src/react/NotificationProvider.tsx index 6460c0e9..8a8e4df6 100644 --- a/src/react/NotificationProvider.tsx +++ b/src/react/NotificationProvider.tsx @@ -25,7 +25,8 @@ export const showNotification = ( isError = false, icon = '', action = undefined as (() => void) | undefined, - autoHide = true + autoHide = true, + id = '' ) => { notificationProxy.message = message notificationProxy.subMessage = subMessage @@ -34,11 +35,14 @@ export const showNotification = ( notificationProxy.open = true notificationProxy.autoHide = autoHide notificationProxy.action = action + notificationProxy.id = id } globalThis.showNotification = showNotification -export const hideNotification = () => { - // openNotification('') // reset - notificationProxy.open = false +export const hideNotification = (id?: string) => { + if (id === undefined || notificationProxy.id === id) { + // openNotification('') // reset + notificationProxy.open = false + } } export default () => { @@ -47,7 +51,7 @@ export default () => { useEffect(() => { if (autoHide && open) { setTimeout(() => { - hideNotification() + hideNotification(notificationProxy.id) }, 7000) } }, [autoHide, open]) diff --git a/src/react/VoiceMicrophone.tsx b/src/react/VoiceMicrophone.tsx new file mode 100644 index 00000000..af2c3fc2 --- /dev/null +++ b/src/react/VoiceMicrophone.tsx @@ -0,0 +1,77 @@ +import { proxy, useSnapshot } from 'valtio' +import PixelartIcon, { pixelartIcons } from './PixelartIcon' + +export const voiceChatStatus = proxy({ + active: false, + muted: false, + hasInputVoice: false, + isErrored: false, + isConnected: false, + isAlone: false, + + isSharingScreen: false, +}) + +window.voiceChatStatus = voiceChatStatus + +const Icon = () => { + return + + + +} + +export default () => { + const SIZE = 48 + const { active, muted, hasInputVoice, isSharingScreen, isConnected, isErrored, isAlone } = useSnapshot(voiceChatStatus) + if (!active) return null + + const getRingColor = () => { + if (isErrored) return 'rgba(214, 4, 4, 0.5)' // red with opacity + if (isConnected) { + if (isAlone) return 'rgba(183, 255, 0, 0.5)' // lime yellow + return 'rgba(50, 205, 50, 0.5)' // green with opacity + } + return 'rgba(128, 128, 128, 0.5)' // gray with opacity + } + + return ( +
{ + // toggleMicrophoneMuted() + }} + > +
+ +
+ {/* stop sharing screen */} + {isSharingScreen &&
+ Stop Sharing Screen +
} +
+ ) +} diff --git a/src/reactUi.tsx b/src/reactUi.tsx index 93db7706..04a02ec8 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -54,6 +54,8 @@ import { useAppScale } from './scaleInterface' import PacketsReplayProvider from './react/PacketsReplayProvider' import TouchInteractionHint from './react/TouchInteractionHint' import { ua } from './react/utils' +import VoiceMicrophone from './react/VoiceMicrophone' +import ConnectOnlyServerUi from './react/ConnectOnlyServerUi' import ControDebug from './react/ControDebug' import ChunksDebug from './react/ChunksDebug' import ChunksDebugScreen from './react/ChunksDebugScreen' @@ -159,6 +161,7 @@ const InGameUi = () => { {!disabledUiParts.includes('crosshair') && } {!disabledUiParts.includes('books') && } {!disabledUiParts.includes('bossbars') && displayBossBars && } +
@@ -227,6 +230,7 @@ const App = () => { + diff --git a/src/screens.css b/src/screens.css index 289fe129..8d9c2b75 100644 --- a/src/screens.css +++ b/src/screens.css @@ -17,6 +17,7 @@ inset: 0; height: 100dvh; background: rgba(0, 0, 0, 0.75); + z-index: 12; } .fullscreen { diff --git a/src/shims/patchShims.ts b/src/shims/patchShims.ts index 1890edf6..4a374b7e 100644 --- a/src/shims/patchShims.ts +++ b/src/shims/patchShims.ts @@ -1,5 +1,7 @@ import { EventEmitter } from 'events' +EventEmitter.defaultMaxListeners = 200 + const oldEmit = EventEmitter.prototype.emit EventEmitter.prototype.emit = function (...args) { if (args[0] === 'error' && !this._events.error) { From a7c35df95984702d3b88fca48412b1f9889271a6 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 18 Apr 2025 17:46:10 +0300 Subject: [PATCH 025/309] fix: fix movement sound --- src/sounds/botSoundSystem.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sounds/botSoundSystem.ts b/src/sounds/botSoundSystem.ts index 882fd2b7..33ad42e0 100644 --- a/src/sounds/botSoundSystem.ts +++ b/src/sounds/botSoundSystem.ts @@ -134,10 +134,12 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { const movementHappening = async () => { if (!bot.entity || !soundMap) return // no info yet const VELOCITY_THRESHOLD = 0.1 + const RUN_THRESHOLD = 0.15 const { x, z, y } = bot.entity.velocity - if (bot.entity.onGround && Math.abs(x) < VELOCITY_THRESHOLD && (Math.abs(z) > VELOCITY_THRESHOLD || Math.abs(y) > VELOCITY_THRESHOLD)) { + if (bot.entity.onGround && (Math.abs(x) > VELOCITY_THRESHOLD || Math.abs(z) > VELOCITY_THRESHOLD)) { + const isRunning = (Math.abs(x) > RUN_THRESHOLD || Math.abs(z) > RUN_THRESHOLD) // movement happening - if (Date.now() - lastStepSound > 300) { + if (Date.now() - lastStepSound > (isRunning ? 100 : 300)) { const blockUnder = bot.world.getBlock(bot.entity.position.offset(0, -1, 0)) if (blockUnder) { const stepSound = soundMap.getStepSound(blockUnder.name) From 9646fbbc0f3d655606035daa8c0575109969c354 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 18 Apr 2025 23:42:51 +0300 Subject: [PATCH 026/309] fix(regression): hotbar switch on mobile was broken --- src/react/HotbarRenderApp.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/react/HotbarRenderApp.tsx b/src/react/HotbarRenderApp.tsx index e1eeb47a..84dc11e2 100644 --- a/src/react/HotbarRenderApp.tsx +++ b/src/react/HotbarRenderApp.tsx @@ -81,6 +81,9 @@ const HotbarInner = () => { const controller = new AbortController() const inv = openItemsCanvas('HotbarWin', { + _client: { + write () {} + }, clickWindow (slot, mouseButton, mode) { if (mouseButton === 1) { console.log('right click') From dbfd2b23f62b82cc6892dc898f60f949613a5f7c Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Fri, 18 Apr 2025 23:43:26 +0300 Subject: [PATCH 027/309] up physics --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ee07230d..2a92c0a1 100644 --- a/package.json +++ b/package.json @@ -195,7 +195,7 @@ }, "pnpm": { "overrides": { - "@nxg-org/mineflayer-physics-util": "1.8.6", + "@nxg-org/mineflayer-physics-util": "1.8.7", "buffer": "^6.0.3", "vec3": "0.1.10", "three": "0.154.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7b1da61..120e5646 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@nxg-org/mineflayer-physics-util': 1.8.6 + '@nxg-org/mineflayer-physics-util': 1.8.7 buffer: ^6.0.3 vec3: 0.1.10 three: 0.154.0 @@ -2025,8 +2025,8 @@ packages: '@nxg-org/mineflayer-auto-jump@0.7.12': resolution: {integrity: sha512-F5vX/lerlWx/5HVlkDNbvrtQ19PL6iG8i4ItPTIRtjGiFzusDefP7DI226zSFR8Wlaw45qHv0jn814p/4/qVdQ==} - '@nxg-org/mineflayer-physics-util@1.8.6': - resolution: {integrity: sha512-eRn9e9OMvl1+kEfwPPshAl1A5MX0eDWaI7WVRf7ht9qo9N3fKiw+mM/AGPuhVjEr16zUls77P6Sn9cVZJuUdlw==} + '@nxg-org/mineflayer-physics-util@1.8.7': + resolution: {integrity: sha512-wtLYvHqoEFr/j0ny2lyogwjbMvwpFuG2aWI8sI14+EAiGFRpL5+cog2ujSDsnRTZruO7tUXMTiPc1kebjXwfJg==} '@nxg-org/mineflayer-tracker@1.2.1': resolution: {integrity: sha512-SI1ffF8zvg3/ZNE021Ja2W0FZPN+WbQDZf8yFqOcXtPRXAtM9W6HvoACdzXep8BZid7WYgYLIgjKpB+9RqvCNQ==} @@ -11353,10 +11353,10 @@ snapshots: '@nxg-org/mineflayer-auto-jump@0.7.12': dependencies: - '@nxg-org/mineflayer-physics-util': 1.8.6 + '@nxg-org/mineflayer-physics-util': 1.8.7 strict-event-emitter-types: 2.0.0 - '@nxg-org/mineflayer-physics-util@1.8.6': + '@nxg-org/mineflayer-physics-util@1.8.7': dependencies: '@nxg-org/mineflayer-util-plugin': 1.8.4 @@ -17437,7 +17437,7 @@ snapshots: mineflayer@https://codeload.github.com/GenerelSchwerz/mineflayer/tar.gz/d459d2ed76a997af1a7c94718ed7d5dee4478b8a(encoding@0.1.13): dependencies: - '@nxg-org/mineflayer-physics-util': 1.8.6 + '@nxg-org/mineflayer-physics-util': 1.8.7 minecraft-data: 3.83.1 minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/9e116c3dd4682b17c4e2c80249a2447a093d9284(patch_hash=3a55a278c417cc34ff3172cd1de8e22852935cba0586875cbd0635f1ffdaa5ab)(encoding@0.1.13) prismarine-biome: 1.3.0(minecraft-data@3.83.1)(prismarine-registry@1.11.0) From c3112794c070615d76d19e9351ed96149c78f901 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 19 Apr 2025 00:07:41 +0300 Subject: [PATCH 028/309] try to fix scroll chat bug --- src/react/hooks/useScrollBehavior.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/react/hooks/useScrollBehavior.ts b/src/react/hooks/useScrollBehavior.ts index c7c4499a..3b9499a6 100644 --- a/src/react/hooks/useScrollBehavior.ts +++ b/src/react/hooks/useScrollBehavior.ts @@ -23,6 +23,13 @@ export const useScrollBehavior = ( const scrollToBottom = () => { if (elementRef.current) { elementRef.current.scrollTop = elementRef.current.scrollHeight + setTimeout(() => { + if (!elementRef.current) return + elementRef.current.scrollTo({ + top: elementRef.current.scrollHeight, + behavior: 'instant' + }) + }, 0) } } From 193c748feb6f4487c260b6f99ea1d0de3c667c92 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 19 Apr 2025 00:43:20 +0300 Subject: [PATCH 029/309] fix: add chunks a little faster on low tier devices: use indicies --- renderer/viewer/lib/mesher/models.ts | 40 ++++++++++++++------- renderer/viewer/lib/mesher/shared.ts | 3 +- renderer/viewer/three/worldrendererThree.ts | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/renderer/viewer/lib/mesher/models.ts b/renderer/viewer/lib/mesher/models.ts index 66b1fe58..1fc5acda 100644 --- a/renderer/viewer/lib/mesher/models.ts +++ b/renderer/viewer/lib/mesher/models.ts @@ -423,13 +423,19 @@ function renderElement (world: World, cursor: Vec3, element: BlockElement, doAO: if (!needTiles) { if (doAO && aos[0] + aos[3] >= aos[1] + aos[2]) { - attr.indices.push( - ndx, ndx + 3, ndx + 2, ndx, ndx + 1, ndx + 3 - ) + attr.indices[attr.indicesCount++] = ndx + attr.indices[attr.indicesCount++] = ndx + 3 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 3 } else { - attr.indices.push( - ndx, ndx + 1, ndx + 2, ndx + 2, ndx + 1, ndx + 3 - ) + attr.indices[attr.indicesCount++] = ndx + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 3 } } } @@ -462,7 +468,8 @@ export function getSectionGeometry (sx, sy, sz, world: World) { t_normals: [], t_colors: [], t_uvs: [], - indices: [], + indices: new Uint32Array(442_368), // Maximum possible indices + indicesCount: 0, // Track current index position tiles: {}, // todo this can be removed here heads: {}, @@ -605,12 +612,19 @@ export function getSectionGeometry (sx, sy, sz, world: World) { let ndx = attr.positions.length / 3 for (let i = 0; i < attr.t_positions!.length / 12; i++) { - attr.indices.push( - ndx, ndx + 1, ndx + 2, ndx + 2, ndx + 1, ndx + 3, - // eslint-disable-next-line @stylistic/function-call-argument-newline - // back face - ndx, ndx + 2, ndx + 1, ndx + 2, ndx + 3, ndx + 1 - ) + attr.indices[attr.indicesCount++] = ndx + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 3 + // back face + attr.indices[attr.indicesCount++] = ndx + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 1 + attr.indices[attr.indicesCount++] = ndx + 2 + attr.indices[attr.indicesCount++] = ndx + 3 + attr.indices[attr.indicesCount++] = ndx + 1 ndx += 4 } diff --git a/renderer/viewer/lib/mesher/shared.ts b/renderer/viewer/lib/mesher/shared.ts index 0e36c73b..1ebbb087 100644 --- a/renderer/viewer/lib/mesher/shared.ts +++ b/renderer/viewer/lib/mesher/shared.ts @@ -33,7 +33,8 @@ export type MesherGeometryOutput = { t_colors?: number[], t_uvs?: number[], - indices: number[], + indices: Uint32Array, + indicesCount: number, tiles: Record, heads: Record, signs: Record, diff --git a/renderer/viewer/three/worldrendererThree.ts b/renderer/viewer/three/worldrendererThree.ts index 482b0255..3d03dc47 100644 --- a/renderer/viewer/three/worldrendererThree.ts +++ b/renderer/viewer/three/worldrendererThree.ts @@ -333,7 +333,7 @@ export class WorldRendererThree extends WorldRendererCommon { geometry.setAttribute('normal', new THREE.BufferAttribute(data.geometry.normals, 3)) geometry.setAttribute('color', new THREE.BufferAttribute(data.geometry.colors, 3)) geometry.setAttribute('uv', new THREE.BufferAttribute(data.geometry.uvs, 2)) - geometry.setIndex(data.geometry.indices) + geometry.index = new THREE.Uint16BufferAttribute(data.geometry.indices, 1) const mesh = new THREE.Mesh(geometry, this.material) mesh.position.set(data.geometry.sx, data.geometry.sy, data.geometry.sz) From a0bfa275afc9b5427ed082be7e01e86dc8fe1b88 Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Sat, 19 Apr 2025 00:43:31 +0300 Subject: [PATCH 030/309] lets be safer and use 32array --- renderer/viewer/lib/mesher/models.ts | 1 + renderer/viewer/lib/mesher/shared.ts | 1 + renderer/viewer/three/worldrendererThree.ts | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/renderer/viewer/lib/mesher/models.ts b/renderer/viewer/lib/mesher/models.ts index 1fc5acda..c5d34e9d 100644 --- a/renderer/viewer/lib/mesher/models.ts +++ b/renderer/viewer/lib/mesher/models.ts @@ -470,6 +470,7 @@ export function getSectionGeometry (sx, sy, sz, world: World) { t_uvs: [], indices: new Uint32Array(442_368), // Maximum possible indices indicesCount: 0, // Track current index position + using32Array: true, tiles: {}, // todo this can be removed here heads: {}, diff --git a/renderer/viewer/lib/mesher/shared.ts b/renderer/viewer/lib/mesher/shared.ts index 1ebbb087..ea56e016 100644 --- a/renderer/viewer/lib/mesher/shared.ts +++ b/renderer/viewer/lib/mesher/shared.ts @@ -35,6 +35,7 @@ export type MesherGeometryOutput = { indices: Uint32Array, indicesCount: number, + using32Array: boolean, tiles: Record, heads: Record, signs: Record, diff --git a/renderer/viewer/three/worldrendererThree.ts b/renderer/viewer/three/worldrendererThree.ts index 3d03dc47..bb4c1805 100644 --- a/renderer/viewer/three/worldrendererThree.ts +++ b/renderer/viewer/three/worldrendererThree.ts @@ -333,7 +333,11 @@ export class WorldRendererThree extends WorldRendererCommon { geometry.setAttribute('normal', new THREE.BufferAttribute(data.geometry.normals, 3)) geometry.setAttribute('color', new THREE.BufferAttribute(data.geometry.colors, 3)) geometry.setAttribute('uv', new THREE.BufferAttribute(data.geometry.uvs, 2)) - geometry.index = new THREE.Uint16BufferAttribute(data.geometry.indices, 1) + if (data.geometry.using32Array) { + geometry.index = new THREE.Uint32BufferAttribute(data.geometry.indices, 1) + } else { + geometry.index = new THREE.Uint16BufferAttribute(data.geometry.indices, 1) + } const mesh = new THREE.Mesh(geometry, this.material) mesh.position.set(data.geometry.sx, data.geometry.sy, data.geometry.sz) From 2b881ea5ba135f488c8533bed4a449ba67dfc59d Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Mon, 21 Apr 2025 16:06:01 +0300 Subject: [PATCH 031/309] fix: disable physics for viewer --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 3da14257..ecc824b4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -543,6 +543,7 @@ export async function connect (connectOptions: ConnectOptions) { window.bot = bot if (connectOptions.viewerWsConnect) { void handleCustomChannel() + bot.physicsEnabled = false } customEvents.emit('mineflayerBotCreated') if (singleplayer || p2pMultiplayer || localReplaySession) { From 71f63a3be0bd73cf6cfc120d8c31110d9b48881b Mon Sep 17 00:00:00 2001 From: Vitaly Turovsky Date: Tue, 22 Apr 2025 19:01:04 +0300 Subject: [PATCH 032/309] sync fork: add loading timer for debug, better connecting messages, better recording panel --- src/appConfig.ts | 8 ++ src/entities.ts | 3 +- src/index.ts | 15 ++- src/mineflayer/entityStatus.ts | 70 ++++++++++++++ src/mineflayer/mc-protocol.ts | 14 ++- src/mineflayer/plugins/packetsRecording.ts | 17 ++++ src/optionsStorage.ts | 12 ++- src/packetsReplay/packetsReplayLegacy.ts | 2 +- src/react/AppStatus.tsx | 103 +++++++++++---------- src/react/AppStatusProvider.tsx | 3 +- src/react/DebugOverlay.tsx | 6 +- src/react/HotbarRenderApp.tsx | 3 - src/react/LoadingTimer.tsx | 50 ++++++++++ src/react/PauseScreen.tsx | 2 + src/react/ReplayPanel.tsx | 20 +++- src/react/ServersListProvider.tsx | 38 ++++++++ src/react/components/replay/PacketList.tsx | 13 +-- src/react/state/packetsReplayState.ts | 1 + src/scaleInterface.ts | 1 + src/screens.css | 16 ++++ src/shims/dns.js | 10 +- 21 files changed, 335 insertions(+), 72 deletions(-) create mode 100644 src/mineflayer/entityStatus.ts create mode 100644 src/react/LoadingTimer.tsx diff --git a/src/appConfig.ts b/src/appConfig.ts index c5b61b69..531c258d 100644 --- a/src/appConfig.ts +++ b/src/appConfig.ts @@ -1,7 +1,9 @@ +import { defaultsDeep } from 'lodash' import { disabledSettings, options, qsOptions } from './optionsStorage' import { miscUiState } from './globalState' import { setLoadingScreenStatus } from './appStatus' import { setStorageDataOnAppConfigLoad } from './react/appStorageProvider' +import { customKeymaps, updateBinds } from './controls' export type AppConfig = { // defaultHost?: string @@ -23,6 +25,7 @@ export type AppConfig = { allowAutoConnect?: boolean splashText?: string pauseLinks?: Array>> + keybindings?: Record } export const loadAppConfig = (appConfig: AppConfig) => { @@ -46,6 +49,11 @@ export const loadAppConfig = (appConfig: AppConfig) => { } } + if (appConfig.keybindings) { + Object.assign(customKeymaps, defaultsDeep(appConfig.keybindings, customKeymaps)) + updateBinds(customKeymaps) + } + setStorageDataOnAppConfigLoad() } diff --git a/src/entities.ts b/src/entities.ts index 9ba31f2e..68e18df3 100644 --- a/src/entities.ts +++ b/src/entities.ts @@ -6,6 +6,7 @@ import { subscribeKey } from 'valtio/utils' import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' import { options, watchValue } from './optionsStorage' import { miscUiState } from './globalState' +import { EntityStatus } from './mineflayer/entityStatus' const updateAutoJump = () => { @@ -85,7 +86,7 @@ customEvents.on('gameLoaded', () => { bot._client.on('entity_status', (data) => { if (versionToNumber(bot.version) >= versionToNumber('1.19.4')) return const { entityId, entityStatus } = data - if (entityStatus === 2) { + if (entityStatus === EntityStatus.HURT) { getThreeJsRendererMethods()?.damageEntity(entityId, entityStatus) } }) diff --git a/src/index.ts b/src/index.ts index ecc824b4..a94aa35d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,11 +93,12 @@ import ping from './mineflayer/plugins/ping' import mouse from './mineflayer/plugins/mouse' import { startLocalReplayServer } from './packetsReplay/replayPackets' import { localRelayServerPlugin } from './mineflayer/plugins/packetsRecording' -import { createConsoleLogProgressReporter, createFullScreenProgressReporter, ProgressReporter } from './core/progressReporter' +import { createConsoleLogProgressReporter, createFullScreenProgressReporter, createWrappedProgressReporter, ProgressReporter } from './core/progressReporter' import { appViewer } from './appViewer' import './appViewerLoad' import { registerOpenBenchmarkListener } from './benchmark' import { tryHandleBuiltinCommand } from './builtinCommands' +import { loadingTimerState } from './react/LoadingTimer' window.debug = debug window.beforeRenderFrame = [] @@ -168,6 +169,8 @@ export async function connect (connectOptions: ConnectOptions) { }) } + loadingTimerState.loading = true + loadingTimerState.start = Date.now() miscUiState.hasErrors = false lastConnectOptions.value = connectOptions @@ -211,6 +214,7 @@ export async function connect (connectOptions: ConnectOptions) { let bot!: typeof __type_bot const destroyAll = (wasKicked = false) => { if (ended) return + loadingTimerState.loading = false const hadConnected = !!bot if (!wasKicked && miscUiState.appConfig?.allowAutoConnect && appQueryParams.autoConnect && hadConnected) { location.reload() @@ -302,10 +306,12 @@ export async function connect (connectOptions: ConnectOptions) { Object.assign(serverOptions, connectOptions.serverOverridesFlat ?? {}) await progress.executeWithMessage('Downloading minecraft data', 'download-mcdata', async () => { + loadingTimerState.networkOnlyStart = Date.now() await Promise.all([ downloadAllMinecraftData(), downloadOtherGameData() ]) + loadingTimerState.networkOnlyStart = 0 }) let dataDownloaded = false @@ -401,8 +407,10 @@ export async function connect (connectOptions: ConnectOptions) { } else if (connectOptions.server) { if (!finalVersion) { const versionAutoSelect = getVersionAutoSelect() - setLoadingScreenStatus(`Fetching server version. Preffered: ${versionAutoSelect}`) + const wrapped = createWrappedProgressReporter(progress, `Fetching server version. Preffered: ${versionAutoSelect}`) + loadingTimerState.networkOnlyStart = Date.now() const autoVersionSelect = await getServerInfo(server.host, server.port ? Number(server.port) : undefined, versionAutoSelect) + wrapped.end() finalVersion = autoVersionSelect.version } initialLoadingText = `Connecting to server ${server.host}:${server.port ?? 25_565} with version ${finalVersion}` @@ -416,6 +424,7 @@ export async function connect (connectOptions: ConnectOptions) { setLoadingScreenStatus(initialLoadingText) if (parsedServer.isWebSocket) { + loadingTimerState.networkOnlyStart = Date.now() clientDataStream = (await getWebsocketStream(server.host)).mineflayerStream } @@ -459,6 +468,7 @@ export async function connect (connectOptions: ConnectOptions) { if (finalVersion) { // ensure data is downloaded + loadingTimerState.networkOnlyStart ??= Date.now() await downloadMcData(finalVersion) } @@ -672,6 +682,7 @@ export async function connect (connectOptions: ConnectOptions) { onBotCreate() bot.once('login', () => { + loadingTimerState.networkOnlyStart = 0 setLoadingScreenStatus('Loading world') }) diff --git a/src/mineflayer/entityStatus.ts b/src/mineflayer/entityStatus.ts new file mode 100644 index 00000000..e13784bc --- /dev/null +++ b/src/mineflayer/entityStatus.ts @@ -0,0 +1,70 @@ +export const EntityStatus = { + JUMP: 1, + HURT: 2, // legacy + DEATH: 3, + START_ATTACKING: 4, + STOP_ATTACKING: 5, + TAMING_FAILED: 6, + TAMING_SUCCEEDED: 7, + SHAKE_WETNESS: 8, + USE_ITEM_COMPLETE: 9, + EAT_GRASS: 10, + OFFER_FLOWER: 11, + LOVE_HEARTS: 12, + VILLAGER_ANGRY: 13, + VILLAGER_HAPPY: 14, + WITCH_HAT_MAGIC: 15, + ZOMBIE_CONVERTING: 16, + FIREWORKS_EXPLODE: 17, + IN_LOVE_HEARTS: 18, + SQUID_ANIM_SYNCH: 19, + SILVERFISH_MERGE_ANIM: 20, + GUARDIAN_ATTACK_SOUND: 21, + REDUCED_DEBUG_INFO: 22, + FULL_DEBUG_INFO: 23, + PERMISSION_LEVEL_ALL: 24, + PERMISSION_LEVEL_MODERATORS: 25, + PERMISSION_LEVEL_GAMEMASTERS: 26, + PERMISSION_LEVEL_ADMINS: 27, + PERMISSION_LEVEL_OWNERS: 28, + ATTACK_BLOCKED: 29, + SHIELD_DISABLED: 30, + FISHING_ROD_REEL_IN: 31, + ARMORSTAND_WOBBLE: 32, + THORNED: 33, // legacy + STOP_OFFER_FLOWER: 34, + TALISMAN_ACTIVATE: 35, // legacy + DROWNED: 36, // legacy + BURNED: 37, // legacy + DOLPHIN_LOOKING_FOR_TREASURE: 38, + RAVAGER_STUNNED: 39, + TRUSTING_FAILED: 40, + TRUSTING_SUCCEEDED: 41, + VILLAGER_SWEAT: 42, + BAD_OMEN_TRIGGERED: 43, // legacy + POKED: 44, // legacy + FOX_EAT: 45, + TELEPORT: 46, + MAINHAND_BREAK: 47, + OFFHAND_BREAK: 48, + HEAD_BREAK: 49, + CHEST_BREAK: 50, + LEGS_BREAK: 51, + FEET_BREAK: 52, + HONEY_SLIDE: 53, + HONEY_JUMP: 54, + SWAP_HANDS: 55, + CANCEL_SHAKE_WETNESS: 56, + FROZEN: 57, // legacy + START_RAM: 58, + END_RAM: 59, + POOF: 60, + TENDRILS_SHIVER: 61, + SONIC_CHARGE: 62, + SNIFFER_DIGGING_SOUND: 63, + ARMADILLO_PEEK: 64, + BODY_BREAK: 65, + SHAKE: 66 +} as const + +export type EntityStatusName = keyof typeof EntityStatus diff --git a/src/mineflayer/mc-protocol.ts b/src/mineflayer/mc-protocol.ts index 63a90fa4..2376cd03 100644 --- a/src/mineflayer/mc-protocol.ts +++ b/src/mineflayer/mc-protocol.ts @@ -2,6 +2,7 @@ import { Client } from 'minecraft-protocol' import { appQueryParams } from '../appParams' import { downloadAllMinecraftData, getVersionAutoSelect } from '../connect' import { gameAdditionalState } from '../globalState' +import { ProgressReporter } from '../core/progressReporter' import { pingServerVersion, validatePacket } from './minecraft-protocol-extra' import { getWebsocketStream } from './websocket-core' @@ -34,16 +35,27 @@ setInterval(() => { }, 1000) -export const getServerInfo = async (ip: string, port?: number, preferredVersion = getVersionAutoSelect(), ping = false) => { +export const getServerInfo = async (ip: string, port?: number, preferredVersion = getVersionAutoSelect(), ping = false, progressReporter?: ProgressReporter) => { await downloadAllMinecraftData() const isWebSocket = ip.startsWith('ws://') || ip.startsWith('wss://') let stream if (isWebSocket) { + progressReporter?.setMessage('Connecting to WebSocket server') stream = (await getWebsocketStream(ip)).mineflayerStream + progressReporter?.setMessage('WebSocket connected. Ping packet sent, waiting for response') + } + window.setLoadingMessage = (message?: string) => { + if (message === undefined) { + progressReporter?.endStage('dns') + } else { + progressReporter?.beginStage('dns', message) + } } return pingServerVersion(ip, port, { ...(stream ? { stream } : {}), ...(ping ? { noPongTimeout: 3000 } : {}), ...(preferredVersion ? { version: preferredVersion } : {}), + }).finally(() => { + window.setLoadingMessage = undefined }) } diff --git a/src/mineflayer/plugins/packetsRecording.ts b/src/mineflayer/plugins/packetsRecording.ts index 53a63bd8..b9ba028c 100644 --- a/src/mineflayer/plugins/packetsRecording.ts +++ b/src/mineflayer/plugins/packetsRecording.ts @@ -72,6 +72,7 @@ export const localRelayServerPlugin = (bot: Bot) => { position: position++, timestamp: Date.now(), }) + packetsReplayState.progress.current++ } }) bot._client.on('packet', (data, { name }) => { @@ -86,8 +87,22 @@ export const localRelayServerPlugin = (bot: Bot) => { position: position++, timestamp: Date.now(), }) + packetsReplayState.progress.total++ } }) + const oldWriteChannel = bot._client.writeChannel.bind(bot._client) + bot._client.writeChannel = (channel, params) => { + packetsReplayState.packetsPlayback.push({ + name: channel, + data: params, + isFromClient: true, + isUpcoming: false, + position: position++, + timestamp: Date.now(), + isCustomChannel: true, + }) + oldWriteChannel(channel, params) + } upPacketsReplayPanel() } @@ -95,6 +110,8 @@ export const localRelayServerPlugin = (bot: Bot) => { const upPacketsReplayPanel = () => { if (packetsRecordingState.active && bot) { packetsReplayState.isOpen = true + packetsReplayState.isMinimized = true + packetsReplayState.isRecording = true packetsReplayState.replayName = 'Recording all packets for ' + bot.username } } diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index c8e6298e..3cc91517 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -59,10 +59,11 @@ const defaultOptions = { serversAutoVersionSelect: 'auto' as 'auto' | 'latest' | '1.20.4' | string, customChannels: false, remoteContentNotSameOrigin: false as boolean | string[], - packetsReplayAutoStart: false, + packetsRecordingAutoStart: false, + locale: 'auto', preciseMouseInput: false, // todo ui setting, maybe enable by default? - waitForChunksRender: 'sp-only' as 'sp-only' | boolean, + waitForChunksRender: false as 'sp-only' | boolean, jeiEnabled: true as boolean | Array<'creative' | 'survival' | 'adventure' | 'spectator'>, preventBackgroundTimeoutKick: false, preventSleep: false, @@ -293,3 +294,10 @@ export const useOptionValue = (setting, valueCallback) => { valueCallback(setting) subscribe(setting, valueCallback) } + +export const getLocale = () => { + if (options.locale === 'auto') { + return navigator.language + } + return options.locale +} diff --git a/src/packetsReplay/packetsReplayLegacy.ts b/src/packetsReplay/packetsReplayLegacy.ts index dc9b7a2d..a9cc71ec 100644 --- a/src/packetsReplay/packetsReplayLegacy.ts +++ b/src/packetsReplay/packetsReplayLegacy.ts @@ -3,7 +3,7 @@ import { PacketsLogger } from 'mcraft-fun-mineflayer/build/packetsLogger' import { options } from '../optionsStorage' export const packetsRecordingState = proxy({ - active: options.packetsReplayAutoStart, + active: options.packetsRecordingAutoStart, hasRecordedPackets: false }) diff --git a/src/react/AppStatus.tsx b/src/react/AppStatus.tsx index c083e445..b8c7dbde 100644 --- a/src/react/AppStatus.tsx +++ b/src/react/AppStatus.tsx @@ -4,6 +4,7 @@ import styles from './appStatus.module.css' import Button from './Button' import Screen from './Screen' import LoadingChunks from './LoadingChunks' +import LoadingTimer from './LoadingTimer' export default ({ status, @@ -37,57 +38,61 @@ export default ({ void statusRunner() }, []) + const lockConnect = appQueryParams.lockConnect === 'true' return ( - - - {status} - - -

{description}

-

{lastStatus ? `Last status: ${lastStatus}` : lastStatus}

- - } - backdrop='dirt' - > - {isError && ( - <> - {showReconnect && onReconnect && } - {actionsSlot} - - {backAction && } + {actionsSlot} + {!lockConnect && } + {backAction && )} +
} diff --git a/src/react/ReplayPanel.tsx b/src/react/ReplayPanel.tsx index 3b709882..ca7b2aec 100644 --- a/src/react/ReplayPanel.tsx +++ b/src/react/ReplayPanel.tsx @@ -43,7 +43,7 @@ export default function ReplayPanel ({ style }: Props) { const [filter, setFilter] = useState(defaultFilter) - const { isMinimized } = useSnapshot(packetsReplayState) + const { isMinimized, isRecording } = useSnapshot(packetsReplayState) const { filtered: filteredPackets, hiddenCount } = filterPackets(packets.slice(-500), filter) useEffect(() => { @@ -70,7 +70,9 @@ export default function ReplayPanel ({ }} > - {isPlaying ? ( + {isRecording ? ( + + ) : isPlaying ? ( ) : ( @@ -137,7 +139,9 @@ export default function ReplayPanel ({ -
Integrated server emulation. Testing client...
+
+ {isRecording ? 'Recording packets...' : 'Integrated server emulation. Testing client...'} +
-
+
{playPauseButton}
@@ -228,4 +239,5 @@ export interface PacketData { actualVersion?: any position: number timestamp: number + isCustomChannel?: boolean } diff --git a/src/react/ServersListProvider.tsx b/src/react/ServersListProvider.tsx index db1d7d77..cd44a27a 100644 --- a/src/react/ServersListProvider.tsx +++ b/src/react/ServersListProvider.tsx @@ -16,6 +16,11 @@ import { showOptionsModal } from './SelectOption' import { useCopyKeybinding } from './simpleHooks' import { AuthenticatedAccount, getInitialServersList, getServerConnectionHistory, setNewServersList } from './serversStorage' import { appStorage, StoreServerItem } from './appStorageProvider' +import Button from './Button' +import { pixelartIcons } from './PixelartIcon' +import { showNotification } from './NotificationProvider' + +const EXPLICIT_SHARE_SERVER_MODE = false if (appQueryParams.lockConnect) { notHideableModalsWithoutForce.add('editServer') @@ -350,6 +355,27 @@ const Inner = ({ hidden, customServersList }: { hidden?: boolean, customServersL }} worldData={serversListSorted.map(server => { const additional = additionalServerData[server.ip] + const handleShare = async () => { + try { + const qs = new URLSearchParams() + qs.set('ip', server.ip) + if (server.proxyOverride) qs.set('proxy', server.proxyOverride) + if (server.versionOverride) qs.set('version', server.versionOverride) + qs.set('username', server.usernameOverride ?? '') + const shareUrl = `${window.location.origin}${window.location.pathname}?${qs.toString()}` + await navigator.clipboard.writeText(shareUrl) + const MESSAGE = 'Server link copied to clipboard' + if (EXPLICIT_SHARE_SERVER_MODE) { + await showOptionsModal(MESSAGE, []) + } else { + showNotification(MESSAGE) + } + } catch (err) { + console.error(err) + showNotification('Failed to copy server link to clipboard') + } + } + return { name: server.index.toString(), title: server.name || server.ip, @@ -359,6 +385,16 @@ const Inner = ({ hidden, customServersList }: { hidden?: boolean, customServersL worldNameRightGrayed: additional?.textNameRightGrayed ?? '', iconSrc: additional?.icon, offline: additional?.offline, + afterTitleUi: ( + + + + + +
+ + + diff --git a/renderer/viewer/three/entity/EntityMesh.ts b/renderer/viewer/three/entity/EntityMesh.ts index af6cc576..488a0f86 100644 --- a/renderer/viewer/three/entity/EntityMesh.ts +++ b/renderer/viewer/three/entity/EntityMesh.ts @@ -551,3 +551,4 @@ export class EntityMesh { } } } +window.EntityMesh = EntityMesh diff --git a/renderer/viewer/three/graphicsBackend.ts b/renderer/viewer/three/graphicsBackend.ts index b0fe5f28..14534d40 100644 --- a/renderer/viewer/three/graphicsBackend.ts +++ b/renderer/viewer/three/graphicsBackend.ts @@ -1,8 +1,8 @@ import * as THREE from 'three' import { Vec3 } from 'vec3' -import { proxy } from 'valtio' -import { GraphicsBackendLoader, GraphicsBackend, GraphicsInitOptions, DisplayWorldOptions, RendererReactiveState } from '../../../src/appViewer' +import { GraphicsBackendLoader, GraphicsBackend, GraphicsInitOptions, DisplayWorldOptions } from '../../../src/appViewer' import { ProgressReporter } from '../../../src/core/progressReporter' +import { showNotification } from '../../../src/react/NotificationProvider' import { WorldRendererThree } from './worldrendererThree' import { DocumentRenderer } from './documentRenderer' import { PanoramaRenderer } from './panorama' @@ -53,12 +53,14 @@ const createGraphicsBackend: GraphicsBackendLoader = (initOptions: GraphicsInitO let panoramaRenderer: PanoramaRenderer | null = null let worldRenderer: WorldRendererThree | null = null - const startPanorama = () => { + const startPanorama = async () => { if (worldRenderer) return if (!panoramaRenderer) { panoramaRenderer = new PanoramaRenderer(documentRenderer, initOptions, !!process.env.SINGLE_FILE_BUILD_MODE) - void panoramaRenderer.start() window.panoramaRenderer = panoramaRenderer + callModsMethod('panoramaCreated', panoramaRenderer) + await panoramaRenderer.start() + callModsMethod('panoramaReady', panoramaRenderer) } } @@ -79,6 +81,7 @@ const createGraphicsBackend: GraphicsBackendLoader = (initOptions: GraphicsInitO worldRenderer?.render(sizeChanged) } window.world = worldRenderer + callModsMethod('worldReady', worldRenderer) } const disconnect = () => { @@ -120,8 +123,24 @@ const createGraphicsBackend: GraphicsBackendLoader = (initOptions: GraphicsInitO } } + globalThis.threeJsBackend = backend + globalThis.resourcesManager = initOptions.resourcesManager + callModsMethod('default', backend) + return backend } +const callModsMethod = (method: string, ...args: any[]) => { + for (const mod of Object.values((window.loadedMods ?? {}) as Record)) { + try { + mod.threeJsBackendModule?.[method]?.(...args) + } catch (err) { + const errorMessage = `[mod three.js] Error calling ${method} on ${mod.name}: ${err}` + showNotification(errorMessage, 'error') + throw new Error(errorMessage) + } + } +} + createGraphicsBackend.id = 'threejs' export default createGraphicsBackend diff --git a/rsbuild.config.ts b/rsbuild.config.ts index 36ccb9b0..b1567c6e 100644 --- a/rsbuild.config.ts +++ b/rsbuild.config.ts @@ -173,6 +173,7 @@ const appConfig = defineConfig({ fs.copyFileSync('./assets/favicon.png', './dist/favicon.png') fs.copyFileSync('./assets/playground.html', './dist/playground.html') fs.copyFileSync('./assets/manifest.json', './dist/manifest.json') + fs.copyFileSync('./assets/config.html', './dist/config.html') fs.copyFileSync('./assets/loading-bg.jpg', './dist/loading-bg.jpg') if (fs.existsSync('./assets/release.json')) { fs.copyFileSync('./assets/release.json', './dist/release.json') diff --git a/src/appConfig.ts b/src/appConfig.ts index 497b95ec..156c5974 100644 --- a/src/appConfig.ts +++ b/src/appConfig.ts @@ -29,6 +29,7 @@ export type AppConfig = { defaultLanguage?: string displayLanguageSelector?: boolean supportedLanguages?: string[] + showModsButton?: boolean } export const loadAppConfig = (appConfig: AppConfig) => { diff --git a/src/appViewer.ts b/src/appViewer.ts index 0f29b9a6..ca62bd1b 100644 --- a/src/appViewer.ts +++ b/src/appViewer.ts @@ -89,6 +89,8 @@ export interface GraphicsBackend { } export class AppViewer { + waitBackendLoadPromises = [] as Array> + resourcesManager = new ResourcesManager() worldView: WorldDataEmitter | undefined readonly config: GraphicsBackendConfig = { @@ -114,11 +116,14 @@ export class AppViewer { this.disconnectBackend() } - loadBackend (loader: GraphicsBackendLoader) { + async loadBackend (loader: GraphicsBackendLoader) { if (this.backend) { this.disconnectBackend() } + await Promise.all(this.waitBackendLoadPromises) + this.waitBackendLoadPromises = [] + this.backendLoader = loader const rendererSpecificSettings = {} as Record const rendererSettingsKey = `renderer.${this.backendLoader?.id}` diff --git a/src/appViewerLoad.ts b/src/appViewerLoad.ts index 96e3bf03..53260662 100644 --- a/src/appViewerLoad.ts +++ b/src/appViewerLoad.ts @@ -9,25 +9,27 @@ import { showNotification } from './react/NotificationProvider' const backends = [ createGraphicsBackend, ] -const loadBackend = () => { +const loadBackend = async () => { let backend = backends.find(backend => backend.id === options.activeRenderer) if (!backend) { showNotification(`No backend found for renderer ${options.activeRenderer}`, `Falling back to ${backends[0].id}`, true) backend = backends[0] } - appViewer.loadBackend(backend) + await appViewer.loadBackend(backend) } window.loadBackend = loadBackend if (process.env.SINGLE_FILE_BUILD_MODE) { const unsub = subscribeKey(miscUiState, 'fsReady', () => { if (miscUiState.fsReady) { // don't do it earlier to load fs and display menu faster - loadBackend() + void loadBackend() unsub() } }) } else { - loadBackend() + setTimeout(() => { + void loadBackend() + }) } const animLoop = () => { @@ -40,10 +42,10 @@ watchOptionsAfterViewerInit() // reset backend when renderer changes -subscribeKey(options, 'activeRenderer', () => { +subscribeKey(options, 'activeRenderer', async () => { if (appViewer.currentDisplay === 'world' && bot) { appViewer.resetBackend(true) - loadBackend() + await loadBackend() void appViewer.startWithBot() } }) diff --git a/src/clientMods.ts b/src/clientMods.ts new file mode 100644 index 00000000..a6242d1a --- /dev/null +++ b/src/clientMods.ts @@ -0,0 +1,582 @@ +/* eslint-disable no-await-in-loop */ +import { openDB } from 'idb' +import * as React from 'react' +import * as valtio from 'valtio' +import * as valtioUtils from 'valtio/utils' +import { gt } from 'semver' +import { proxy } from 'valtio' +import { options } from './optionsStorage' +import { appStorage } from './react/appStorageProvider' +import { showInputsModal, showOptionsModal } from './react/SelectOption' +import { ProgressReporter } from './core/progressReporter' + +let sillyProtection = false +const protectRuntime = () => { + if (sillyProtection) return + sillyProtection = true + const sensetiveKeys = new Set(['authenticatedAccounts', 'serversList', 'username']) + const proxy = new Proxy(window.localStorage, { + get (target, prop) { + if (typeof prop === 'string') { + if (sensetiveKeys.has(prop)) { + console.warn(`Access to sensitive key "${prop}" was blocked`) + return null + } + if (prop === 'getItem') { + return (key: string) => { + if (sensetiveKeys.has(key)) { + console.warn(`Access to sensitive key "${key}" via getItem was blocked`) + return null + } + return target.getItem(key) + } + } + if (prop === 'setItem') { + return (key: string, value: string) => { + if (sensetiveKeys.has(key)) { + console.warn(`Attempt to set sensitive key "${key}" via setItem was blocked`) + return + } + target.setItem(key, value) + } + } + if (prop === 'removeItem') { + return (key: string) => { + if (sensetiveKeys.has(key)) { + console.warn(`Attempt to delete sensitive key "${key}" via removeItem was blocked`) + return + } + target.removeItem(key) + } + } + if (prop === 'clear') { + console.warn('Attempt to clear localStorage was blocked') + return () => {} + } + } + return Reflect.get(target, prop) + }, + set (target, prop, value) { + if (typeof prop === 'string' && sensetiveKeys.has(prop)) { + console.warn(`Attempt to set sensitive key "${prop}" was blocked`) + return false + } + return Reflect.set(target, prop, value) + }, + deleteProperty (target, prop) { + if (typeof prop === 'string' && sensetiveKeys.has(prop)) { + console.warn(`Attempt to delete sensitive key "${prop}" was blocked`) + return false + } + return Reflect.deleteProperty(target, prop) + } + }) + Object.defineProperty(window, 'localStorage', { + value: proxy, + writable: false, + configurable: false, + }) +} + +// #region Database +const dbPromise = openDB('mods-db', 1, { + upgrade (db) { + db.createObjectStore('mods', { + keyPath: 'name', + }) + db.createObjectStore('repositories', { + keyPath: 'url', + }) + }, +}) + +// mcraft-repo.json +export interface McraftRepoFile { + packages: ClientModDefinition[] + /** @default true */ + prefix?: string | boolean + name?: string // display name + description?: string + mirrorUrls?: string[] + autoUpdateOverride?: boolean + lastUpdated?: number +} +export interface Repository extends McraftRepoFile { + url: string +} + +export interface ClientMod { + name: string; // unique identifier like owner.name + version: string + enabled?: boolean + + scriptMainUnstable?: string; + serverPlugin?: string + // serverPlugins?: string[] + // mesherThread?: string + stylesGlobal?: string + threeJsBackend?: string // three.js + // stylesLocal?: string + + requiresNetwork?: boolean + fullyOffline?: boolean + description?: string + author?: string + section?: string + autoUpdateOverride?: boolean + lastUpdated?: number + wasModifiedLocally?: boolean + // todo depends, hashsum +} + +const cleanupFetchedModData = (mod: ClientModDefinition | Record) => { + delete mod['enabled'] + delete mod['repo'] + delete mod['autoUpdateOverride'] + delete mod['lastUpdated'] + delete mod['wasModifiedLocally'] + return mod +} + +export type ClientModDefinition = Omit & { + scriptMainUnstable?: boolean + stylesGlobal?: boolean + serverPlugin?: boolean + threeJsBackend?: boolean +} + +export async function saveClientModData (data: ClientMod) { + const db = await dbPromise + data.lastUpdated = Date.now() + await db.put('mods', data) + modsReactiveUpdater.counter++ +} + +async function getPlugin (name: string) { + const db = await dbPromise + return db.get('mods', name) as Promise +} + +async function getAllMods () { + const db = await dbPromise + return db.getAll('mods') as Promise +} + +async function deletePlugin (name) { + const db = await dbPromise + await db.delete('mods', name) + modsReactiveUpdater.counter++ +} + +async function removeAllMods () { + const db = await dbPromise + await db.clear('mods') + modsReactiveUpdater.counter++ +} + +// --- + +async function saveRepository (data: Repository) { + const db = await dbPromise + data.lastUpdated = Date.now() + await db.put('repositories', data) +} + +async function getRepository (url: string) { + const db = await dbPromise + return db.get('repositories', url) as Promise +} + +async function getAllRepositories () { + const db = await dbPromise + return db.getAll('repositories') as Promise +} +window.getAllRepositories = getAllRepositories + +async function deleteRepository (url) { + const db = await dbPromise + await db.delete('repositories', url) +} + +// --- + +// #endregion + +window.mcraft = { + version: process.env.RELEASE_TAG, + build: process.env.BUILD_VERSION, + ui: {}, + React, + valtio: { + ...valtio, + ...valtioUtils, + }, + // openDB +} + +const activateMod = async (mod: ClientMod, reason: string) => { + if (mod.enabled === false) return false + protectRuntime() + console.debug(`Activating mod ${mod.name} (${reason})...`) + window.loadedMods ??= {} + if (window.loadedMods[mod.name]) { + console.warn(`Mod is ${mod.name} already loaded, skipping activation...`) + return false + } + if (mod.stylesGlobal) { + const style = document.createElement('style') + style.textContent = mod.stylesGlobal + style.id = `mod-${mod.name}` + document.head.appendChild(style) + } + if (mod.scriptMainUnstable) { + const blob = new Blob([mod.scriptMainUnstable], { type: 'text/javascript' }) + const url = URL.createObjectURL(blob) + // eslint-disable-next-line no-useless-catch + try { + const module = await import(/* webpackIgnore: true */ url) + module.default?.(structuredClone(mod)) + window.loadedMods[mod.name] ??= {} + window.loadedMods[mod.name].mainUnstableModule = module + } catch (e) { + throw e + } + URL.revokeObjectURL(url) + } + if (mod.threeJsBackend) { + const blob = new Blob([mod.threeJsBackend], { type: 'text/javascript' }) + const url = URL.createObjectURL(blob) + // eslint-disable-next-line no-useless-catch + try { + const module = await import(/* webpackIgnore: true */ url) + // todo + window.loadedMods[mod.name] ??= {} + // for accessing global world var + window.loadedMods[mod.name].threeJsBackendModule = module + } catch (e) { + throw e + } + URL.revokeObjectURL(url) + } + mod.enabled = true + return true +} + +export const appStartup = async () => { + void checkModsUpdates() + + const mods = await getAllMods() + for (const mod of mods) { + await activateMod(mod, 'autostart').catch(e => { + modsErrors[mod.name] ??= [] + modsErrors[mod.name].push(`startup: ${String(e)}`) + console.error(`Error activating mod on startup ${mod.name}:`, e) + }) + } +} + +export const modsUpdateStatus = proxy({} as Record) +export const modsWaitingReloadStatus = proxy({} as Record) +export const modsErrors = proxy({} as Record) + +const normalizeRepoUrl = (url: string) => { + if (url.startsWith('https://')) return url + if (url.startsWith('http://')) return url + if (url.startsWith('//')) return `https:${url}` + return `https://raw.githubusercontent.com/${url}/master` +} + +const installOrUpdateMod = async (repo: Repository, mod: ClientModDefinition, activate = true, progress?: ProgressReporter) => { + // eslint-disable-next-line no-useless-catch + try { + const fetchData = async (urls: string[]) => { + const errored = [] as string[] + // eslint-disable-next-line no-unreachable-loop + for (const urlTemplate of urls) { + const modNameOnly = mod.name.split('.').pop() + const modFolder = repo.prefix === false ? modNameOnly : typeof repo.prefix === 'string' ? `${repo.prefix}/${modNameOnly}` : mod.name + const url = new URL(`${modFolder}/${urlTemplate}`, normalizeRepoUrl(repo.url).replace(/\/$/, '') + '/').href + // eslint-disable-next-line no-useless-catch + try { + const response = await fetch(url) + if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`) + return await response.text() + } catch (e) { + // errored.push(String(e)) + throw e + } + } + console.warn(`[${mod.name}] Error installing component of ${urls[0]}: ${errored.join(', ')}`) + return undefined + } + if (mod.stylesGlobal) { + await progress?.executeWithMessage( + `Downloading ${mod.name} styles`, + async () => { + mod.stylesGlobal = await fetchData(['global.css']) as any + } + ) + } + if (mod.scriptMainUnstable) { + await progress?.executeWithMessage( + `Downloading ${mod.name} script`, + async () => { + mod.scriptMainUnstable = await fetchData(['mainUnstable.js']) as any + } + ) + } + if (mod.threeJsBackend) { + await progress?.executeWithMessage( + `Downloading ${mod.name} three.js backend`, + async () => { + mod.threeJsBackend = await fetchData(['three.js']) as any + } + ) + } + if (mod.serverPlugin) { + if (mod.name.endsWith('.disabled')) throw new Error(`Mod name ${mod.name} can't end with .disabled`) + await progress?.executeWithMessage( + `Downloading ${mod.name} server plugin`, + async () => { + mod.serverPlugin = await fetchData(['serverPlugin.js']) as any + } + ) + } + if (activate) { + // todo try to de-activate mod if it's already loaded + if (window.loadedMods?.[mod.name]) { + modsWaitingReloadStatus[mod.name] = true + } else { + await activateMod(mod as ClientMod, 'install') + } + } + await saveClientModData(mod as ClientMod) + delete modsUpdateStatus[mod.name] + } catch (e) { + // console.error(`Error installing mod ${mod.name}:`, e) + throw e + } +} + +const checkRepositoryUpdates = async (repo: Repository) => { + for (const mod of repo.packages) { + + const modExisting = await getPlugin(mod.name) + if (modExisting?.version && gt(mod.version, modExisting.version)) { + modsUpdateStatus[mod.name] = [modExisting.version, mod.version] + if (options.modsAutoUpdate === 'always' && (!repo.autoUpdateOverride && !modExisting.autoUpdateOverride)) { + void installOrUpdateMod(repo, mod).catch(e => { + console.error(`Error updating mod ${mod.name}:`, e) + }) + } + } + } + +} + +export const fetchRepository = async (urlOriginal: string, url: string, hasMirrors = false) => { + const fetchUrl = normalizeRepoUrl(url).replace(/\/$/, '') + '/mcraft-repo.json' + try { + const response = await fetch(fetchUrl).then(async res => res.json()) + if (!response.packages) throw new Error(`No packages field in the response json of the repository: ${fetchUrl}`) + response.autoUpdateOverride = (await getRepository(urlOriginal))?.autoUpdateOverride + response.url = urlOriginal + void saveRepository(response) + modsReactiveUpdater.counter++ + return true + } catch (e) { + console.warn(`Error fetching repository (trying other mirrors) ${url}:`, e) + return false + } +} + +export const fetchAllRepositories = async () => { + const repositories = await getAllRepositories() + await Promise.all(repositories.map(async (repo) => { + const allUrls = [repo.url, ...(repo.mirrorUrls || [])] + for (const [i, url] of allUrls.entries()) { + const isLast = i === allUrls.length - 1 + + if (await fetchRepository(repo.url, url, !isLast)) break + } + })) + appStorage.modsAutoUpdateLastCheck = Date.now() +} + +const checkModsUpdates = async () => { + await autoRefreshModRepositories() + for (const repo of await getAllRepositories()) { + + await checkRepositoryUpdates(repo) + } +} + +const autoRefreshModRepositories = async () => { + if (options.modsAutoUpdate === 'never') return + const lastCheck = appStorage.modsAutoUpdateLastCheck + if (lastCheck && Date.now() - lastCheck < 1000 * 60 * 60 * options.modsUpdatePeriodCheck) return + await fetchAllRepositories() + // todo think of not updating check timestamp on offline access +} + +export const installModByName = async (repoUrl: string, name: string, progress?: ProgressReporter) => { + progress?.beginStage('main', `Installing ${name}`) + const repo = await getRepository(repoUrl) + if (!repo) throw new Error(`Repository ${repoUrl} not found`) + const mod = repo.packages.find(m => m.name === name) + if (!mod) throw new Error(`Mod ${name} not found in repository ${repoUrl}`) + await installOrUpdateMod(repo, mod, undefined, progress) + progress?.endStage('main') +} + +export const uninstallModAction = async (name: string) => { + const choice = await showOptionsModal(`Uninstall mod ${name}?`, ['Yes']) + if (!choice) return + await deletePlugin(name) + window.loadedMods ??= {} + if (window.loadedMods[name]) { + // window.loadedMods[name].default?.(null) + delete window.loadedMods[name] + modsWaitingReloadStatus[name] = true + } + // Clear any errors associated with the mod + delete modsErrors[name] +} + +export const setEnabledModAction = async (name: string, newEnabled: boolean) => { + const mod = await getPlugin(name) + if (!mod) throw new Error(`Mod ${name} not found`) + if (newEnabled) { + mod.enabled = true + if (!window.loadedMods?.[mod.name]) { + await activateMod(mod, 'manual') + } + } else { + // todo deactivate mod + mod.enabled = false + if (window.loadedMods?.[mod.name]) { + if (window.loadedMods[mod.name]?.threeJsBackendModule) { + window.loadedMods[mod.name].threeJsBackendModule.deactivate() + delete window.loadedMods[mod.name].threeJsBackendModule + } + if (window.loadedMods[mod.name]?.mainUnstableModule) { + window.loadedMods[mod.name].mainUnstableModule.deactivate() + delete window.loadedMods[mod.name].mainUnstableModule + } + + if (Object.keys(window.loadedMods[mod.name]).length === 0) { + delete window.loadedMods[mod.name] + } + } + } + await saveClientModData(mod) +} + +export const modsReactiveUpdater = proxy({ + counter: 0 +}) + +export const getAllModsDisplayList = async () => { + const repos = await getAllRepositories() + const installedMods = await getAllMods() + const modsWithoutRepos = installedMods.filter(mod => !repos.some(repo => repo.packages.some(m => m.name === mod.name))) + const mapMods = (mapMods: ClientMod[]) => mapMods.map(mod => ({ + ...mod, + installed: installedMods.find(m => m.name === mod.name), + activated: !!window.loadedMods?.[mod.name], + installedVersion: installedMods.find(m => m.name === mod.name)?.version, + canBeActivated: mod.scriptMainUnstable || mod.stylesGlobal, + })) + return { + repos: repos.map(repo => ({ + ...repo, + packages: mapMods(repo.packages as ClientMod[]), + })), + modsWithoutRepos: mapMods(modsWithoutRepos), + } +} + +export const removeRepositoryAction = async (url: string) => { + // todo remove mods + const choice = await showOptionsModal('Remove repository? Installed mods wont be automatically removed.', ['Yes']) + if (!choice) return + await deleteRepository(url) + modsReactiveUpdater.counter++ +} + +export const selectAndRemoveRepository = async () => { + const repos = await getAllRepositories() + const choice = await showOptionsModal('Select repository to remove', repos.map(repo => repo.url)) + if (!choice) return + await removeRepositoryAction(choice) +} + +export const addRepositoryAction = async () => { + const { url } = await showInputsModal('Add repository', { + url: { + type: 'text', + label: 'Repository URL or slug', + placeholder: 'github-owner/repo-name', + }, + }) + if (!url) return + await fetchRepository(url, url) +} + +export const getServerPlugin = async (plugin: string) => { + const mod = await getPlugin(plugin) + if (!mod) return null + if (mod.serverPlugin) { + return { + content: mod.serverPlugin, + version: mod.version + } + } + return null +} + +export const getAvailableServerPlugins = async () => { + const mods = await getAllMods() + return mods.filter(mod => mod.serverPlugin) +} + +window.inspectInstalledMods = getAllMods + +type ModifiableField = { + field: string + label: string + language: string + getContent?: () => string +} + +// --- + +export const getAllModsModifiableFields = () => { + const fields: ModifiableField[] = [ + { + field: 'scriptMainUnstable', + label: 'Main Thread Script (unstable)', + language: 'js' + }, + { + field: 'stylesGlobal', + label: 'Global CSS Styles', + language: 'css' + }, + { + field: 'threeJsBackend', + label: 'Three.js Renderer Backend Thread', + language: 'js' + }, + { + field: 'serverPlugin', + label: 'Built-in server plugin', + language: 'js' + } + ] + return fields +} + +export const getModModifiableFields = (mod: ClientMod): ModifiableField[] => { + return getAllModsModifiableFields().filter(field => mod[field.field]) +} diff --git a/src/core/progressReporter.ts b/src/core/progressReporter.ts index a222272d..c76bfb0b 100644 --- a/src/core/progressReporter.ts +++ b/src/core/progressReporter.ts @@ -1,6 +1,7 @@ import { setLoadingScreenStatus } from '../appStatus' import { appStatusState } from '../react/AppStatusProvider' import { hideNotification, showNotification } from '../react/NotificationProvider' +import { pixelartIcons } from '../react/PixelartIcon' export interface ProgressReporter { currentMessage: string | undefined @@ -170,7 +171,7 @@ export const createNotificationProgressReporter = (endMessage?: string): Progres }, end () { if (endMessage) { - showNotification(endMessage, '', false, '', undefined, true) + showNotification(endMessage, '', false, pixelartIcons.check, undefined, true) } else { hideNotification(id) } diff --git a/src/defaultLocalServerOptions.js b/src/defaultLocalServerOptions.js index cd949567..2acd3bce 100644 --- a/src/defaultLocalServerOptions.js +++ b/src/defaultLocalServerOptions.js @@ -8,6 +8,7 @@ module.exports = { 'gameMode': 0, 'difficulty': 0, 'worldFolder': 'world', + 'pluginsFolder': true, // todo set sid, disable entities auto-spawn 'generation': { // grass_field diff --git a/src/index.ts b/src/index.ts index 434c47eb..8678c26e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -81,6 +81,7 @@ import { updateAuthenticatedAccountData, updateLoadedServerData, updateServerCon import { mainMenuState } from './react/MainMenuRenderApp' import './mobileShim' import { parseFormattedMessagePacket } from './botUtils' +import { appStartup } from './clientMods' import { getViewerVersionData, getWsProtocolStream, onBotCreatedViewerHandler } from './viewerConnector' import { getWebsocketStream } from './mineflayer/websocket-core' import { appQueryParams, appQueryParamsArray } from './appParams' @@ -95,6 +96,7 @@ import './appViewerLoad' import { registerOpenBenchmarkListener } from './benchmark' import { tryHandleBuiltinCommand } from './builtinCommands' import { loadingTimerState } from './react/LoadingTimer' +import { loadPluginsIntoWorld } from './react/CreateWorldProvider' window.debug = debug window.beforeRenderFrame = [] @@ -369,6 +371,16 @@ export async function connect (connectOptions: ConnectOptions) { // Client (class) of flying-squid (in server/login.js of mc-protocol): onLogin handler: skip most logic & go to loginClient() which assigns uuid and sends 'success' back to client (onLogin handler) and emits 'login' on the server (login.js in flying-squid handler) // flying-squid: 'login' -> player.login -> now sends 'login' event to the client (handled in many plugins in mineflayer) -> then 'update_health' is sent which emits 'spawn' in mineflayer + const serverPlugins = new URLSearchParams(location.search).getAll('serverPlugin') + if (serverPlugins.length > 0 && !serverOptions.worldFolder) { + console.log('Placing server plugins', serverPlugins) + + serverOptions.worldFolder ??= '/temp' + await loadPluginsIntoWorld('/temp', serverPlugins) + + console.log('Server plugins placed') + } + localServer = window.localServer = window.server = startLocalServer(serverOptions) connectOptions?.connectEvents?.serverCreated?.() // todo need just to call quit if started @@ -669,7 +681,7 @@ export async function connect (connectOptions: ConnectOptions) { bot.once('login', () => { loadingTimerState.networkOnlyStart = 0 - setLoadingScreenStatus('Loading world') + progress.setMessage('Loading world') }) let worldWasReady = false @@ -984,4 +996,5 @@ if (initialLoader) { window.pageLoaded = true void possiblyHandleStateVariable() +appViewer.waitBackendLoadPromises.push(appStartup()) registerOpenBenchmarkListener() diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx index 975c0e5b..20514489 100644 --- a/src/optionsGuiScheme.tsx +++ b/src/optionsGuiScheme.tsx @@ -14,6 +14,7 @@ import { openFilePicker, resetLocalStorage } from './browserfs' import { completeResourcepackPackInstall, getResourcePackNames, resourcepackReload, resourcePackState, uninstallResourcePack } from './resourcePack' import { downloadPacketsReplay, packetsRecordingState } from './packetsReplay/packetsReplayLegacy' import { showInputsModal, showOptionsModal } from './react/SelectOption' +import { modsUpdateStatus } from './clientMods' import supportedVersions from './supportedVersions.mjs' import { getVersionAutoSelect } from './connect' import { createNotificationProgressReporter } from './core/progressReporter' @@ -227,6 +228,15 @@ export const guiOptionsScheme: { return + +
+ +
Default and other world types are WIP
@@ -80,7 +115,11 @@ export default ({ cancelClick, createClick, customizeClick, versions, defaultVer }} >Cancel - +
Note: save important worlds in folders on your hard drive!
{quota}
diff --git a/src/react/CreateWorldProvider.tsx b/src/react/CreateWorldProvider.tsx index b01f129c..6872474d 100644 --- a/src/react/CreateWorldProvider.tsx +++ b/src/react/CreateWorldProvider.tsx @@ -1,7 +1,10 @@ +import fs from 'fs' +import path from 'path' import { hideCurrentModal, showModal } from '../globalState' import defaultLocalServerOptions from '../defaultLocalServerOptions' import { mkdirRecursive, uniqueFileNameFromWorldName } from '../browserfs' import supportedVersions from '../supportedVersions.mjs' +import { getServerPlugin } from '../clientMods' import CreateWorld, { WorldCustomize, creatingWorldState } from './CreateWorld' import { getWorldsPath } from './SingleplayerProvider' import { useIsModalActive } from './utilsApp' @@ -14,7 +17,7 @@ export default () => { const versions = Object.values(versionsPerMinor).map(x => { return { version: x, - label: x === defaultLocalServerOptions.version ? `${x} (available offline)` : x + label: x === defaultLocalServerOptions.version ? `${x} (default)` : x } }) return { }} createClick={async () => { // create new world - const { title, type, version, gameMode } = creatingWorldState + const { title, type, version, gameMode, plugins } = creatingWorldState // todo display path in ui + disable if exist const savePath = await uniqueFileNameFromWorldName(title, getWorldsPath()) await mkdirRecursive(savePath) + await loadPluginsIntoWorld(savePath, plugins) let generation if (type === 'flat') { generation = { @@ -68,3 +72,16 @@ export default () => { } return null } + +export const loadPluginsIntoWorld = async (worldPath: string, plugins: string[]) => { + for (const plugin of plugins) { + // eslint-disable-next-line no-await-in-loop + const { content, version } = await getServerPlugin(plugin) ?? {} + if (content) { + // eslint-disable-next-line no-await-in-loop + await mkdirRecursive(path.join(worldPath, 'plugins')) + // eslint-disable-next-line no-await-in-loop + await fs.promises.writeFile(path.join(worldPath, 'plugins', `${plugin}-${version}.js`), content) + } + } +} diff --git a/src/react/Input.tsx b/src/react/Input.tsx index 169e880d..9b36c5ce 100644 --- a/src/react/Input.tsx +++ b/src/react/Input.tsx @@ -35,7 +35,6 @@ const Input = ({ autoFocus, rootStyles, inputRef, validateInput, defaultValue, w return
{ setValue(e.target.value) diff --git a/src/react/ModsPage.tsx b/src/react/ModsPage.tsx new file mode 100644 index 00000000..6f849fbd --- /dev/null +++ b/src/react/ModsPage.tsx @@ -0,0 +1,483 @@ +import { useEffect, useState, useMemo, useRef } from 'react' +import { useSnapshot } from 'valtio' +import { openURL } from 'renderer/viewer/lib/simpleUtils' +import { addRepositoryAction, setEnabledModAction, getAllModsDisplayList, installModByName, selectAndRemoveRepository, uninstallModAction, fetchAllRepositories, modsReactiveUpdater, modsErrors, fetchRepository, getModModifiableFields, saveClientModData, getAllModsModifiableFields } from '../clientMods' +import { createNotificationProgressReporter, ProgressReporter } from '../core/progressReporter' +import { hideModal } from '../globalState' +import { useIsModalActive } from './utilsApp' +import Input from './Input' +import Button from './Button' +import styles from './mods.module.css' +import { showOptionsModal, showInputsModal } from './SelectOption' +import Screen from './Screen' +import PixelartIcon, { pixelartIcons } from './PixelartIcon' +import { showNotification } from './NotificationProvider' +import { usePassesScaledDimensions } from './UIProvider' +import { appStorage } from './appStorageProvider' + +type ModsData = Awaited> + +const ModListItem = ({ + mod, + onClick, + hasError +}: { + mod: ModsData['repos'][0]['packages'][0], + onClick: () => void, + hasError: boolean +}) => ( +
+
+ {mod.name} + {mod.installedVersion && mod.installedVersion !== mod.version && ( + + )} +
+
+ {mod.description} + {mod.author && ` • By ${mod.author}`} + {mod.version && ` • v${mod.version}`} + {mod.serverPlugin && ` • World plugin`} +
+
+) + +const ModSidebar = ({ mod }: { mod: (ModsData['repos'][0]['packages'][0] & { repo?: string }) | null }) => { + const errors = useSnapshot(modsErrors) + const [editingField, setEditingField] = useState<{ name: string, content: string, language: string } | null>(null) + + const handleAction = async (action: () => Promise, errorMessage: string, progress?: ProgressReporter) => { + try { + await action() + progress?.end() + } catch (error) { + console.error(error) + progress?.end() + showNotification(errorMessage, error.message, true) + } + } + + if (!mod) { + return
Select a mod to view details
+ } + + const modifiableFields = mod.installed ? getModModifiableFields(mod.installed) : [] + + const handleSaveField = async (newContents: string) => { + if (!editingField) return + try { + mod[editingField.name] = newContents + mod.wasModifiedLocally = true + await saveClientModData(mod) + setEditingField(null) + showNotification('Success', 'Contents saved successfully') + } catch (error) { + showNotification('Error', 'Failed to save contents: ' + error.message, true) + } + } + + if (editingField) { + return ( + { + if (newContents === undefined) { + setEditingField(null) + return + } + void handleSaveField(newContents) + }} + /> + ) + } + + return ( + <> +
+
+ {mod.name} {mod.installed?.wasModifiedLocally ? '(modified)' : ''} +
+
+ {mod.description} +
+
+ {mod.author && `Author: ${mod.author}\n`} + {mod.version && `Version: ${mod.version}\n`} + {mod.installedVersion && mod.installedVersion !== mod.version && `Installed version: ${mod.installedVersion}\n`} + {mod.section && `Section: ${mod.section}\n`} +
+ {errors[mod.name]?.length > 0 && ( +
+
    + {errors[mod.name].map((error, i) => ( +
  • {error}
  • + ))} +
+
+ )} +
+
+ {mod.installed ? ( + <> + {mod.activated ? ( +
+ + ) +} + +const EditingCodeWindow = ({ + contents, + language, + onClose +}: { + contents: string, + language: string, + onClose: (newContents?: string) => void +}) => { + const ref = useRef(null) + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + e.preventDefault() + e.stopImmediatePropagation() + } + } + window.addEventListener('keydown', handleKeyDown, { capture: true }) + return () => window.removeEventListener('keydown', handleKeyDown, { capture: true }) + }, []) + + return +
+