diff --git a/README.md b/README.md index 9c953d6c4..2d9ec7b80 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # bridge. v2 -![Version](https://img.shields.io/github/v/release/bridge-core/editor?style=for-the-badge&label=Version&message=Test&color=005bc9&labelColor=121212) -![License](https://img.shields.io/static/v1?style=for-the-badge&label=License&message=GPL-3.0&color=005bc9&labelColor=121212) +Version License +Open in Codeflow + + diff --git a/index.html b/index.html index df521aa66..de3eacf71 100644 --- a/index.html +++ b/index.html @@ -219,6 +219,9 @@ window.process = { cwd: () => '', env: {}, + release: { + name: 'browser', + }, } self.setImmediate = setTimeout diff --git a/package-lock.json b/package-lock.json index 5f5f88304..749193635 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,14 +12,14 @@ "@types/lz-string": "^1.3.34", "bridge-common-utils": "^0.3.3", "bridge-iframe-api": "^0.4.7", - "bridge-js-runtime": "^0.3.4", + "bridge-js-runtime": "^0.3.6", "bridge-model-viewer": "^0.7.7", "buffer": "^6.0.3", "color-convert": "^2.0.1", "comlink": "^4.3.0", "compare-versions": "^3.6.0", "core-js": "^3.6.5", - "dash-compiler": "^0.9.29", + "dash-compiler": "^0.10.5", "escape-string-regexp": "^5.0.0", "fflate": "^0.6.7", "idb-keyval": "^5.1.3", @@ -59,7 +59,7 @@ "prettier": "^2.2.1", "sass": "^1.19.0", "typescript": "^4.4.3", - "vite": "^3.0.4", + "vite": "^3.1.2", "vite-plugin-ejs": "^1.4.3", "vite-plugin-pwa": "^0.12.3", "vite-plugin-vue2": "^2.0.2" @@ -1780,6 +1780,41 @@ "node": ">=6.9.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", + "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "dependencies": { + "esbuild-wasm": "0.15.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", + "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "dev": true, @@ -2500,8 +2535,9 @@ "integrity": "sha512-tphsYj61E6nPt5Cnw70IKlmy2IGjvFeYiy3eanCP2IkCJneytJW6vSNbefjq+T0cv8gU8vf5rjFcVlMF8vkAYA==" }, "node_modules/bridge-js-runtime": { - "version": "0.3.4", - "license": "MIT", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/bridge-js-runtime/-/bridge-js-runtime-0.3.7.tgz", + "integrity": "sha512-ACJYg3grVdtkQRERcTNOojTydwOsYf4354g6H5MW6lnO/WM+hQCdOxVOW02ciaXpRvE5R0t3xCVh1KBQ1PWYdg==", "dependencies": { "@swc/wasm-web": "^1.2.218", "json5": "^2.2.1", @@ -2837,13 +2873,13 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/dash-compiler": { - "version": "0.9.29", - "resolved": "https://registry.npmjs.org/dash-compiler/-/dash-compiler-0.9.29.tgz", - "integrity": "sha512-BxDcF7MtTWAginxD5UO5PBs4BZQIOpkIxJ4sztM8sL3vjdv3FH/maKndqjhVGc+bXW44rOYpnu6U64iGXzmmFg==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/dash-compiler/-/dash-compiler-0.10.5.tgz", + "integrity": "sha512-WXL/Nng2CQ9b2kzvJoydoK4BhjyR2Fj1x8xYAxDtDCLk0JZ2IlR+j+Sm1vMFm1ADQWhhHErj4ENSST+iyw2l8w==", "dependencies": { "@swc/wasm-web": "^1.2.218", "bridge-common-utils": "^0.3.0", - "bridge-js-runtime": "^0.3.4", + "bridge-js-runtime": "^0.3.7", "is-glob": "^4.0.3", "json5": "^2.2.0", "mc-project-core": "^0.3.21", @@ -2918,105 +2954,710 @@ "node": ">=0.10.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.198", - "dev": true, - "license": "ISC" + "node_modules/electron-to-chromium": { + "version": "1.4.198", + "dev": true, + "license": "ISC" + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.14.49", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.8.tgz", + "integrity": "sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "dependencies": { + "esbuild-wasm": "0.15.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.8.tgz", + "integrity": "sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.8.tgz", + "integrity": "sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.49", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.8.tgz", + "integrity": "sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.8.tgz", + "integrity": "sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.8.tgz", + "integrity": "sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.8.tgz", + "integrity": "sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.8.tgz", + "integrity": "sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.8.tgz", + "integrity": "sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.8.tgz", + "integrity": "sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.8.tgz", + "integrity": "sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.8.tgz", + "integrity": "sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.8.tgz", + "integrity": "sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.8.tgz", + "integrity": "sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.8.tgz", + "integrity": "sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.8.tgz", + "integrity": "sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.8.tgz", + "integrity": "sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==", + "dev": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.8.tgz", + "integrity": "sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.8.tgz", + "integrity": "sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.8.tgz", + "integrity": "sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-android-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-darwin-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-freebsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-freebsd-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-arm": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-mips64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-ppc64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-netbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild/node_modules/esbuild-openbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-abstract": { - "version": "1.20.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, + "node_modules/esbuild/node_modules/esbuild-sunos-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "node_modules/esbuild/node_modules/esbuild-windows-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/esbuild-windows-64": { "version": "0.14.49", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "esbuild-android-64": "0.14.49", - "esbuild-android-arm64": "0.14.49", - "esbuild-darwin-64": "0.14.49", - "esbuild-darwin-arm64": "0.14.49", - "esbuild-freebsd-64": "0.14.49", - "esbuild-freebsd-arm64": "0.14.49", - "esbuild-linux-32": "0.14.49", - "esbuild-linux-64": "0.14.49", - "esbuild-linux-arm": "0.14.49", - "esbuild-linux-arm64": "0.14.49", - "esbuild-linux-mips64le": "0.14.49", - "esbuild-linux-ppc64le": "0.14.49", - "esbuild-linux-riscv64": "0.14.49", - "esbuild-linux-s390x": "0.14.49", - "esbuild-netbsd-64": "0.14.49", - "esbuild-openbsd-64": "0.14.49", - "esbuild-sunos-64": "0.14.49", - "esbuild-windows-32": "0.14.49", - "esbuild-windows-64": "0.14.49", - "esbuild-windows-arm64": "0.14.49" } }, - "node_modules/esbuild-darwin-arm64": { + "node_modules/esbuild/node_modules/esbuild-windows-arm64": { "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" @@ -4338,8 +4979,9 @@ } }, "node_modules/rollup": { - "version": "2.77.0", - "license": "MIT", + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", "bin": { "rollup": "dist/bin/rollup" }, @@ -4852,15 +5494,15 @@ } }, "node_modules/vite": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.4.tgz", - "integrity": "sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.2.tgz", + "integrity": "sha512-wTDKPkiVbeT+drTPdkuvjVIC/2vKKUc1w3qNOuwgpyvPCZF6fvdxB5v5WEcCsqaYea0zrwA4+XialJKCHM3oVQ==", "dev": true, "dependencies": { - "esbuild": "^0.14.47", - "postcss": "^8.4.14", + "esbuild": "^0.15.6", + "postcss": "^8.4.16", "resolve": "^1.22.1", - "rollup": "^2.75.6" + "rollup": "~2.78.0" }, "bin": { "vite": "bin/vite.js" @@ -5000,8 +5642,63 @@ "node": ">= 8" } }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.8.tgz", + "integrity": "sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.8", + "@esbuild/linux-loong64": "0.15.8", + "esbuild-android-64": "0.15.8", + "esbuild-android-arm64": "0.15.8", + "esbuild-darwin-64": "0.15.8", + "esbuild-darwin-arm64": "0.15.8", + "esbuild-freebsd-64": "0.15.8", + "esbuild-freebsd-arm64": "0.15.8", + "esbuild-linux-32": "0.15.8", + "esbuild-linux-64": "0.15.8", + "esbuild-linux-arm": "0.15.8", + "esbuild-linux-arm64": "0.15.8", + "esbuild-linux-mips64le": "0.15.8", + "esbuild-linux-ppc64le": "0.15.8", + "esbuild-linux-riscv64": "0.15.8", + "esbuild-linux-s390x": "0.15.8", + "esbuild-netbsd-64": "0.15.8", + "esbuild-openbsd-64": "0.15.8", + "esbuild-sunos-64": "0.15.8", + "esbuild-windows-32": "0.15.8", + "esbuild-windows-64": "0.15.8", + "esbuild-windows-arm64": "0.15.8" + } + }, + "node_modules/vite/node_modules/esbuild-darwin-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.8.tgz", + "integrity": "sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/postcss": { - "version": "8.4.14", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "dev": true, "funding": [ { @@ -5013,7 +5710,6 @@ "url": "https://tidelift.com/funding/github/npm/postcss" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -6463,6 +7159,23 @@ "to-fast-properties": "^2.0.0" } }, + "@esbuild/android-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", + "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", + "dev": true, + "optional": true, + "requires": { + "esbuild-wasm": "0.15.8" + } + }, + "@esbuild/linux-loong64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", + "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", + "dev": true, + "optional": true + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "dev": true, @@ -6964,7 +7677,9 @@ "integrity": "sha512-tphsYj61E6nPt5Cnw70IKlmy2IGjvFeYiy3eanCP2IkCJneytJW6vSNbefjq+T0cv8gU8vf5rjFcVlMF8vkAYA==" }, "bridge-js-runtime": { - "version": "0.3.4", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/bridge-js-runtime/-/bridge-js-runtime-0.3.7.tgz", + "integrity": "sha512-ACJYg3grVdtkQRERcTNOojTydwOsYf4354g6H5MW6lnO/WM+hQCdOxVOW02ciaXpRvE5R0t3xCVh1KBQ1PWYdg==", "requires": { "@swc/wasm-web": "^1.2.218", "json5": "^2.2.1", @@ -7160,13 +7875,13 @@ "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "dash-compiler": { - "version": "0.9.29", - "resolved": "https://registry.npmjs.org/dash-compiler/-/dash-compiler-0.9.29.tgz", - "integrity": "sha512-BxDcF7MtTWAginxD5UO5PBs4BZQIOpkIxJ4sztM8sL3vjdv3FH/maKndqjhVGc+bXW44rOYpnu6U64iGXzmmFg==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/dash-compiler/-/dash-compiler-0.10.5.tgz", + "integrity": "sha512-WXL/Nng2CQ9b2kzvJoydoK4BhjyR2Fj1x8xYAxDtDCLk0JZ2IlR+j+Sm1vMFm1ADQWhhHErj4ENSST+iyw2l8w==", "requires": { "@swc/wasm-web": "^1.2.218", "bridge-common-utils": "^0.3.0", - "bridge-js-runtime": "^0.3.4", + "bridge-js-runtime": "^0.3.7", "is-glob": "^4.0.3", "json5": "^2.2.0", "mc-project-core": "^0.3.21", @@ -7274,12 +7989,271 @@ "esbuild-windows-32": "0.14.49", "esbuild-windows-64": "0.14.49", "esbuild-windows-arm64": "0.14.49" + }, + "dependencies": { + "esbuild-android-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", + "optional": true + }, + "esbuild-windows-32": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", + "optional": true + } } }, + "esbuild-android-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.8.tgz", + "integrity": "sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==", + "dev": true, + "optional": true, + "requires": { + "esbuild-wasm": "0.15.8" + } + }, + "esbuild-android-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.8.tgz", + "integrity": "sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.8.tgz", + "integrity": "sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==", + "dev": true, + "optional": true + }, "esbuild-darwin-arm64": { "version": "0.14.49", "optional": true }, + "esbuild-freebsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.8.tgz", + "integrity": "sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.8.tgz", + "integrity": "sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.8.tgz", + "integrity": "sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.8.tgz", + "integrity": "sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.8.tgz", + "integrity": "sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.8.tgz", + "integrity": "sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.8.tgz", + "integrity": "sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.8.tgz", + "integrity": "sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.8.tgz", + "integrity": "sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.8.tgz", + "integrity": "sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.8.tgz", + "integrity": "sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.8.tgz", + "integrity": "sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.8.tgz", + "integrity": "sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.8.tgz", + "integrity": "sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.8.tgz", + "integrity": "sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.8.tgz", + "integrity": "sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.8.tgz", + "integrity": "sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "dev": true @@ -8060,7 +9034,9 @@ "dev": true }, "rollup": { - "version": "2.77.0", + "version": "2.78.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", + "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", "requires": { "fsevents": "~2.3.2" } @@ -8369,20 +9345,59 @@ "version": "8.3.2" }, "vite": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.4.tgz", - "integrity": "sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.2.tgz", + "integrity": "sha512-wTDKPkiVbeT+drTPdkuvjVIC/2vKKUc1w3qNOuwgpyvPCZF6fvdxB5v5WEcCsqaYea0zrwA4+XialJKCHM3oVQ==", "dev": true, "requires": { - "esbuild": "^0.14.47", + "esbuild": "^0.15.6", "fsevents": "~2.3.2", - "postcss": "^8.4.14", + "postcss": "^8.4.16", "resolve": "^1.22.1", - "rollup": "^2.75.6" + "rollup": "~2.78.0" }, "dependencies": { + "esbuild": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.8.tgz", + "integrity": "sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.8", + "@esbuild/linux-loong64": "0.15.8", + "esbuild-android-64": "0.15.8", + "esbuild-android-arm64": "0.15.8", + "esbuild-darwin-64": "0.15.8", + "esbuild-darwin-arm64": "0.15.8", + "esbuild-freebsd-64": "0.15.8", + "esbuild-freebsd-arm64": "0.15.8", + "esbuild-linux-32": "0.15.8", + "esbuild-linux-64": "0.15.8", + "esbuild-linux-arm": "0.15.8", + "esbuild-linux-arm64": "0.15.8", + "esbuild-linux-mips64le": "0.15.8", + "esbuild-linux-ppc64le": "0.15.8", + "esbuild-linux-riscv64": "0.15.8", + "esbuild-linux-s390x": "0.15.8", + "esbuild-netbsd-64": "0.15.8", + "esbuild-openbsd-64": "0.15.8", + "esbuild-sunos-64": "0.15.8", + "esbuild-windows-32": "0.15.8", + "esbuild-windows-64": "0.15.8", + "esbuild-windows-arm64": "0.15.8" + } + }, + "esbuild-darwin-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.8.tgz", + "integrity": "sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==", + "dev": true, + "optional": true + }, "postcss": { - "version": "8.4.14", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "dev": true, "requires": { "nanoid": "^3.3.4", diff --git a/package.json b/package.json index 261b6913a..9b7a0425d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bridge", - "version": "2.3.3", + "version": "2.3.4", "private": true, "scripts": { "dev": "vite", @@ -16,14 +16,14 @@ "@types/lz-string": "^1.3.34", "bridge-common-utils": "^0.3.3", "bridge-iframe-api": "^0.4.7", - "bridge-js-runtime": "^0.3.4", + "bridge-js-runtime": "^0.3.6", "bridge-model-viewer": "^0.7.7", "buffer": "^6.0.3", "color-convert": "^2.0.1", "comlink": "^4.3.0", "compare-versions": "^3.6.0", "core-js": "^3.6.5", - "dash-compiler": "^0.9.29", + "dash-compiler": "^0.10.5", "escape-string-regexp": "^5.0.0", "fflate": "^0.6.7", "idb-keyval": "^5.1.3", @@ -63,7 +63,7 @@ "prettier": "^2.2.1", "sass": "^1.19.0", "typescript": "^4.4.3", - "vite": "^3.0.4", + "vite": "^3.1.2", "vite-plugin-ejs": "^1.4.3", "vite-plugin-pwa": "^0.12.3", "vite-plugin-vue2": "^2.0.2" diff --git a/public/packages.zip b/public/packages.zip index 2ed9d5d3f..c23966512 100644 Binary files a/public/packages.zip and b/public/packages.zip differ diff --git a/src/App.vue b/src/App.vue index ed3bfce25..b0bb289ef 100644 --- a/src/App.vue +++ b/src/App.vue @@ -194,8 +194,8 @@ export default { return this.settingsState && this.settingsState.appearance && this.settingsState.appearance.font - ? `${this.settingsState.appearance.font} !important` - : 'Roboto !important' + ? `${this.settingsState.appearance.font}, system-ui !important` + : `Roboto, system-ui !important` }, }, methods: { diff --git a/src/components/App/Mobile.ts b/src/components/App/Mobile.ts index 0b29233cf..92cd8a751 100644 --- a/src/components/App/Mobile.ts +++ b/src/components/App/Mobile.ts @@ -22,6 +22,6 @@ export class Mobile { } isCurrentDevice() { - return this.vuetify.breakpoint.mobile + return this.vuetify?.breakpoint?.mobile } } diff --git a/src/components/App/ServiceWorker.ts b/src/components/App/ServiceWorker.ts index 8f74340d3..363fbbbb7 100644 --- a/src/components/App/ServiceWorker.ts +++ b/src/components/App/ServiceWorker.ts @@ -10,7 +10,6 @@ const updateSW = registerSW({ console.log('New content is available; please refresh.') await set('firstStartAfterUpdate', true) - await set('savedAllDataInIdb', false) createNotification({ icon: 'mdi-update', diff --git a/src/components/Compiler/Worker/FileSystem.ts b/src/components/Compiler/Worker/FileSystem.ts index 03b0eb1e7..f0b504f42 100644 --- a/src/components/Compiler/Worker/FileSystem.ts +++ b/src/components/Compiler/Worker/FileSystem.ts @@ -27,6 +27,20 @@ export class DashFileSystem extends FileSystem { async writeFile(path: string, content: string | Uint8Array) { await this.internalFs.writeFile(path, content) } + // async copyFile(from: string, to: string, outputFs = this) { + // const [fromHandle, toHandle] = await Promise.all([ + // this.internalFs.getFileHandle(from), + // outputFs.internalFs.getFileHandle(to, true), + // ]) + + // const [writable, fromFile] = await Promise.all([ + // toHandle.createWritable({ keepExistingData: true }), + // fromHandle.getFile(), + // ]) + + // await writable.write(fromFile) + // await writable.close() + // } mkdir(path: string) { return this.internalFs.mkdir(path) diff --git a/src/components/Compiler/Worker/Service.ts b/src/components/Compiler/Worker/Service.ts index 974628d5f..bccbf89a3 100644 --- a/src/components/Compiler/Worker/Service.ts +++ b/src/components/Compiler/Worker/Service.ts @@ -2,6 +2,9 @@ globalThis.process = { cwd: () => '', env: {}, + release: { + name: 'browser', + }, } import '/@/components/FileSystem/Virtual/Comlink' @@ -37,7 +40,7 @@ const consoles = new Map() export class DashService extends EventDispatcher { protected fileSystem: DashFileSystem public fileType: FileTypeLibrary - protected dash: Dash + protected readonly dash: Dash public isDashFree = new Mutex() protected projectDir: string public isSetup = false @@ -72,6 +75,7 @@ export class DashService extends EventDispatcher { mode: options.mode, fileType: this.fileType, packType: new PackTypeLibrary(), + verbose: true, requestJsonData: (path) => dataLoader.readJSON(path), }) diff --git a/src/components/Data/DataLoader.ts b/src/components/Data/DataLoader.ts index b75224ec9..0c6cb2b89 100644 --- a/src/components/Data/DataLoader.ts +++ b/src/components/Data/DataLoader.ts @@ -7,6 +7,8 @@ import { zipSize } from '/@/utils/app/dataPackage' import { whenIdle } from '/@/utils/whenIdle' import { get, set } from 'idb-keyval' import { IDBWrapper } from '/@/components/FileSystem/Virtual/IDB' +import { compareVersions } from 'bridge-common-utils' +import { version as appVersion } from '/@/utils/app/version' export class DataLoader extends FileSystem { _virtualFileSystem?: VirtualDirectoryHandle @@ -29,19 +31,22 @@ export class DataLoader extends FileSystem { return } - let savedAllDataInIdb = await get( - 'savedAllDataInIdb' + let savedDataForVersion = await get( + 'savedDataForVersion' ) if (forceDataDownload) { - savedAllDataInIdb = false - await set('savedAllDataInIdb', false) + savedDataForVersion = undefined + await set('savedDataForVersion', undefined) } + const savedAllDataInIdb = savedDataForVersion + ? compareVersions(appVersion, savedDataForVersion, '=') + : false if (this.isMainLoader) console.log( savedAllDataInIdb ? '[APP] Data saved; restoring from cache...' - : '[APP] Data not saved; fetching now...' + : `[APP] Latest data not saved; fetching now...` ) console.time('[App] Data') @@ -115,7 +120,7 @@ export class DataLoader extends FileSystem { if (this.isMainLoader && !forceDataDownload) { whenIdle(async () => { await this._virtualFileSystem!.moveToIdb() - await set('savedAllDataInIdb', true) + await set('savedDataForVersion', appVersion) }) } } diff --git a/src/components/Data/RequiresMatcher/RequiresMatcher.ts b/src/components/Data/RequiresMatcher/RequiresMatcher.ts index 370ad404b..1128f1457 100644 --- a/src/components/Data/RequiresMatcher/RequiresMatcher.ts +++ b/src/components/Data/RequiresMatcher/RequiresMatcher.ts @@ -67,10 +67,11 @@ export class RequiresMatcher { const config = this.app.project.config.get() this.experimentalGameplay = config.experimentalGameplay ?? {} + + this.latestFormatVersion = latestFormatVersion this.projectTargetVersion = config.targetVersion ?? this.latestFormatVersion - this.latestFormatVersion = latestFormatVersion this.bpManifest = bpManifest this.isSetup = true } @@ -125,19 +126,33 @@ export class RequiresMatcher { const dependencies: string[] | undefined = this.bpManifest?.dependencies?.map((dep: any) => { if (dep?.module_name) { - return dep.module_name + // Convert old module names to new naming convention + switch (dep.module_name) { + case 'mojang-minecraft': + return '@minecraft/server' + case 'mojang-gametest': + return '@minecraft/server-gametest' + case 'mojang-minecraft-server-ui': + return '@minecraft/server-ui' + case 'mojang-minecraft-server-admin': + return '@minecraft/server-admin' + case 'mojang-net': + return '@minecraft/server-net' + default: + return dep.module_name + } } else { switch (dep.uuid ?? '') { case 'b26a4d4c-afdf-4690-88f8-931846312678': - return 'mojang-minecraft' + return '@minecraft/server' case '6f4b6893-1bb6-42fd-b458-7fa3d0c89616': - return 'mojang-gametest' + return '@minecraft/server-gametest' case '2bd50a27-ab5f-4f40-a596-3641627c635e': - return 'mojang-minecraft-ui' + return '@minecraft/server-ui' case '53d7f2bf-bf9c-49c4-ad1f-7c803d947920': - return 'mojang-minecraft-server-admin' + return '@minecraft/server-admin' case '777b1798-13a6-401c-9cba-0cf17e31a81b': - return 'mojang-net' + return '@minecraft/server-net' default: return '' } diff --git a/src/components/Developer/Actions.ts b/src/components/Developer/Actions.ts index 04dfd49d0..91b3c8cc7 100644 --- a/src/components/Developer/Actions.ts +++ b/src/components/Developer/Actions.ts @@ -41,7 +41,7 @@ const devActionConfigs: IActionConfig[] = [ name: '[Dev: Clear app data]', description: '[Clear data from bridge-core/editor-packages repository]', onTrigger: async () => { - await set('savedAllDataInIdb', false) + await del('savedDataForVersion') }, }, { diff --git a/src/components/Editors/IframeTab/API/IframeApi.ts b/src/components/Editors/IframeTab/API/IframeApi.ts index 3f5e36932..d3e4268f4 100644 --- a/src/components/Editors/IframeTab/API/IframeApi.ts +++ b/src/components/Editors/IframeTab/API/IframeApi.ts @@ -12,6 +12,7 @@ import { ReadTextFileRequest } from './Requests/FileSystem/ReadTextFile' import { IframeTab } from '../IframeTab' import { OpenFileEvent } from './Events/Tab/OpenFile' import { openedFileReferenceName } from './Requests/FileSystem/ResolveFileReference' +import { GetItemPreviewRequest } from './Requests/Project/GetItemPreview' export class IframeApi { didSetup = false @@ -24,9 +25,13 @@ export class IframeApi { new OpenFileEvent(this), ] protected requests: GenericRequest[] = [ + // FileSystem new ReadFileRequest(this), new ReadTextFileRequest(this), new WriteFileRequest(this), + + // Project + new GetItemPreviewRequest(this), ] constructor(protected tab: IframeTab, protected iframe: HTMLIFrameElement) { diff --git a/src/components/Editors/IframeTab/API/Requests/Project/GetItemPreview.ts b/src/components/Editors/IframeTab/API/Requests/Project/GetItemPreview.ts new file mode 100644 index 000000000..67c95c07f --- /dev/null +++ b/src/components/Editors/IframeTab/API/Requests/Project/GetItemPreview.ts @@ -0,0 +1,100 @@ +import { IframeApi } from '../../IframeApi' +import { GenericRequest } from '../GenericRequest' +import { findFileExtension } from '/@/components/FileSystem/FindFile' + +export class GetItemPreviewRequest extends GenericRequest< + string, + string | null +> { + constructor(api: IframeApi) { + super('project.getItemPreview', api) + } + + async handle(identifier: string, origin: string) { + const app = this.api.app + const project = app.project + const packIndexer = project.packIndexer + const fs = app.fileSystem + await packIndexer.fired + + const [identifierReference] = await packIndexer.service.find( + 'item', + 'identifier', + [identifier], + false + ) + + // Read item behavior file + const itemBehaviorFile = await fs + .readJSON(identifierReference) + .catch(() => null) + if (itemBehaviorFile === null) return null + + // Get 'minecraft:icon' component from item behavior + const iconComponent = + itemBehaviorFile['minecraft:item']?.components?.[ + 'minecraft:icon' + ] ?? null + if (iconComponent === null) return null + + // Get current texture name from icon component + const iconTextureName = iconComponent.texture ?? null + if (iconTextureName === null) return null + + // Lookup texture name within item_texture.json file + const itemTextureFile = await fs + .readJSON( + project.config.resolvePackPath( + 'resourcePack', + 'textures/item_texture.json' + ) + ) + .catch(() => null) + if (itemTextureFile === null || !itemTextureFile.texture_data) + return null + + const iconTextureDataObj = + itemTextureFile.texture_data[iconTextureName] ?? null + if (iconTextureDataObj === null) return null + + // Load icon texture path from icon texture data object ({ textures: '...' }, { textures: ['...'] } or '...') + let iconTexturePath = null + if (typeof iconTextureDataObj === 'string') + iconTexturePath = iconTextureDataObj + else if ( + typeof iconTextureDataObj === 'object' && + typeof iconTextureDataObj.textures === 'string' + ) + iconTexturePath = iconTextureDataObj.textures + else if ( + typeof iconTextureDataObj === 'object' && + Array.isArray(iconTextureDataObj.textures) + ) + iconTexturePath = iconTextureDataObj.textures[0] ?? null + + if (iconTexturePath === null) return null + + // Find icon texture file extension + const absolutePathWithoutExt = project.config.resolvePackPath( + 'resourcePack', + iconTexturePath + ) + console.log(absolutePathWithoutExt) + + const absolutePath = await findFileExtension( + fs, + absolutePathWithoutExt, + ['.png', '.jpg', '.jpeg', '.tga'] + ) + console.log(absolutePath) + if (absolutePath === undefined) return null + + // Load file handle as data url + const imageHandle = await fs + .getFileHandle(absolutePath) + .catch(() => null) + if (imageHandle === null) return null + + return await fs.loadFileHandleAsDataUrl(imageHandle) + } +} diff --git a/src/components/Editors/Text/TextTab.ts b/src/components/Editors/Text/TextTab.ts index 8fb10566f..3f372ee0b 100644 --- a/src/components/Editors/Text/TextTab.ts +++ b/src/components/Editors/Text/TextTab.ts @@ -14,9 +14,6 @@ import { wait } from '/@/utils/wait' const throttledCacheUpdate = debounce<(tab: TextTab) => Promise | void>( async (tab) => { - // Updates the isUnsaved status of the tab - tab.updateUnsavedStatus() - if (!tab.editorModel || tab.editorModel.isDisposed()) return const fileContent = tab.editorModel?.getValue() @@ -78,6 +75,13 @@ export class TextTab extends FileTab { ) } + fileDidChange() { + // Updates the isUnsaved status of the tab + this.updateUnsavedStatus() + + super.fileDidChange() + } + async onActivate() { if (this.isActive) return this.isActive = true @@ -121,6 +125,7 @@ export class TextTab extends FileTab { this.disposables.push( this.editorModel?.onDidChangeContent(() => { throttledCacheUpdate(this) + this.fileDidChange() }) ) this.disposables.push( @@ -131,7 +136,9 @@ export class TextTab extends FileTab { this.editorInstance?.layout() } - onDeactivate() { + async onDeactivate() { + await super.onDeactivate() + // MonacoEditor is defined if (this.tabSystem.hasFired) { const viewState = this.editorInstance.saveViewState() diff --git a/src/components/Editors/TreeEditor/Tab.ts b/src/components/Editors/TreeEditor/Tab.ts index ba60b7da7..ea766da92 100644 --- a/src/components/Editors/TreeEditor/Tab.ts +++ b/src/components/Editors/TreeEditor/Tab.ts @@ -89,10 +89,7 @@ export class TreeTab extends FileTab { await super.setup() } async getFile() { - return new File( - [JSON.stringify(this.treeEditor.toJsonString())], - this.name - ) + return new File([this.treeEditor.toJsonString()], this.name) } updateCache() { @@ -102,7 +99,9 @@ export class TreeTab extends FileTab { async onActivate() { this.treeEditor.activate() } - onDeactivate() { + async onDeactivate() { + await super.onDeactivate() + this._treeEditor?.deactivate() } diff --git a/src/components/Editors/TreeEditor/TreeEditor.ts b/src/components/Editors/TreeEditor/TreeEditor.ts index 190ab7a37..12b9c604b 100644 --- a/src/components/Editors/TreeEditor/TreeEditor.ts +++ b/src/components/Editors/TreeEditor/TreeEditor.ts @@ -73,6 +73,7 @@ export class TreeEditor { this.valueSuggestions = [] this.parent.updateCache() + this.parent.fileDidChange() }) App.getApp().then(async (app) => { diff --git a/src/components/Extensions/Extension.ts b/src/components/Extensions/Extension.ts index 0560f04f0..38cfcc1ea 100644 --- a/src/components/Extensions/Extension.ts +++ b/src/components/Extensions/Extension.ts @@ -27,9 +27,7 @@ export class Extension { protected isLoaded = false protected installFiles: InstallFiles protected hasPresets = false - public jsRuntime = new JsRuntime( - createEnv(this.id, this.disposables, this.uiStore, this.isGlobal) - ) + public jsRuntime: JsRuntime get isActive() { if (!this.parent.activeStatus) @@ -72,6 +70,10 @@ export class Extension { this.fileSystem, _manifest?.contributeFiles ?? {} ) + + this.jsRuntime = new JsRuntime( + createEnv(this.id, this.disposables, this.uiStore, this.isGlobal) + ) } isCompatibleAppEnv() { diff --git a/src/components/Extensions/InstallFiles.ts b/src/components/Extensions/InstallFiles.ts index f682b553d..0be0735b0 100644 --- a/src/components/Extensions/InstallFiles.ts +++ b/src/components/Extensions/InstallFiles.ts @@ -1,7 +1,7 @@ import { TPackTypeId } from '../Data/PackType' import { App } from '/@/App' import { FileSystem } from '/@/components/FileSystem/FileSystem' -import { iterateDir } from '/@/utils/iterateDir' +import { iterateDir, iterateDirParallel } from '/@/utils/iterateDir' import { join } from '/@/utils/path' export class InstallFiles { @@ -18,6 +18,8 @@ export class InstallFiles { await app.projectManager.projectReady.fired + const promises = [] + for (const [from, to] of Object.entries(this.contributeFiles)) { const projects = isGlobal ? app.projects : [app.project] @@ -30,32 +32,42 @@ export class InstallFiles { to.pack, to.path ) - await app.fileSystem.writeFile( - target, - await file.arrayBuffer() + promises.push( + app.fileSystem.writeFile( + target, + await file.arrayBuffer() + ) ) } } else if (await this.fileSystem.directoryExists(from)) { // Handle directory contributions - await iterateDir( - await this.fileSystem.getDirectoryHandle(from), - async (fileHandle, filePath) => { - for (const project of projects) { - const target = project.config.resolvePackPath( - to.pack, - to.path - ) - const newFileHandle = - await app.fileSystem.getFileHandle( - join(target, filePath), - true + promises.push( + iterateDirParallel( + await this.fileSystem.getDirectoryHandle(from), + async (fileHandle, filePath) => { + const copyPromises = [] + + for (const project of projects) { + const target = project.config.resolvePackPath( + to.pack, + to.path + ) + const newFileHandle = + await app.fileSystem.getFileHandle( + join(target, filePath), + true + ) + copyPromises.push( + app.fileSystem.copyFileHandle( + fileHandle, + newFileHandle + ) ) - await app.fileSystem.copyFileHandle( - fileHandle, - newFileHandle - ) + } + + await Promise.all(copyPromises) } - } + ) ) } else { console.warn( @@ -65,6 +77,8 @@ export class InstallFiles { } } + await Promise.all(promises) + // Refresh the pack explorer once files have been added app.actionManager.trigger('bridge.action.refreshProject') } diff --git a/src/components/Extensions/Scripts/JsRuntime.ts b/src/components/Extensions/Scripts/JsRuntime.ts index 06744669a..81aae2753 100644 --- a/src/components/Extensions/Scripts/JsRuntime.ts +++ b/src/components/Extensions/Scripts/JsRuntime.ts @@ -16,7 +16,7 @@ export class JsRuntime extends Runtime { return super.run( filePath, Object.assign(env, { - require: (x: string) => this.require(x, dirname(filePath)), + require: (x: string) => this.require(x, dirname(filePath), env), }), fileContent ) diff --git a/src/components/Extensions/Scripts/Modules/env.ts b/src/components/Extensions/Scripts/Modules/env.ts index a53d45992..ccd49e8b7 100644 --- a/src/components/Extensions/Scripts/Modules/env.ts +++ b/src/components/Extensions/Scripts/Modules/env.ts @@ -29,8 +29,8 @@ export const ENVModule = ({}: IModuleConfig) => ({ getProjectTargetVersion() { return App.getApp().then((app) => app.projectConfig.get().targetVersion) }, - getProjectAuthor() { - return App.getApp().then((app) => app.projectConfig.get().author) + getProjectAuthors() { + return App.getApp().then((app) => app.projectConfig.get().authors) }, resolvePackPath(packId?: TPackTypeId, filePath?: string) { return App.getApp().then((app) => diff --git a/src/components/Extensions/Scripts/Modules/ui.ts b/src/components/Extensions/Scripts/Modules/ui.ts index 837a75b71..a977b120c 100644 --- a/src/components/Extensions/Scripts/Modules/ui.ts +++ b/src/components/Extensions/Scripts/Modules/ui.ts @@ -4,12 +4,16 @@ import SidebarWindow from '/@/components/Windows/Layout/SidebarWindow.vue' import DirectoryViewer from '/@/components/UIElements/DirectoryViewer/DirectoryViewer.vue' import BridgeSheet from '/@/components/UIElements/Sheet.vue' -export const UIModule = ({ uiStore }: IModuleConfig) => ({ - ...uiStore?.UI, - BuiltIn: { - BaseWindow, - SidebarWindow, - DirectoryViewer, - BridgeSheet, - }, -}) +export const UIModule = async ({ uiStore }: IModuleConfig) => { + await uiStore?.allLoaded.fired + + return { + ...uiStore?.UI, + BuiltIn: { + BaseWindow, + SidebarWindow, + DirectoryViewer, + BridgeSheet, + }, + } +} diff --git a/src/components/Extensions/Themes/ThemeManager.ts b/src/components/Extensions/Themes/ThemeManager.ts index b89e327e6..e3b5fbf7a 100644 --- a/src/components/Extensions/Themes/ThemeManager.ts +++ b/src/components/Extensions/Themes/ThemeManager.ts @@ -2,13 +2,11 @@ import { EventDispatcher } from '/@/components/Common/Event/EventDispatcher' import { Signal } from '/@/components/Common/Event/Signal' import { App } from '/@/App' import { settingsState } from '/@/components/Windows/Settings/SettingsState' -import { iterateDir } from '/@/utils/iterateDir' import { IDisposable } from '/@/types/disposable' import json5 from 'json5' import { deepMerge } from 'bridge-common-utils' import { bridgeDark, bridgeLight } from './Default' import { Theme } from './Theme' -import { VirtualFileHandle } from '../../FileSystem/Virtual/FileHandle' import { AnyFileHandle } from '../../FileSystem/Types' const colorNames = [ diff --git a/src/components/Extensions/UI/load.ts b/src/components/Extensions/UI/load.ts index 08773b0e0..5ee0f3589 100644 --- a/src/components/Extensions/UI/load.ts +++ b/src/components/Extensions/UI/load.ts @@ -56,6 +56,8 @@ export async function loadUIComponents( undefined, 'ui' ) + + uiStore.allLoaded.dispatch() } export async function loadUIComponent( diff --git a/src/components/Extensions/UI/store.ts b/src/components/Extensions/UI/store.ts index e6a7965d5..921bbb3a1 100644 --- a/src/components/Extensions/UI/store.ts +++ b/src/components/Extensions/UI/store.ts @@ -1,4 +1,5 @@ import { v4 as uuid } from 'uuid' +import { Signal } from '../../Common/Event/Signal' import { basename, extname } from '/@/utils/path' export type TUIStore = ReturnType @@ -10,6 +11,7 @@ export function createUIStore() { get UI() { return UI }, + allLoaded: new Signal(), set(path: string[], component: () => Promise) { let current = UI diff --git a/src/components/FileSystem/FileSystem.ts b/src/components/FileSystem/FileSystem.ts index 999f16a93..468fff912 100644 --- a/src/components/FileSystem/FileSystem.ts +++ b/src/components/FileSystem/FileSystem.ts @@ -136,6 +136,7 @@ export class FileSystem extends Signal { dirHandle = await dirHandle const files: { name: string; path: string; kind: string }[] = [] + const promises = [] for await (const handle of dirHandle.values()) { if (handle.kind === 'file' && handle.name === '.DS_Store') continue @@ -146,15 +147,18 @@ export class FileSystem extends Signal { kind: handle.kind, path: `${path}/${handle.name}`, }) - else if (handle.kind === 'directory') - files.push( - ...(await this.readFilesFromDir( + else if (handle.kind === 'directory') { + promises.push( + this.readFilesFromDir( `${path}/${handle.name}`, handle - )) + ).then((subFiles) => files.push(...subFiles)) ) + } } + await Promise.allSettled(promises) + return files } diff --git a/src/components/FindAndReplace/Worker/Worker.ts b/src/components/FindAndReplace/Worker/Worker.ts index 0ea0aae4a..d63f602b8 100644 --- a/src/components/FindAndReplace/Worker/Worker.ts +++ b/src/components/FindAndReplace/Worker/Worker.ts @@ -2,6 +2,9 @@ globalThis.process = { cwd: () => '', env: {}, + release: { + name: 'browser', + }, } import '/@/components/FileSystem/Virtual/Comlink' diff --git a/src/components/ImportFile/BBModel.ts b/src/components/ImportFile/BBModel.ts index b4c36da66..455cf2ed7 100644 --- a/src/components/ImportFile/BBModel.ts +++ b/src/components/ImportFile/BBModel.ts @@ -4,7 +4,6 @@ import { FileDropper } from '/@/components/FileDropper/FileDropper' import { AnyFileHandle } from '/@/components/FileSystem/Types' import { ConfirmationWindow } from '/@/components/Windows/Common/Confirm/ConfirmWindow' import { extname, join } from '/@/utils/path' -import json5 from 'json5' import { DropdownWindow } from '../Windows/Common/Dropdown/DropdownWindow' import { clamp } from '/@/utils/math/clamp' @@ -74,13 +73,24 @@ export class BBModelImporter extends FileImporter { const app = await App.getApp() const file = await fileHandle.getFile() - const data = json5.parse(await file.text()) + const data = JSON.parse(await file.text()) app.windows.loadingWindow.open() - if (data.textures) await this.exportImages(app, data.textures) - if (data.elements && data.outliner) await this.exportModel(app, data) - if (data.animations) await this.exportAnimations(app, data.animations, data.name) + const promises = [] + + if (data.textures) promises.push(this.exportImages(app, data.textures)) + if (data.elements && data.outliner) + promises.push(this.exportModel(app, data)) + if (data.animations) + promises.push( + this.exportAnimations(app, data.animations, data.name) + ) + + if (promises.length > 0) { + await Promise.allSettled(promises) + App.eventSystem.dispatch('fileAdded', undefined) + } app.windows.loadingWindow.close() } @@ -143,9 +153,8 @@ export class BBModelImporter extends FileImporter { filePath, imageData ) - App.eventSystem.dispatch('fileAdded', undefined) - await app.project.updateFile(app.project.absolutePath(filePath)) + app.project.updateFile(app.project.absolutePath(filePath)) await app.project.openFile(destHandle, { isTemporary: false }) } } @@ -153,7 +162,7 @@ export class BBModelImporter extends FileImporter { async exportModel(app: App, data: any) { const entityModel = { description: { - identifier: 'geometry.' + (data.geometry_name || 'unknown'), + identifier: 'geometry.' + (data.model_identifier || 'unknown'), texture_width: data.resolution.width || 16, texture_height: data.resolution.height || 16, visible_bounds_width: data.visible_box?.[0] ?? 0, @@ -191,9 +200,8 @@ export class BBModelImporter extends FileImporter { ) await app.project.fileSystem.writeJSON(filePath, entityFile, true) - App.eventSystem.dispatch('fileAdded', undefined) - await app.project.updateFile(app.project.absolutePath(filePath)) + app.project.updateFile(app.project.absolutePath(filePath)) await app.project.openFile(destHandle, { isTemporary: false }) } @@ -588,9 +596,8 @@ export class BBModelImporter extends FileImporter { ) await app.project.fileSystem.writeJSON(filePath, animationFile, true) - App.eventSystem.dispatch('fileAdded', undefined) - await app.project.updateFile(app.project.absolutePath(filePath)) + app.project.updateFile(app.project.absolutePath(filePath)) await app.project.openFile(destHandle, { isTemporary: false }) } diff --git a/src/components/Languages/Mcfunction/Validator.ts b/src/components/Languages/Mcfunction/Validator.ts index 9d5c83fce..91c0282c7 100644 --- a/src/components/Languages/Mcfunction/Validator.ts +++ b/src/components/Languages/Mcfunction/Validator.ts @@ -30,6 +30,7 @@ export class CommandValidator { passed: boolean argumentsConsumedCount?: number warnings: editor.IMarkerData[] + diagnostics: editor.IMarkerData[] }> { const { MarkerSeverity } = await useMonaco() @@ -43,15 +44,18 @@ export class CommandValidator { return { passed: false, warnings: [], + diagnostics: [], } let passedSubcommandDefinition let warnings: editor.IMarkerData[] = [] + let diagnostics: editor.IMarkerData[] = [] // Loop over every subcommand definition to check for a matching one for (const definition of subcommandDefinitions) { - let definitionWarnings = [] + let definitionDiagnostics: editor.IMarkerData[] = [] + let definitionWarnings: editor.IMarkerData[] = [] let failed = false @@ -78,12 +82,28 @@ export class CommandValidator { argumentType = 'none' // Fail if type does not match - if (argumentType != 'full') { + if ( + argumentType != 'full' && + (targetArgument.type != 'selector' || + !this.parsePlayerName(argument)) + ) { failed = true break } + // Validate selector but don't completely fail if selector fail so rest of command can validate as well + if (targetArgument.type == 'selector') { + const result = await this.parseSelector(argument) + + if (result.diagnostic) + definitionDiagnostics.push(result.diagnostic) + + definitionWarnings = definitionWarnings.concat( + result.warnings + ) + } + if (targetArgument.additionalData) { // Fail if there are additional values that are not met if ( @@ -138,6 +158,7 @@ export class CommandValidator { ) { passedSubcommandDefinition = definition warnings = definitionWarnings + diagnostics = definitionDiagnostics } } @@ -145,6 +166,7 @@ export class CommandValidator { return { passed: false, warnings: [], + diagnostics: [], } } else { return { @@ -152,6 +174,7 @@ export class CommandValidator { argumentsConsumedCount: passedSubcommandDefinition.arguments.length, warnings, + diagnostics, } } } @@ -168,10 +191,14 @@ export class CommandValidator { for (const piece of pieces) { const scoreName = piece.split('=')[0] - const scoreValue = piece.split('=').slice(1).join('=') + let scoreValue = piece.split('=').slice(1).join('=') if (!scoreValue) return false + //Value is negated so remove negation + if (scoreValue.startsWith('!')) + scoreValue = scoreValue.substring(1, scoreValue.length) + let argumentType = await this.commandData.isArgumentType( scoreValue, { @@ -231,6 +258,18 @@ export class CommandValidator { return true } + protected parsePlayerName(token: { + startColumn: number + endColumn: number + word: string + }) { + if (!token.word.startsWith('@')) { + if (!/[a-zA-Z_0-9]{3,16}/.test(token.word)) return false + } + + return true + } + protected async parseSelector(selectorToken: { startColumn: number endColumn: number @@ -244,6 +283,13 @@ export class CommandValidator { let warnings: editor.IMarkerData[] = [] + if (this.parsePlayerName(selectorToken)) { + return { + passed: true, + warnings, + } + } + let baseSelector = selectorToken.word.substring(0, 2) // Check for base selector, we later check @i to be @initiator @@ -517,7 +563,6 @@ export class CommandValidator { ) argumentType = 'full' - // Fail if type does not match, NOTE: Should check scoredata in future when implemented if (argumentType != 'full') { return { passed: false, @@ -627,25 +672,13 @@ export class CommandValidator { for (let i = 0; i < tokens.length; i++) { if (tokens[i - 1]) { // if we get a case where tokens are like "property", :"value" then we combine them + // or if we get a case where tokens are like ["state":"a","state":"b" then we combine them + // or if we get a case where tokens are like @e[name="Test"] then we combine them if ( - tokens[i].word.startsWith(':') && - tokens[i - 1].word[tokens[i - 1].word.length - 1] == '"' - ) { - tokens.splice(i - 1, 2, { - startColumn: tokens[i - 1].startColumn, - endColumn: tokens[i].endColumn, - word: tokens[i - 1].word + tokens[i].word, - }) - - i-- - - continue - } - - // if we get a case where tokens are like ["state":"a","state":"b" then we combine them - if ( - tokens[i].word.startsWith(',') && - tokens[i - 1].word[tokens[i - 1].word.length - 1] == '"' + (tokens[i].word.startsWith(':') || + tokens[i].word.startsWith(',') || + tokens[i].word.startsWith(']')) && + tokens[i - 1].word.endsWith('"') ) { tokens.splice(i - 1, 2, { startColumn: tokens[i - 1].startColumn, @@ -660,9 +693,9 @@ export class CommandValidator { // add the beginning and ending of a json data or scoreData together if ( - (tokens[i].word == '}' && + (tokens[i].word.startsWith('}') && tokens[i - 1].word.startsWith('{')) || - (tokens[i].word == ']' && + (tokens[i].word.startsWith(']') && tokens[i - 1].word.startsWith('[')) ) { tokens.splice(i - 1, 2, { @@ -720,9 +753,6 @@ export class CommandValidator { return diagnostics } - // If this is a say command we ignore validating arguments since they are all strings - if (commandName.word == 'say') return diagnostics.concat(warnings) - let definitions = await this.commandData.getCommandDefinitions( commandName.word, false @@ -791,11 +821,15 @@ export class CommandValidator { tokens.slice(k, tokens.length) ) - definitionWarnings = definitionWarnings.concat( - result.warnings + definitionDiagnostics = definitionDiagnostics.concat( + result.diagnostics ) if (result.passed) { + definitionWarnings = definitionWarnings.concat( + result.warnings + ) + // Skip over tokens consumed in the subcommand validation k += result.argumentsConsumedCount! @@ -805,10 +839,12 @@ export class CommandValidator { passed: boolean argumentsConsumedCount?: number warnings: editor.IMarkerData[] + diagnostics: editor.IMarkerData[] } = { passed: true, argumentsConsumedCount: 0, warnings: [], + diagnostics: [], } while (nextResult.passed) { @@ -817,6 +853,11 @@ export class CommandValidator { tokens.slice(k + 1, tokens.length) ) + definitionDiagnostics = + definitionDiagnostics.concat( + nextResult.diagnostics + ) + if (nextResult.passed) { definitionWarnings = definitionWarnings.concat( @@ -886,7 +927,11 @@ export class CommandValidator { argumentType = 'none' // Fail if type does not match - if (argumentType != 'full') { + if ( + argumentType != 'full' && + (targetArgument.type != 'selector' || + !this.parsePlayerName(argument)) + ) { definitions.splice(j, 1) j-- @@ -978,6 +1023,9 @@ export class CommandValidator { } } + // Skip back if allow multiple + if (targetArgument.allowMultiple) targetArgumentIndex-- + targetArgumentIndex++ } @@ -989,7 +1037,11 @@ export class CommandValidator { } // Fail if there are not enough tokens to satisfy definition - if (targetArgumentIndex < requiredArgurmentsCount) { + if ( + targetArgumentIndex < requiredArgurmentsCount && + !definitions[j].arguments[targetArgumentIndex].allowMultiple && + targetArgumentIndex < requiredArgurmentsCount - 1 + ) { definitions.splice(j, 1) j-- diff --git a/src/components/Mixins/AppToolbarHeight.ts b/src/components/Mixins/AppToolbarHeight.ts index e3953046a..d4d893aa8 100644 --- a/src/components/Mixins/AppToolbarHeight.ts +++ b/src/components/Mixins/AppToolbarHeight.ts @@ -7,13 +7,13 @@ export const AppToolbarHeightMixin = { computed: { appToolbarHeight() { return `env(titlebar-area-height, ${ - this.$vuetify.breakpoint.mobile ? 32 : 24 + this.$vuetify.breakpoint.mobile ? 0 : 24 }px)` }, appToolbarHeightNumber() { if (this.windowControlsOverlay) return 33 - return this.$vuetify.breakpoint.mobile ? 32 : 24 + return this.$vuetify.breakpoint.mobile ? 0 : 24 }, }, } diff --git a/src/components/OutputFolders/ComMojang/ComMojang.ts b/src/components/OutputFolders/ComMojang/ComMojang.ts index 8decbf999..0bee10300 100644 --- a/src/components/OutputFolders/ComMojang/ComMojang.ts +++ b/src/components/OutputFolders/ComMojang/ComMojang.ts @@ -5,7 +5,6 @@ import { App } from '/@/App' import { Signal } from '/@/components/Common/Event/Signal' import { InformationWindow } from '/@/components/Windows/Common/Information/InformationWindow' import { AnyDirectoryHandle } from '/@/components/FileSystem/Types' -import { Project } from '/@/components/Projects/Project/Project' export const comMojangKey = 'comMojangDirectory' @@ -17,10 +16,14 @@ export class ComMojang extends Signal { public readonly setup = new Signal() protected _hasComMojang = false protected _permissionDenied = false + protected _hasComMojangHandle = false get hasComMojang() { return this._hasComMojang } + get hasComMojangHandle() { + return this._hasComMojangHandle + } get status() { return { hasComMojang: this._hasComMojang, @@ -38,6 +41,8 @@ export class ComMojang extends Signal { comMojangKey ) + this._hasComMojangHandle = directoryHandle !== undefined + if (directoryHandle) { await this.requestPermissions(directoryHandle).catch(async () => { // Permission request failed because user activation was too long ago @@ -88,20 +93,15 @@ export class ComMojang extends Signal { set(comMojangKey, directoryHandle) await this.requestPermissions(directoryHandle) if (this._hasComMojang) this.setup.dispatch() + + this._hasComMojangHandle = true + this.dispatch() } async handleComMojangDrop(directoryHandle: AnyDirectoryHandle) { - const confirmWindow = new ConfirmationWindow({ - description: 'comMojang.folderDropped', - confirmText: 'general.yes', - cancelText: 'general.no', - }) - // User wants to set default com.mojang folder - if (await confirmWindow.fired) { - await this.set(directoryHandle) - await this.app.projectManager.recompileAll() - } + await this.set(directoryHandle) + if (this._hasComMojang) await this.app.projectManager.recompileAll() } async unlink() { diff --git a/src/components/OutputFolders/ComMojang/ProjectLoader.ts b/src/components/OutputFolders/ComMojang/ProjectLoader.ts index b9a8aef6c..435a4d2e9 100644 --- a/src/components/OutputFolders/ComMojang/ProjectLoader.ts +++ b/src/components/OutputFolders/ComMojang/ProjectLoader.ts @@ -1,5 +1,6 @@ import { compareVersions } from 'bridge-common-utils' import { AnyDirectoryHandle } from '../../FileSystem/Types' +import { settingsState } from '../../Windows/Settings/SettingsState' import { App } from '/@/App' import { loadHandleAsDataURL } from '/@/utils/loadAsDataUrl' @@ -33,7 +34,11 @@ export class ComMojangProjectLoader { } async loadProjects() { - if (this.cachedProjects) return this.cachedProjects + if (!(settingsState?.projects?.loadComMojangProjects ?? true)) { + this.clearCache() + return [] + } + if (this.cachedProjects !== null) return this.cachedProjects if ( !this.comMojang.setup.hasFired || diff --git a/src/components/PackExplorer/PackExplorer.ts b/src/components/PackExplorer/PackExplorer.ts index be9a77cd2..4caccc45f 100644 --- a/src/components/PackExplorer/PackExplorer.ts +++ b/src/components/PackExplorer/PackExplorer.ts @@ -98,6 +98,7 @@ export class PackExplorer extends SidebarContent { return packIndexer.service.getFileDiagnostics(filePath) }, onHandleMoved: (opts) => this.onHandleMoved(opts), + onFilesAdded: (filePaths) => this.onFilesAdded(filePaths), }) ) await wrapper.open() @@ -144,6 +145,11 @@ export class PackExplorer extends SidebarContent { await app.project.onMovedFile(fromPath, toPath) else await app.project.onMovedFolder(fromPath, toPath) } + async onFilesAdded(filePaths: string[]) { + const app = await App.getApp() + + await app.project.updateFiles(filePaths) + } onContentRightClick(event: MouseEvent): void { const selectedId = this.selectedAction?.getConfig().id @@ -285,6 +291,8 @@ export class PackExplorer extends SidebarContent { startPath: app.project.projectPath, onHandleMoved: (options) => this.onHandleMoved(options), + onFilesAdded: (filePaths) => + this.onFilesAdded(filePaths), }) }, }, diff --git a/src/components/PackIndexer/Worker/LightningCache/LightningCache.ts b/src/components/PackIndexer/Worker/LightningCache/LightningCache.ts index 17d268c5b..25ab8000f 100644 --- a/src/components/PackIndexer/Worker/LightningCache/LightningCache.ts +++ b/src/components/PackIndexer/Worker/LightningCache/LightningCache.ts @@ -5,7 +5,6 @@ import type { PackIndexerService } from '../Main' import type { LightningStore } from './LightningStore' import { runScript } from './Script' import { basename, extname, join } from '/@/utils/path' -import { iterateDir } from '/@/utils/iterateDir' import { AnyDirectoryHandle, AnyFileHandle, @@ -147,18 +146,22 @@ export class LightningCache { ) => void | Promise, fullPath = '' ) { + const promises = [] + for await (const [fileName, entry] of baseDir.entries()) { const currentFullPath = fullPath.length === 0 ? fileName : `${fullPath}/${fileName}` if (entry.kind === 'directory') { if (this.folderIgnoreList.has(currentFullPath)) continue - await this.iterateDir(entry, callback, currentFullPath) + promises.push(this.iterateDir(entry, callback, currentFullPath)) } else if (fileName[0] !== '.') { this.service.progress.addToTotal(2) - await callback(entry, currentFullPath) + promises.push(callback(entry, currentFullPath)) } } + + await Promise.allSettled(promises) } /** @@ -313,53 +316,50 @@ export class LightningCache { // console.log(instructions) const collectedData: Record = {} - const asyncOnReceiveData = ( - key: string, - filter?: string[], - mapFunc?: string - ) => async (data: any) => { - let readyData: string[] - if (Array.isArray(data)) readyData = data - else if (typeof data === 'object') - readyData = Object.keys(data ?? {}) - else readyData = [data] - - if (filter) readyData = readyData.filter((d) => !filter.includes(d)) - if (mapFunc) { - const ctx = { - config: this.service.config, - fileSystem: this.service.fileSystem, - } + const asyncOnReceiveData = + (key: string, filter?: string[], mapFunc?: string) => + async (data: any) => { + let readyData: string[] + if (Array.isArray(data)) readyData = data + else if (typeof data === 'object') + readyData = Object.keys(data ?? {}) + else readyData = [data] + + if (filter) + readyData = readyData.filter((d) => !filter.includes(d)) + if (mapFunc) { + const ctx = { + config: this.service.config, + fileSystem: this.service.fileSystem, + } - readyData = ( - await Promise.all( - readyData.map((value) => - run({ - async: true, - script: mapFunc, - env: { - ...getCacheScriptEnv(value, ctx), - }, - }) + readyData = ( + await Promise.all( + readyData.map((value) => + run({ + async: true, + script: mapFunc, + env: { + ...getCacheScriptEnv(value, ctx), + }, + }) + ) ) - ) - ).filter((value) => value !== undefined) - } + ).filter((value) => value !== undefined) + } - if (!collectedData[key]) collectedData[key] = readyData - else - collectedData[key] = [ - ...new Set(collectedData[key].concat(readyData)), - ] - } + if (!collectedData[key]) collectedData[key] = readyData + else + collectedData[key] = [ + ...new Set(collectedData[key].concat(readyData)), + ] + } const promises: Promise[] = [] - const onReceiveData = ( - key: string, - filter?: string[], - mapFunc?: string - ) => (data: any) => { - promises.push(asyncOnReceiveData(key, filter, mapFunc)(data)) - } + const onReceiveData = + (key: string, filter?: string[], mapFunc?: string) => + (data: any) => { + promises.push(asyncOnReceiveData(key, filter, mapFunc)(data)) + } for (const instruction of instructions) { const key = instruction.cacheKey diff --git a/src/components/PackIndexer/Worker/Main.ts b/src/components/PackIndexer/Worker/Main.ts index 090bdf9fa..4e0d6fe10 100644 --- a/src/components/PackIndexer/Worker/Main.ts +++ b/src/components/PackIndexer/Worker/Main.ts @@ -2,6 +2,9 @@ globalThis.process = { cwd: () => '', env: {}, + release: { + name: 'browser', + }, } import '/@/components/FileSystem/Virtual/Comlink' diff --git a/src/components/Projects/CreateProject/Files/Manifest.ts b/src/components/Projects/CreateProject/Files/Manifest.ts index 46c0f3e11..654aebac5 100644 --- a/src/components/Projects/CreateProject/Files/Manifest.ts +++ b/src/components/Projects/CreateProject/Files/Manifest.ts @@ -148,31 +148,65 @@ export class CreateManifest extends CreateFile { manifest.dependencies ??= [] // New 1.19.30+ format of dependencies if (compareVersions(createOptions.targetVersion, '1.19.30', '>=')) { - manifest.dependencies.push( - { - module_name: 'mojang-minecraft', - version: '1.0.0-beta', - }, - { - module_name: 'mojang-gametest', - version: '1.0.0-beta', - }, - { - module_name: 'mojang-minecraft-ui', - version: '1.0.0-beta', - } - ) - if (createOptions.bdsProject) + if ( + compareVersions( + createOptions.targetVersion, + '1.19.40', + '>=' + ) + ) { manifest.dependencies.push( { - module_name: 'mojang-minecraft-server-admin', + module_name: '@minecraft/server', + version: '1.0.0-beta', + }, + { + module_name: '@minecraft/server-gametest', + version: '1.0.0-beta', + }, + { + module_name: '@minecraft/server-ui', + version: '1.0.0-beta', + } + ) + if (createOptions.bdsProject) + manifest.dependencies.push( + { + module_name: '@minecraft/server-admin', + version: '1.0.0-beta', + }, + { + module_name: '@minecraft/server-net', + version: '1.0.0-beta', + } + ) + } else { + manifest.dependencies.push( + { + module_name: 'mojang-minecraft', + version: '1.0.0-beta', + }, + { + module_name: 'mojang-gametest', version: '1.0.0-beta', }, { - module_name: 'mojang-net', + module_name: 'mojang-minecraft-ui', version: '1.0.0-beta', } ) + if (createOptions.bdsProject) + manifest.dependencies.push( + { + module_name: 'mojang-minecraft-server-admin', + version: '1.0.0-beta', + }, + { + module_name: 'mojang-net', + version: '1.0.0-beta', + } + ) + } } else { // Old dependency format manifest.dependencies.push( diff --git a/src/components/Projects/Project/Project.ts b/src/components/Projects/Project/Project.ts index b62b31c59..118548098 100644 --- a/src/components/Projects/Project/Project.ts +++ b/src/components/Projects/Project/Project.ts @@ -100,10 +100,6 @@ export abstract class Project { } get compilerService() { if (this._compilerService === undefined) { - console.log( - this._compilerService, - this._compilerService === undefined - ) throw new Error( `Trying to access compilerService before it was setup. Make sure to await compilerReady.fired before accessing it.` ) diff --git a/src/components/Projects/Project/loadManifest.ts b/src/components/Projects/Project/loadManifest.ts index e469fe716..0d76008c5 100644 --- a/src/components/Projects/Project/loadManifest.ts +++ b/src/components/Projects/Project/loadManifest.ts @@ -6,6 +6,7 @@ import { version as appVersion } from '/@/utils/app/version' export async function loadManifest(app: App, manifestPath: string) { let manifest = await app.fileSystem.readJSON(manifestPath) + let addGeneratedWith = settingsState?.projects?.addGeneratedWith ?? true let generatedWithBridge: string[] = manifest?.metadata?.generated_with?.bridge ?? [] let generatedWithDash: string[] = @@ -13,7 +14,7 @@ export async function loadManifest(app: App, manifestPath: string) { let updatedManifest = false // Check that the user wants to add the generated_with section - if (settingsState?.projects?.addGeneratedWith ?? true) { + if (addGeneratedWith) { // Update generated_with bridge. version if ( !generatedWithBridge.includes(appVersion) || @@ -31,6 +32,10 @@ export async function loadManifest(app: App, manifestPath: string) { generatedWithDash = [dashVersion] updatedManifest = true } + } else { + if (manifest?.metadata?.generated_with) { + updatedManifest = true + } } // If the manifest changed, save changes to disk @@ -39,10 +44,12 @@ export async function loadManifest(app: App, manifestPath: string) { ...(manifest ?? {}), metadata: { ...(manifest?.metadata ?? {}), - generated_with: { - ...(manifest?.metadata?.generated_with ?? {}), - ...{ bridge: [appVersion], dash: [dashVersion] }, - }, + generated_with: addGeneratedWith + ? { + ...(manifest?.metadata?.generated_with ?? {}), + ...{ bridge: generatedWithBridge, dash: generatedWithDash }, + } + : undefined, }, } diff --git a/src/components/Projects/ProjectChooser/ProjectChooser.ts b/src/components/Projects/ProjectChooser/ProjectChooser.ts index 0f29b0aa8..b4cc09a63 100644 --- a/src/components/Projects/ProjectChooser/ProjectChooser.ts +++ b/src/components/Projects/ProjectChooser/ProjectChooser.ts @@ -71,8 +71,13 @@ export class ProjectChooserWindow extends NewBaseWindow { this.state.showLoadAllButton = 'isLoading' const app = await App.getApp() - const wasSuccessful = await app.setupBridgeFolder() - const wasComMojangSuccesful = await app.comMojang.setupComMojang() + // Only request permission if the user didn't already grant it + const wasSuccessful = + app.bridgeFolderSetup.hasFired || (await app.setupBridgeFolder()) + // For the com.mojang folder, we additionally check that bridge. already has its handle stored in IDB + const wasComMojangSuccesful = app.comMojang.hasComMojangHandle + ? app.comMojang.hasFired || (await app.comMojang.setupComMojang()) + : true if (wasSuccessful || wasComMojangSuccesful) { await this.loadProjects() @@ -100,7 +105,10 @@ export class ProjectChooserWindow extends NewBaseWindow { this.sidebar.removeElements() const app = await App.getApp() - this.state.showLoadAllButton = !app.bridgeFolderSetup.hasFired + // Show the loadAllButton if the user didn't grant permissions to bridge folder or comMojang folder yet + this.state.showLoadAllButton = + !app.bridgeFolderSetup.hasFired || + (!app.comMojang.setup.hasFired && app.comMojang.hasComMojangHandle) const projects = await app.projectManager.getProjects() const experimentalToggles = await app.dataLoader.readJSON( diff --git a/src/components/Sidebar/Button.vue b/src/components/Sidebar/Button.vue index 71dea303c..c34132a14 100644 --- a/src/components/Sidebar/Button.vue +++ b/src/components/Sidebar/Button.vue @@ -139,11 +139,11 @@ export default { }, }, methods: { - onClick() { + onClick(event) { if (this.disabled) return if (this.alwaysAllowClick || !this.isLoading) { - this.$emit('click') + this.$emit('click', event) // Otherwise the tooltip can get stuck until the user hovers over the button again this.hasClicked = true diff --git a/src/components/Sidebar/Sidebar.vue b/src/components/Sidebar/Sidebar.vue index 8b6bb5128..946d3f0fa 100644 --- a/src/components/Sidebar/Sidebar.vue +++ b/src/components/Sidebar/Sidebar.vue @@ -20,13 +20,26 @@ top: appToolbarHeight, }" > - + diff --git a/src/components/TabSystem/CommonTab.ts b/src/components/TabSystem/CommonTab.ts index 211d7f18a..fbb1976fa 100644 --- a/src/components/TabSystem/CommonTab.ts +++ b/src/components/TabSystem/CommonTab.ts @@ -108,8 +108,8 @@ export abstract class Tab extends Signal { get isSelected(): boolean { return this.parent.selectedTab === this } - select() { - this.parent.select(this) + async select() { + await this.parent.select(this) return this } /** diff --git a/src/components/TabSystem/FileTab.ts b/src/components/TabSystem/FileTab.ts index ab148d366..f4cb12824 100644 --- a/src/components/TabSystem/FileTab.ts +++ b/src/components/TabSystem/FileTab.ts @@ -10,9 +10,27 @@ import { } from '../FileSystem/Polyfill' import { download } from '../FileSystem/saveOrDownload' import { writableToUint8Array } from '/@/utils/file/writableToUint8Array' +import { settingsState } from '../Windows/Settings/SettingsState' +import { debounce } from 'lodash-es' export type TReadOnlyMode = 'forced' | 'manual' | 'off' +const shouldAutoSave = async () => { + const app = await App.getApp() + + // Check that either the auto save setting is enabled or fallback to activating it by default on mobile + return ( + settingsState?.editor?.autoSaveChanges ?? app.mobile.isCurrentDevice() + ) +} + +const throttledFileDidChange = debounce<(tab: FileTab) => Promise | void>( + async (tab) => { + tab.tryAutoSave() + }, + 3000 // 3s delay for fileDidChange +) + export abstract class FileTab extends Tab { public isForeignFile = false public isSaving = false @@ -72,6 +90,11 @@ export abstract class FileTab extends Tab { await super.setup() } + async onDeactivate() { + await this.tryAutoSave() + + super.onDeactivate() + } get name() { return this.fileHandle.name @@ -105,6 +128,24 @@ export abstract class FileTab extends Tab { abstract setReadOnly(readonly: TReadOnlyMode): Promise | void + /** + * **Important:** This function needs to be called when appropriate by the tabs implementing this class + */ + fileDidChange() { + throttledFileDidChange(this) + } + + // Logic for auto-saving + async tryAutoSave() { + // File handle has no parent context -> Auto-saving would have undesirable consequences such as constant file downloads + if (this.fileHandleWithoutParentContext()) return + + // Check whether we should auto save and that the file has been changed + if ((await shouldAutoSave()) && this.isUnsaved) { + await this.save() + } + } + async save() { if (this.isSaving) return this.isSaving = true @@ -153,12 +194,21 @@ export abstract class FileTab extends Tab { if (!this.isForeignFile) this.parent.openedFiles.add(this.getPath()) } - protected async writeFile(value: BufferSource | Blob | string) { - // Current file handle is a virtual file without parent - if ( + /** + * Check whether the given file handle has no parent context -> Save by "Save As" or file download + * @param fileHandle + * @returns boolean + */ + protected fileHandleWithoutParentContext() { + return ( this.fileHandle instanceof VirtualFileHandle && !this.fileHandle.hasParentContext - ) { + ) + } + + protected async writeFile(value: BufferSource | Blob | string) { + // Current file handle is a virtual file without parent + if (this.fileHandleWithoutParentContext()) { // Download the file if the user is using a file system polyfill if (isUsingFileSystemPolyfill.value) { download( diff --git a/src/components/TabSystem/TabSystem.ts b/src/components/TabSystem/TabSystem.ts index 6ed0cda25..280ece592 100644 --- a/src/components/TabSystem/TabSystem.ts +++ b/src/components/TabSystem/TabSystem.ts @@ -176,6 +176,38 @@ export class TabSystem extends MonacoHolder { const tab = await this.getTab(fileHandle) if (tab) this.close(tab) } + + /** + * Select next tab + */ + async selectNextTab() { + const tabs = this.tabs.value + if (tabs.length === 0) return + + const selectedTab = this.selectedTab + if (!selectedTab) return + + const index = tabs.indexOf(selectedTab) + const nextTab = tabs[index + 1] ?? tabs[0] + + await nextTab.select() + } + /** + * Select previous tab + */ + async selectPreviousTab() { + const tabs = this.tabs.value + if (tabs.length === 0) return + + const selectedTab = this.selectedTab + if (!selectedTab) return + + const index = tabs.indexOf(selectedTab) + const previousTab = tabs[index - 1] ?? tabs[tabs.length - 1] + + await previousTab.select() + } + async select(tab?: Tab) { if (this.isActive !== !!tab) this.setActive(!!tab) diff --git a/src/components/Toolbar/Category/view.ts b/src/components/Toolbar/Category/view.ts index 34ca901ea..993304ae7 100644 --- a/src/components/Toolbar/Category/view.ts +++ b/src/components/Toolbar/Category/view.ts @@ -3,6 +3,7 @@ import { ToolbarCategory } from '../ToolbarCategory' import { FileTab } from '/@/components/TabSystem/FileTab' import { ViewCompilerOutput } from '../../UIElements/DirectoryViewer/ContextMenu/Actions/ViewCompilerOutput' import { Divider } from '../Divider' +import { platform } from '/@/utils/os' export function setupViewCategory(app: App) { const view = new ToolbarCategory('mdi-eye-outline', 'toolbar.view.name') @@ -32,6 +33,34 @@ export function setupViewCategory(app: App) { view.addItem(new Divider()) + view.addItem( + app.actionManager.create({ + icon: 'mdi-chevron-right', + name: 'toolbar.view.nextTab.name', + description: 'toolbar.view.nextTab.description', + keyBinding: platform() === 'darwin' ? 'Meta + Tab' : 'Ctrl + Tab', + onTrigger: () => { + app.tabSystem?.selectNextTab() + }, + }) + ) + view.addItem( + app.actionManager.create({ + icon: 'mdi-chevron-left', + name: 'toolbar.view.previousTab.name', + description: 'toolbar.view.previousTab.description', + keyBinding: + platform() === 'darwin' + ? 'Meta + Shift + Tab' + : 'Ctrl + Shift + Tab', + onTrigger: () => { + app.tabSystem?.selectPreviousTab() + }, + }) + ) + + view.addItem(new Divider()) + view.addItem(app.actionManager.create(ViewCompilerOutput(undefined, true))) view.addItem( diff --git a/src/components/Toolbar/Main.vue b/src/components/Toolbar/Main.vue index a011a8a9b..d60428cd2 100644 --- a/src/components/Toolbar/Main.vue +++ b/src/components/Toolbar/Main.vue @@ -1,5 +1,6 @@