diff --git a/cypress/e2e/index.spec.ts b/cypress/e2e/index.spec.ts
index b0d7118b..cb1b6880 100644
--- a/cypress/e2e/index.spec.ts
+++ b/cypress/e2e/index.spec.ts
@@ -14,7 +14,7 @@ const compareRenderedFlatWorld = () => {
}
const testWorldLoad = () => {
- return cy.document().then({ timeout: 25_000 }, doc => {
+ return cy.document().then({ timeout: 35_000 }, doc => {
return new Cypress.Promise(resolve => {
doc.addEventListener('cypress-world-ready', resolve)
})
diff --git a/experiments/decode.html b/experiments/decode.html
new file mode 100644
index 00000000..fd55e622
--- /dev/null
+++ b/experiments/decode.html
@@ -0,0 +1 @@
+
diff --git a/experiments/decode.ts b/experiments/decode.ts
new file mode 100644
index 00000000..6d0f876d
--- /dev/null
+++ b/experiments/decode.ts
@@ -0,0 +1,26 @@
+// Include the pako library
+import pako from 'pako';
+import compressedJsRaw from './compressed.js?raw'
+
+function decompressFromBase64(input) {
+ // Decode the Base64 string
+ const binaryString = atob(input);
+ const len = binaryString.length;
+ const bytes = new Uint8Array(len);
+
+ // Convert the binary string to a byte array
+ for (let i = 0; i < len; i++) {
+ bytes[i] = binaryString.charCodeAt(i);
+ }
+
+ // Decompress the byte array
+ const decompressedData = pako.inflate(bytes, { to: 'string' });
+
+ return decompressedData;
+}
+
+// Use the function
+console.time('decompress');
+const decompressedData = decompressFromBase64(compressedJsRaw);
+console.timeEnd('decompress')
+console.log(decompressedData)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6697f33b..8075be60 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -461,6 +461,10 @@ importers:
node-canvas-webgl:
specifier: ^0.3.0
version: 0.3.0(encoding@0.1.13)
+ devDependencies:
+ live-server:
+ specifier: ^1.2.2
+ version: 1.2.2
prismarine-viewer/viewer/sign-renderer:
dependencies:
@@ -3535,10 +3539,21 @@ packages:
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ anymatch@2.0.0:
+ resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==}
+
anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
+ apache-crypt@1.2.6:
+ resolution: {integrity: sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==}
+ engines: {node: '>=8'}
+
+ apache-md5@1.1.8:
+ resolution: {integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==}
+ engines: {node: '>=8'}
+
app-root-dir@1.0.2:
resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==}
@@ -3568,6 +3583,18 @@ packages:
resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==}
engines: {node: '>=10'}
+ arr-diff@4.0.0:
+ resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+ engines: {node: '>=0.10.0'}
+
+ arr-flatten@1.1.0:
+ resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+ engines: {node: '>=0.10.0'}
+
+ arr-union@3.1.0:
+ resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+ engines: {node: '>=0.10.0'}
+
array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
@@ -3590,6 +3617,10 @@ packages:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
+ array-unique@0.3.2:
+ resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+ engines: {node: '>=0.10.0'}
+
array.prototype.findlast@1.2.5:
resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
engines: {node: '>= 0.4'}
@@ -3645,6 +3676,10 @@ packages:
assertion-error@1.1.0:
resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+ assign-symbols@1.0.0:
+ resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+ engines: {node: '>=0.10.0'}
+
ast-types@0.14.2:
resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==}
engines: {node: '>=4'}
@@ -3661,6 +3696,9 @@ packages:
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
engines: {node: '>=8'}
+ async-each@1.0.6:
+ resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==}
+
async-limiter@1.0.1:
resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
@@ -3677,6 +3715,11 @@ packages:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
+ atob@2.1.2:
+ resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+ engines: {node: '>= 4.5.0'}
+ hasBin: true
+
available-typed-arrays@1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
@@ -3745,13 +3788,23 @@ packages:
resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==}
engines: {node: ^4.5.0 || >= 5.9}
+ base@0.11.2:
+ resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+ engines: {node: '>=0.10.0'}
+
basic-auth@2.0.1:
resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
engines: {node: '>= 0.8'}
+ batch@0.6.1:
+ resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
+
bcrypt-pbkdf@1.0.2:
resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+ bcryptjs@2.4.3:
+ resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
+
better-opn@3.0.2:
resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
engines: {node: '>=12.0.0'}
@@ -3760,6 +3813,10 @@ packages:
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
engines: {node: '>=0.6'}
+ binary-extensions@1.13.1:
+ resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==}
+ engines: {node: '>=0.10.0'}
+
binary-extensions@2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
@@ -3812,6 +3869,10 @@ packages:
brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ braces@2.3.2:
+ resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+ engines: {node: '>=0.10.0'}
+
braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'}
@@ -3916,6 +3977,10 @@ packages:
resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+ cache-base@1.0.1:
+ resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+ engines: {node: '>=0.10.0'}
+
cachedir@2.4.0:
resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==}
engines: {node: '>=6'}
@@ -3997,6 +4062,10 @@ packages:
resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
engines: {node: '>= 0.8.0'}
+ chokidar@2.1.8:
+ resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==}
+ deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
+
chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
@@ -4019,6 +4088,10 @@ packages:
cipher-base@1.0.4:
resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
+ class-utils@0.3.6:
+ resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+ engines: {node: '>=0.10.0'}
+
classnames@2.5.1:
resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
@@ -4069,6 +4142,10 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
+ collection-visit@1.0.0:
+ resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+ engines: {node: '>=0.10.0'}
+
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
@@ -4152,6 +4229,10 @@ packages:
confusing-browser-globals@1.0.11:
resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
+ connect@3.7.0:
+ resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
+ engines: {node: '>= 0.10.0'}
+
console-browserify@1.2.0:
resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
@@ -4193,6 +4274,10 @@ packages:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
engines: {node: '>= 0.6'}
+ copy-descriptor@0.1.1:
+ resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+ engines: {node: '>=0.10.0'}
+
copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
@@ -4366,6 +4451,10 @@ packages:
decode-named-character-reference@1.0.2:
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
decompress-response@4.2.1:
resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==}
engines: {node: '>=8'}
@@ -4412,6 +4501,18 @@ packages:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
+ define-property@0.2.5:
+ resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@1.0.0:
+ resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+ engines: {node: '>=0.10.0'}
+
+ define-property@2.0.2:
+ resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+ engines: {node: '>=0.10.0'}
+
defu@6.1.2:
resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==}
@@ -4426,6 +4527,10 @@ packages:
delegates@1.0.0:
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+ depd@1.1.2:
+ resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
+ engines: {node: '>= 0.6'}
+
depd@2.0.0:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
@@ -4961,6 +5066,9 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
+ event-stream@3.3.4:
+ resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
+
event-target-shim@5.0.1:
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
engines: {node: '>=6'}
@@ -4997,6 +5105,10 @@ packages:
resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
engines: {node: '>=6'}
+ expand-brackets@2.1.4:
+ resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+ engines: {node: '>=0.10.0'}
+
expand-template@2.0.3:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
engines: {node: '>=6'}
@@ -5014,9 +5126,21 @@ packages:
resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
engines: {node: '>= 0.10.0'}
+ extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+
+ extend-shallow@3.0.2:
+ resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+ engines: {node: '>=0.10.0'}
+
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ extglob@2.0.4:
+ resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+ engines: {node: '>=0.10.0'}
+
extract-zip@1.7.0:
resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
hasBin: true
@@ -5055,6 +5179,10 @@ packages:
fastq@1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+ faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+
fb-watchman@2.0.2:
resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
@@ -5092,10 +5220,18 @@ packages:
resolution: {integrity: sha512-6RS9gDchbn+qWmtV2uSjo5vmKizgfCQeb5jKmqx8HyzA3MoLqqyQxN+QcjkGBJt7FjJ9qFce67Auyya5rRRbpw==}
engines: {node: '>= 10.4.0'}
+ fill-range@4.0.0:
+ resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+ engines: {node: '>=0.10.0'}
+
fill-range@7.0.1:
resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
engines: {node: '>=8'}
+ finalhandler@1.1.2:
+ resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+ engines: {node: '>= 0.8'}
+
finalhandler@1.2.0:
resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
engines: {node: '>= 0.8'}
@@ -5158,6 +5294,10 @@ packages:
for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+
foreground-child@2.0.0:
resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==}
engines: {node: '>=8.0.0'}
@@ -5188,10 +5328,17 @@ packages:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
+ fragment-cache@0.2.1:
+ resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+ engines: {node: '>=0.10.0'}
+
fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
+ from@0.1.7:
+ resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
+
fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
@@ -5221,6 +5368,12 @@ packages:
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ fsevents@1.2.13:
+ resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==}
+ engines: {node: '>= 4.0'}
+ os: [darwin]
+ deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -5305,6 +5458,10 @@ packages:
get-tsconfig@4.7.2:
resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==}
+ get-value@2.0.6:
+ resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+ engines: {node: '>=0.10.0'}
+
getos@3.2.1:
resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==}
@@ -5325,6 +5482,9 @@ packages:
resolution: {integrity: sha512-yBbfpChOtFvg5D+KtMaBFvj6yt3vUnheNAH+UrQH2TfDB8kr0tERdL0Tjhe0W7xJ6jR6ftQBluTZR9jXUnKe8g==}
engines: {node: '>=14.0.0'}
+ glob-parent@3.1.0:
+ resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==}
+
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
@@ -5458,6 +5618,22 @@ packages:
has-unicode@2.0.1:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+ has-value@0.3.1:
+ resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+ engines: {node: '>=0.10.0'}
+
+ has-value@1.0.0:
+ resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@0.1.4:
+ resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+ engines: {node: '>=0.10.0'}
+
+ has-values@1.0.0:
+ resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+ engines: {node: '>=0.10.0'}
+
has@1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'}
@@ -5515,16 +5691,27 @@ packages:
resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
engines: {node: '>=8'}
+ http-auth@3.1.3:
+ resolution: {integrity: sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==}
+ engines: {node: '>=4.6.1'}
+
http-browserify@1.7.0:
resolution: {integrity: sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==}
http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+ http-errors@1.6.3:
+ resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==}
+ engines: {node: '>= 0.6'}
+
http-errors@2.0.0:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
engines: {node: '>= 0.8'}
+ http-parser-js@0.5.8:
+ resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
+
http-proxy-agent@5.0.0:
resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
engines: {node: '>= 6'}
@@ -5626,6 +5813,9 @@ packages:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ inherits@2.0.3:
+ resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -5661,6 +5851,10 @@ packages:
resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==}
engines: {node: '>=8'}
+ is-accessor-descriptor@1.0.1:
+ resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+ engines: {node: '>= 0.10'}
+
is-arguments@1.1.1:
resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
engines: {node: '>= 0.4'}
@@ -5685,6 +5879,10 @@ packages:
is-bigint@1.0.4:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ is-binary-path@1.0.1:
+ resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==}
+ engines: {node: '>=0.10.0'}
+
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
@@ -5693,6 +5891,9 @@ packages:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
+ is-buffer@1.1.6:
+ resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
is-builtin-module@3.2.1:
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
engines: {node: '>=6'}
@@ -5711,6 +5912,10 @@ packages:
is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+ is-data-descriptor@1.0.1:
+ resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+ engines: {node: '>= 0.4'}
+
is-data-view@1.0.1:
resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
engines: {node: '>= 0.4'}
@@ -5722,11 +5927,27 @@ packages:
is-deflate@1.0.0:
resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==}
+ is-descriptor@0.1.7:
+ resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+ engines: {node: '>= 0.4'}
+
+ is-descriptor@1.0.3:
+ resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+ engines: {node: '>= 0.4'}
+
is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
engines: {node: '>=8'}
hasBin: true
+ is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+
+ is-extendable@1.0.1:
+ resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+ engines: {node: '>=0.10.0'}
+
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -5745,6 +5966,10 @@ packages:
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
engines: {node: '>= 0.4'}
+ is-glob@3.1.0:
+ resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==}
+ engines: {node: '>=0.10.0'}
+
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -5787,6 +6012,10 @@ packages:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
+ is-number@3.0.0:
+ resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+ engines: {node: '>=0.10.0'}
+
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@@ -5876,6 +6105,14 @@ packages:
resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
engines: {node: '>= 0.4'}
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@1.1.0:
+ resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
+ engines: {node: '>=4'}
+
is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
engines: {node: '>=8'}
@@ -5895,6 +6132,10 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ isobject@2.1.0:
+ resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+ engines: {node: '>=0.10.0'}
+
isobject@3.0.1:
resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
engines: {node: '>=0.10.0'}
@@ -6076,6 +6317,14 @@ packages:
keyv@4.5.3:
resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==}
+ kind-of@3.2.2:
+ resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+ engines: {node: '>=0.10.0'}
+
+ kind-of@4.0.0:
+ resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+ engines: {node: '>=0.10.0'}
+
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
@@ -6124,6 +6373,11 @@ packages:
enquirer:
optional: true
+ live-server@1.2.2:
+ resolution: {integrity: sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==}
+ engines: {node: '>=0.10.0'}
+ hasBin: true
+
load-bmfont@1.4.1:
resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==}
@@ -6269,6 +6523,10 @@ packages:
makeerror@1.0.12:
resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+
map-obj@1.0.1:
resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
engines: {node: '>=0.10.0'}
@@ -6280,6 +6538,13 @@ packages:
map-or-similar@1.5.0:
resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
+ map-stream@0.1.0:
+ resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
+
+ map-visit@1.0.0:
+ resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+ engines: {node: '>=0.10.0'}
+
markdown-it@14.0.0:
resolution: {integrity: sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==}
hasBin: true
@@ -6431,6 +6696,10 @@ packages:
micromark@4.0.0:
resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==}
+ micromatch@3.1.10:
+ resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
+ engines: {node: '>=0.10.0'}
+
micromatch@4.0.5:
resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
engines: {node: '>=8.6'}
@@ -6578,6 +6847,10 @@ packages:
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
engines: {node: '>= 8'}
+ mixin-deep@1.3.2:
+ resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+ engines: {node: '>=0.10.0'}
+
mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
@@ -6608,6 +6881,10 @@ packages:
moo@0.5.2:
resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
+ morgan@1.10.0:
+ resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==}
+ engines: {node: '>= 0.8.0'}
+
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -6643,6 +6920,10 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nanomatch@1.2.13:
+ resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+ engines: {node: '>=0.10.0'}
+
napi-build-utils@1.0.2:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
@@ -6753,6 +7034,10 @@ packages:
resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
engines: {node: '>=10'}
+ normalize-path@2.1.1:
+ resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
+ engines: {node: '>=0.10.0'}
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -6782,6 +7067,10 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
+ object-copy@0.1.0:
+ resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+ engines: {node: '>=0.10.0'}
+
object-inspect@1.12.3:
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
@@ -6796,6 +7085,10 @@ packages:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
+ object-visit@1.0.1:
+ resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+ engines: {node: '>=0.10.0'}
+
object.assign@4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
engines: {node: '>= 0.4'}
@@ -6816,6 +7109,10 @@ packages:
resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
engines: {node: '>= 0.4'}
+ object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+
object.values@1.1.7:
resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==}
engines: {node: '>= 0.4'}
@@ -6827,6 +7124,10 @@ packages:
omggif@1.0.10:
resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==}
+ on-finished@2.3.0:
+ resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
+ engines: {node: '>= 0.8'}
+
on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
@@ -6850,6 +7151,11 @@ packages:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
+ opn@6.0.0:
+ resolution: {integrity: sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==}
+ engines: {node: '>=8'}
+ deprecated: The package has been renamed to `open`
+
optionator@0.9.3:
resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
engines: {node: '>= 0.8.0'}
@@ -6948,12 +7254,19 @@ packages:
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ pascalcase@0.1.1:
+ resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+ engines: {node: '>=0.10.0'}
+
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
path-case@3.0.4:
resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+ path-dirname@1.0.2:
+ resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==}
+
path-exists-cli@2.0.0:
resolution: {integrity: sha512-qGr0A87KYCznmvabblxyxnzA/MtPZ28wH+4SCMP4tjTFAbzqwvs5xpUZExAYzq5OgHe5vIswzdH5iosCb8YF/Q==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -7007,6 +7320,9 @@ packages:
pathval@1.1.1:
resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+ pause-stream@0.0.11:
+ resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
+
pbkdf2@3.1.2:
resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
engines: {node: '>=0.12'}
@@ -7108,6 +7424,10 @@ packages:
resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==}
engines: {node: '>= 0.12.0'}
+ posix-character-classes@0.1.1:
+ resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+ engines: {node: '>=0.10.0'}
+
possible-typed-array-names@1.0.0:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
@@ -7322,6 +7642,10 @@ packages:
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+ proxy-middleware@0.15.0:
+ resolution: {integrity: sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==}
+ engines: {node: '>=0.8.0'}
+
psl@1.9.0:
resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
@@ -7604,6 +7928,10 @@ packages:
resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ readdirp@2.2.1:
+ resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==}
+ engines: {node: '>=0.10'}
+
readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -7646,6 +7974,10 @@ packages:
regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+ regex-not@1.0.2:
+ resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+ engines: {node: '>=0.10.0'}
+
regexp-tree@0.1.27:
resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
hasBin: true
@@ -7689,6 +8021,17 @@ packages:
remark@15.0.1:
resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==}
+ remove-trailing-separator@1.1.0:
+ resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==}
+
+ repeat-element@1.1.4:
+ resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+ engines: {node: '>=0.10.0'}
+
+ repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+
request-progress@3.0.0:
resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==}
@@ -7717,6 +8060,10 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ resolve-url@0.2.1:
+ resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+ deprecated: https://github.com/lydell/resolve-url#deprecated
+
resolve@1.22.4:
resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==}
hasBin: true
@@ -7816,6 +8163,9 @@ packages:
resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
engines: {node: '>= 0.4'}
+ safe-regex@1.1.0:
+ resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -7876,6 +8226,10 @@ packages:
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ serve-index@1.9.1:
+ resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==}
+ engines: {node: '>= 0.8.0'}
+
serve-static@1.15.0:
resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
engines: {node: '>= 0.8.0'}
@@ -7899,9 +8253,16 @@ packages:
resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==}
engines: {node: '>=6.9'}
+ set-value@2.0.1:
+ resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+ engines: {node: '>=0.10.0'}
+
setimmediate@1.0.5:
resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+ setprototypeof@1.1.0:
+ resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
+
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -8001,6 +8362,18 @@ packages:
snake-case@3.0.4:
resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ snapdragon-node@2.1.1:
+ resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon-util@3.0.1:
+ resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+ engines: {node: '>=0.10.0'}
+
+ snapdragon@0.8.2:
+ resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+ engines: {node: '>=0.10.0'}
+
socket.io-adapter@1.1.2:
resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==}
@@ -8048,9 +8421,17 @@ packages:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
+ source-map-resolve@0.5.3:
+ resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+ deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ source-map-url@0.4.1:
+ resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+ deprecated: See https://github.com/lydell/source-map-url#deprecated
+
source-map@0.5.6:
resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==}
engines: {node: '>=0.10.0'}
@@ -8086,6 +8467,13 @@ packages:
spdx-license-ids@3.0.13:
resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
+ split-string@3.1.0:
+ resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+ engines: {node: '>=0.10.0'}
+
+ split@0.3.3:
+ resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
+
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
@@ -8113,12 +8501,20 @@ packages:
stacktrace-js@2.0.2:
resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==}
+ static-extend@0.1.2:
+ resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+ engines: {node: '>=0.10.0'}
+
stats-gl@1.0.5:
resolution: {integrity: sha512-XimMxvwnf1Qf5KwebhcoA34kcX+fWEkIl0QjNkCbu4IpoyDMMsOajExn7FIq5w569k45+LhmsuRlGSrsvmGdNw==}
stats.js@0.17.0:
resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==}
+ statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+
statuses@2.0.1:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
engines: {node: '>= 0.8'}
@@ -8136,6 +8532,9 @@ packages:
stream-browserify@3.0.0:
resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
+ stream-combiner@0.0.4:
+ resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
+
stream-http@3.2.0:
resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==}
@@ -8410,10 +8809,22 @@ packages:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
+ to-object-path@0.3.0:
+ resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+ engines: {node: '>=0.10.0'}
+
+ to-regex-range@2.1.1:
+ resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+ engines: {node: '>=0.10.0'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
+ to-regex@3.0.2:
+ resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+ engines: {node: '>=0.10.0'}
+
tocbot@4.21.2:
resolution: {integrity: sha512-R5Muhi/TUu4i4snWVrMgNoXyJm2f8sJfdgIkQvqb+cuIXQEIMAiWGWgCgYXHqX4+XiS/Bnm7IYZ9Zy6NVe6lhw==}
@@ -8620,6 +9031,10 @@ packages:
unified@11.0.4:
resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==}
+ union-value@1.0.1:
+ resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+ engines: {node: '>=0.10.0'}
+
union@0.5.0:
resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==}
engines: {node: '>= 0.8.0'}
@@ -8669,6 +9084,9 @@ packages:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
+ unix-crypt-td-js@1.1.4:
+ resolution: {integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==}
+
unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
@@ -8676,6 +9094,10 @@ packages:
unplugin@1.5.0:
resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==}
+ unset-value@1.0.0:
+ resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+ engines: {node: '>=0.10.0'}
+
untildify@4.0.0:
resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
engines: {node: '>=8'}
@@ -8705,6 +9127,10 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ urix@0.1.0:
+ resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+ deprecated: Please see https://github.com/lydell/urix#deprecated
+
url-join@4.0.1:
resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==}
@@ -8769,6 +9195,10 @@ packages:
typescript:
optional: true
+ use@3.1.1:
+ resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+ engines: {node: '>=0.10.0'}
+
utf8-byte-length@1.0.4:
resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==}
@@ -8788,6 +9218,11 @@ packages:
uuid-1345@1.0.2:
resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==}
+ uuid@3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
+ hasBin: true
+
uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
@@ -8979,6 +9414,14 @@ packages:
resolution: {integrity: sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==}
engines: {node: '>=6.0.0', npm: '>=3.10.0'}
+ websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+
+ websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+
whatwg-encoding@2.0.0:
resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
engines: {node: '>=12'}
@@ -13096,11 +13539,24 @@ snapshots:
any-promise@1.3.0: {}
+ anymatch@2.0.0:
+ dependencies:
+ micromatch: 3.1.10
+ normalize-path: 2.1.1
+ transitivePeerDependencies:
+ - supports-color
+
anymatch@3.1.3:
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
+ apache-crypt@1.2.6:
+ dependencies:
+ unix-crypt-td-js: 1.1.4
+
+ apache-md5@1.1.8: {}
+
app-root-dir@1.0.2: {}
aproba@2.0.0:
@@ -13131,6 +13587,12 @@ snapshots:
dependencies:
tslib: 2.6.2
+ arr-diff@4.0.0: {}
+
+ arr-flatten@1.1.0: {}
+
+ arr-union@3.1.0: {}
+
array-buffer-byte-length@1.0.0:
dependencies:
call-bind: 1.0.2
@@ -13162,6 +13624,8 @@ snapshots:
array-union@2.1.0: {}
+ array-unique@0.3.2: {}
+
array.prototype.findlast@1.2.5:
dependencies:
call-bind: 1.0.7
@@ -13259,6 +13723,8 @@ snapshots:
assertion-error@1.1.0: {}
+ assign-symbols@1.0.0: {}
+
ast-types@0.14.2:
dependencies:
tslib: 2.6.2
@@ -13274,6 +13740,8 @@ snapshots:
astral-regex@2.0.0:
optional: true
+ async-each@1.0.6: {}
+
async-limiter@1.0.1: {}
async@2.6.4:
@@ -13286,6 +13754,8 @@ snapshots:
at-least-node@1.0.0: {}
+ atob@2.1.2: {}
+
available-typed-arrays@1.0.5: {}
available-typed-arrays@1.0.7:
@@ -13370,21 +13840,37 @@ snapshots:
base64id@2.0.0: {}
+ base@0.11.2:
+ dependencies:
+ cache-base: 1.0.1
+ class-utils: 0.3.6
+ component-emitter: 1.3.0
+ define-property: 1.0.0
+ isobject: 3.0.1
+ mixin-deep: 1.3.2
+ pascalcase: 0.1.1
+
basic-auth@2.0.1:
dependencies:
safe-buffer: 5.1.2
+ batch@0.6.1: {}
+
bcrypt-pbkdf@1.0.2:
dependencies:
tweetnacl: 0.14.5
optional: true
+ bcryptjs@2.4.3: {}
+
better-opn@3.0.2:
dependencies:
open: 8.4.2
big-integer@1.6.51: {}
+ binary-extensions@1.13.1: {}
+
binary-extensions@2.2.0: {}
bindings@1.5.0:
@@ -13466,6 +13952,21 @@ snapshots:
dependencies:
balanced-match: 1.0.2
+ braces@2.3.2:
+ dependencies:
+ arr-flatten: 1.1.0
+ array-unique: 0.3.2
+ extend-shallow: 2.0.1
+ fill-range: 4.0.0
+ isobject: 3.0.1
+ repeat-element: 1.1.4
+ snapdragon: 0.8.2
+ snapdragon-node: 2.1.1
+ split-string: 3.1.0
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
braces@3.0.2:
dependencies:
fill-range: 7.0.1
@@ -13612,6 +14113,18 @@ snapshots:
- bluebird
optional: true
+ cache-base@1.0.1:
+ dependencies:
+ collection-visit: 1.0.0
+ component-emitter: 1.3.0
+ get-value: 2.0.6
+ has-value: 1.0.0
+ isobject: 3.0.1
+ set-value: 2.0.1
+ to-object-path: 0.3.0
+ union-value: 1.0.1
+ unset-value: 1.0.0
+
cachedir@2.4.0:
optional: true
@@ -13732,6 +14245,24 @@ snapshots:
check-more-types@2.24.0:
optional: true
+ chokidar@2.1.8:
+ dependencies:
+ anymatch: 2.0.0
+ async-each: 1.0.6
+ braces: 2.3.2
+ glob-parent: 3.1.0
+ inherits: 2.0.4
+ is-binary-path: 1.0.1
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ path-is-absolute: 1.0.1
+ readdirp: 2.2.1
+ upath: 1.2.0
+ optionalDependencies:
+ fsevents: 1.2.13
+ transitivePeerDependencies:
+ - supports-color
+
chokidar@3.5.3:
dependencies:
anymatch: 3.1.3
@@ -13757,6 +14288,13 @@ snapshots:
inherits: 2.0.4
safe-buffer: 5.2.1
+ class-utils@0.3.6:
+ dependencies:
+ arr-union: 3.1.0
+ define-property: 0.2.5
+ isobject: 3.0.1
+ static-extend: 0.1.2
+
classnames@2.5.1: {}
clean-regexp@1.0.0:
@@ -13807,6 +14345,11 @@ snapshots:
clsx@2.1.1: {}
+ collection-visit@1.0.0:
+ dependencies:
+ map-visit: 1.0.0
+ object-visit: 1.0.1
+
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
@@ -13857,8 +14400,7 @@ snapshots:
component-emitter@1.2.1:
optional: true
- component-emitter@1.3.0:
- optional: true
+ component-emitter@1.3.0: {}
component-inherit@0.0.3:
optional: true
@@ -13890,6 +14432,15 @@ snapshots:
confusing-browser-globals@1.0.11: {}
+ connect@3.7.0:
+ dependencies:
+ debug: 2.6.9
+ finalhandler: 1.1.2
+ parseurl: 1.3.3
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
console-browserify@1.2.0: {}
console-control-strings@1.1.0:
@@ -13930,6 +14481,8 @@ snapshots:
cookie@0.5.0: {}
+ copy-descriptor@0.1.1: {}
+
copy-to-clipboard@3.3.3:
dependencies:
toggle-selection: 1.0.6
@@ -14183,6 +14736,8 @@ snapshots:
dependencies:
character-entities: 2.0.2
+ decode-uri-component@0.2.2: {}
+
decompress-response@4.2.1:
dependencies:
mimic-response: 2.1.0
@@ -14231,6 +14786,19 @@ snapshots:
has-property-descriptors: 1.0.0
object-keys: 1.1.1
+ define-property@0.2.5:
+ dependencies:
+ is-descriptor: 0.1.7
+
+ define-property@1.0.0:
+ dependencies:
+ is-descriptor: 1.0.3
+
+ define-property@2.0.2:
+ dependencies:
+ is-descriptor: 1.0.3
+ isobject: 3.0.1
+
defu@6.1.2: {}
del@6.1.1:
@@ -14249,6 +14817,8 @@ snapshots:
delegates@1.0.0:
optional: true
+ depd@1.1.2: {}
+
depd@2.0.0: {}
dequal@1.0.0: {}
@@ -15068,6 +15638,16 @@ snapshots:
etag@1.8.1: {}
+ event-stream@3.3.4:
+ dependencies:
+ duplexer: 0.1.2
+ from: 0.1.7
+ map-stream: 0.1.0
+ pause-stream: 0.0.11
+ split: 0.3.3
+ stream-combiner: 0.0.4
+ through: 2.3.8
+
event-target-shim@5.0.1: {}
eventemitter2@6.4.7:
@@ -15117,6 +15697,18 @@ snapshots:
exit-hook@2.2.1: {}
+ expand-brackets@2.1.4:
+ dependencies:
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ posix-character-classes: 0.1.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
expand-template@2.0.3: {}
exponential-backoff@3.1.1:
@@ -15166,8 +15758,30 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ extend-shallow@2.0.1:
+ dependencies:
+ is-extendable: 0.1.1
+
+ extend-shallow@3.0.2:
+ dependencies:
+ assign-symbols: 1.0.0
+ is-extendable: 1.0.1
+
extend@3.0.2: {}
+ extglob@2.0.4:
+ dependencies:
+ array-unique: 0.3.2
+ define-property: 1.0.0
+ expand-brackets: 2.1.4
+ extend-shallow: 2.0.1
+ fragment-cache: 0.2.1
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
extract-zip@1.7.0:
dependencies:
concat-stream: 1.6.2
@@ -15214,6 +15828,10 @@ snapshots:
dependencies:
reusify: 1.0.4
+ faye-websocket@0.11.4:
+ dependencies:
+ websocket-driver: 0.7.4
+
fb-watchman@2.0.2:
dependencies:
bser: 2.1.1
@@ -15252,10 +15870,29 @@ snapshots:
filesize@10.0.12: {}
+ fill-range@4.0.0:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+ to-regex-range: 2.1.1
+
fill-range@7.0.1:
dependencies:
to-regex-range: 5.0.1
+ finalhandler@1.1.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
finalhandler@1.2.0:
dependencies:
debug: 2.6.9
@@ -15320,6 +15957,8 @@ snapshots:
dependencies:
is-callable: 1.2.7
+ for-in@1.0.2: {}
+
foreground-child@2.0.0:
dependencies:
cross-spawn: 7.0.3
@@ -15365,8 +16004,14 @@ snapshots:
forwarded@0.2.0: {}
+ fragment-cache@0.2.1:
+ dependencies:
+ map-cache: 0.2.2
+
fresh@0.5.2: {}
+ from@0.1.7: {}
+
fs-constants@1.0.0: {}
fs-extra@10.1.0:
@@ -15403,6 +16048,12 @@ snapshots:
fs.realpath@1.0.0: {}
+ fsevents@1.2.13:
+ dependencies:
+ bindings: 1.5.0
+ nan: 2.18.0
+ optional: true
+
fsevents@2.3.3:
optional: true
@@ -15496,6 +16147,8 @@ snapshots:
dependencies:
resolve-pkg-maps: 1.0.0
+ get-value@2.0.6: {}
+
getos@3.2.1:
dependencies:
async: 3.2.5
@@ -15536,6 +16189,11 @@ snapshots:
- supports-color
optional: true
+ glob-parent@3.1.0:
+ dependencies:
+ is-glob: 3.1.0
+ path-dirname: 1.0.2
+
glob-parent@5.1.2:
dependencies:
is-glob: 4.0.3
@@ -15688,6 +16346,25 @@ snapshots:
has-unicode@2.0.1:
optional: true
+ has-value@0.3.1:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 0.1.4
+ isobject: 2.1.0
+
+ has-value@1.0.0:
+ dependencies:
+ get-value: 2.0.6
+ has-values: 1.0.0
+ isobject: 3.0.1
+
+ has-values@0.1.4: {}
+
+ has-values@1.0.0:
+ dependencies:
+ is-number: 3.0.0
+ kind-of: 4.0.0
+
has@1.0.3:
dependencies:
function-bind: 1.1.1
@@ -15750,6 +16427,13 @@ snapshots:
html-tags@3.3.1: {}
+ http-auth@3.1.3:
+ dependencies:
+ apache-crypt: 1.2.6
+ apache-md5: 1.1.8
+ bcryptjs: 2.4.3
+ uuid: 3.4.0
+
http-browserify@1.7.0:
dependencies:
Base64: 0.2.1
@@ -15757,6 +16441,13 @@ snapshots:
http-cache-semantics@4.1.1: {}
+ http-errors@1.6.3:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.3
+ setprototypeof: 1.1.0
+ statuses: 1.5.0
+
http-errors@2.0.0:
dependencies:
depd: 2.0.0
@@ -15765,6 +16456,8 @@ snapshots:
statuses: 2.0.1
toidentifier: 1.0.1
+ http-parser-js@0.5.8: {}
+
http-proxy-agent@5.0.0:
dependencies:
'@tootallnate/once': 2.0.0
@@ -15887,6 +16580,8 @@ snapshots:
once: 1.4.0
wrappy: 1.0.2
+ inherits@2.0.3: {}
+
inherits@2.0.4: {}
ini@1.3.8: {}
@@ -15921,6 +16616,10 @@ snapshots:
is-absolute-url@3.0.3: {}
+ is-accessor-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.2
+
is-arguments@1.1.1:
dependencies:
call-bind: 1.0.2
@@ -15949,6 +16648,10 @@ snapshots:
dependencies:
has-bigints: 1.0.2
+ is-binary-path@1.0.1:
+ dependencies:
+ binary-extensions: 1.13.1
+
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.2.0
@@ -15958,6 +16661,8 @@ snapshots:
call-bind: 1.0.2
has-tostringtag: 1.0.0
+ is-buffer@1.1.6: {}
+
is-builtin-module@3.2.1:
dependencies:
builtin-modules: 3.3.0
@@ -15977,6 +16682,10 @@ snapshots:
dependencies:
hasown: 2.0.2
+ is-data-descriptor@1.0.1:
+ dependencies:
+ hasown: 2.0.2
+
is-data-view@1.0.1:
dependencies:
is-typed-array: 1.1.13
@@ -15987,8 +16696,24 @@ snapshots:
is-deflate@1.0.0: {}
+ is-descriptor@0.1.7:
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+
+ is-descriptor@1.0.3:
+ dependencies:
+ is-accessor-descriptor: 1.0.1
+ is-data-descriptor: 1.0.1
+
is-docker@2.2.1: {}
+ is-extendable@0.1.1: {}
+
+ is-extendable@1.0.1:
+ dependencies:
+ is-plain-object: 2.0.4
+
is-extglob@2.1.1: {}
is-finalizationregistry@1.0.2:
@@ -16004,6 +16729,10 @@ snapshots:
dependencies:
has-tostringtag: 1.0.0
+ is-glob@3.1.0:
+ dependencies:
+ is-extglob: 2.1.1
+
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@@ -16038,6 +16767,10 @@ snapshots:
dependencies:
has-tostringtag: 1.0.0
+ is-number@3.0.0:
+ dependencies:
+ kind-of: 3.2.2
+
is-number@7.0.0: {}
is-obj@1.0.1: {}
@@ -16107,6 +16840,10 @@ snapshots:
call-bind: 1.0.7
get-intrinsic: 1.2.4
+ is-windows@1.0.2: {}
+
+ is-wsl@1.1.0: {}
+
is-wsl@2.2.0:
dependencies:
is-docker: 2.2.1
@@ -16123,6 +16860,10 @@ snapshots:
isexe@2.0.0: {}
+ isobject@2.1.0:
+ dependencies:
+ isarray: 1.0.0
+
isobject@3.0.1: {}
isstream@0.1.2:
@@ -16378,6 +17119,14 @@ snapshots:
dependencies:
json-buffer: 3.0.1
+ kind-of@3.2.2:
+ dependencies:
+ is-buffer: 1.1.6
+
+ kind-of@4.0.0:
+ dependencies:
+ is-buffer: 1.1.6
+
kind-of@6.0.3: {}
kleur@3.0.3: {}
@@ -16426,6 +17175,24 @@ snapshots:
enquirer: 2.4.1
optional: true
+ live-server@1.2.2:
+ dependencies:
+ chokidar: 2.1.8
+ colors: 1.4.0
+ connect: 3.7.0
+ cors: 2.8.5
+ event-stream: 3.3.4
+ faye-websocket: 0.11.4
+ http-auth: 3.1.3
+ morgan: 1.10.0
+ object-assign: 4.1.1
+ opn: 6.0.0
+ proxy-middleware: 0.15.0
+ send: 0.18.0
+ serve-index: 1.9.1
+ transitivePeerDependencies:
+ - supports-color
+
load-bmfont@1.4.1:
dependencies:
buffer-equal: 0.0.1
@@ -16588,12 +17355,20 @@ snapshots:
dependencies:
tmpl: 1.0.5
+ map-cache@0.2.2: {}
+
map-obj@1.0.1: {}
map-obj@4.3.0: {}
map-or-similar@1.5.0: {}
+ map-stream@0.1.0: {}
+
+ map-visit@1.0.0:
+ dependencies:
+ object-visit: 1.0.1
+
markdown-it@14.0.0:
dependencies:
argparse: 2.0.1
@@ -16839,6 +17614,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ micromatch@3.1.10:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ braces: 2.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ extglob: 2.0.4
+ fragment-cache: 0.2.1
+ kind-of: 6.0.3
+ nanomatch: 1.2.13
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
micromatch@4.0.5:
dependencies:
braces: 3.0.2
@@ -17066,6 +17859,11 @@ snapshots:
minipass: 3.3.6
yallist: 4.0.0
+ mixin-deep@1.3.2:
+ dependencies:
+ for-in: 1.0.2
+ is-extendable: 1.0.1
+
mkdirp-classic@0.5.3: {}
mkdirp@0.3.0:
@@ -17092,6 +17890,16 @@ snapshots:
moo@0.5.2: {}
+ morgan@1.10.0:
+ dependencies:
+ basic-auth: 2.0.1
+ debug: 2.6.9
+ depd: 2.0.0
+ on-finished: 2.3.0
+ on-headers: 1.0.2
+ transitivePeerDependencies:
+ - supports-color
+
mri@1.2.0: {}
ms@2.0.0: {}
@@ -17126,6 +17934,22 @@ snapshots:
nanoid@3.3.7: {}
+ nanomatch@1.2.13:
+ dependencies:
+ arr-diff: 4.0.0
+ array-unique: 0.3.2
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ fragment-cache: 0.2.1
+ is-windows: 1.0.2
+ kind-of: 6.0.3
+ object.pick: 1.3.0
+ regex-not: 1.0.2
+ snapdragon: 0.8.2
+ to-regex: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
napi-build-utils@1.0.2: {}
natural-compare-lite@1.4.0: {}
@@ -17263,6 +18087,10 @@ snapshots:
semver: 7.6.0
validate-npm-package-license: 3.0.4
+ normalize-path@2.1.1:
+ dependencies:
+ remove-trailing-separator: 1.1.0
+
normalize-path@3.0.0: {}
npm-run-all@4.1.5:
@@ -17303,6 +18131,12 @@ snapshots:
object-assign@4.1.1: {}
+ object-copy@0.1.0:
+ dependencies:
+ copy-descriptor: 0.1.1
+ define-property: 0.2.5
+ kind-of: 3.2.2
+
object-inspect@1.12.3: {}
object-inspect@1.13.1: {}
@@ -17314,6 +18148,10 @@ snapshots:
object-keys@1.1.1: {}
+ object-visit@1.0.1:
+ dependencies:
+ isobject: 3.0.1
+
object.assign@4.1.4:
dependencies:
call-bind: 1.0.2
@@ -17347,6 +18185,10 @@ snapshots:
es-abstract: 1.23.3
es-object-atoms: 1.0.0
+ object.pick@1.3.0:
+ dependencies:
+ isobject: 3.0.1
+
object.values@1.1.7:
dependencies:
call-bind: 1.0.2
@@ -17362,6 +18204,10 @@ snapshots:
omggif@1.0.10:
optional: true
+ on-finished@2.3.0:
+ dependencies:
+ ee-first: 1.1.1
+
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
@@ -17384,6 +18230,10 @@ snapshots:
opener@1.5.2: {}
+ opn@6.0.0:
+ dependencies:
+ is-wsl: 1.1.0
+
optionator@0.9.3:
dependencies:
'@aashutoshrathi/word-wrap': 1.2.6
@@ -17503,6 +18353,8 @@ snapshots:
no-case: 3.0.4
tslib: 2.6.2
+ pascalcase@0.1.1: {}
+
path-browserify@1.0.1: {}
path-case@3.0.4:
@@ -17510,6 +18362,8 @@ snapshots:
dot-case: 3.0.4
tslib: 2.6.2
+ path-dirname@1.0.2: {}
+
path-exists-cli@2.0.0:
dependencies:
meow: 10.1.5
@@ -17546,6 +18400,10 @@ snapshots:
pathval@1.1.1: {}
+ pause-stream@0.0.11:
+ dependencies:
+ through: 2.3.8
+
pbkdf2@3.1.2:
dependencies:
create-hash: 1.2.0
@@ -17641,6 +18499,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ posix-character-classes@0.1.1: {}
+
possible-typed-array-names@1.0.0: {}
postcss@8.4.31:
@@ -17947,6 +18807,8 @@ snapshots:
proxy-from-env@1.1.0: {}
+ proxy-middleware@0.15.0: {}
+
psl@1.9.0:
optional: true
@@ -18304,6 +19166,14 @@ snapshots:
process: 0.11.10
string_decoder: 1.3.0
+ readdirp@2.2.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ micromatch: 3.1.10
+ readable-stream: 2.3.8
+ transitivePeerDependencies:
+ - supports-color
+
readdirp@3.6.0:
dependencies:
picomatch: 2.3.1
@@ -18359,6 +19229,11 @@ snapshots:
dependencies:
'@babel/runtime': 7.24.5
+ regex-not@1.0.2:
+ dependencies:
+ extend-shallow: 3.0.2
+ safe-regex: 1.1.0
+
regexp-tree@0.1.27: {}
regexp.prototype.flags@1.5.1:
@@ -18431,6 +19306,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ remove-trailing-separator@1.1.0: {}
+
+ repeat-element@1.1.4: {}
+
+ repeat-string@1.6.1: {}
+
request-progress@3.0.0:
dependencies:
throttleit: 1.0.0
@@ -18450,6 +19331,8 @@ snapshots:
resolve-pkg-maps@1.0.0: {}
+ resolve-url@0.2.1: {}
+
resolve@1.22.4:
dependencies:
is-core-module: 2.13.0
@@ -18558,6 +19441,10 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.1.4
+ safe-regex@1.1.0:
+ dependencies:
+ ret: 0.1.15
+
safer-buffer@2.1.2: {}
sanitize-filename@1.6.3:
@@ -18629,6 +19516,18 @@ snapshots:
dependencies:
randombytes: 2.1.0
+ serve-index@1.9.1:
+ dependencies:
+ accepts: 1.3.8
+ batch: 0.6.1
+ debug: 2.6.9
+ escape-html: 1.0.3
+ http-errors: 1.6.3
+ mime-types: 2.1.35
+ parseurl: 1.3.3
+ transitivePeerDependencies:
+ - supports-color
+
serve-static@1.15.0:
dependencies:
encodeurl: 1.0.2
@@ -18665,8 +19564,17 @@ snapshots:
set-harmonic-interval@1.0.1: {}
+ set-value@2.0.1:
+ dependencies:
+ extend-shallow: 2.0.1
+ is-extendable: 0.1.1
+ is-plain-object: 2.0.4
+ split-string: 3.1.0
+
setimmediate@1.0.5: {}
+ setprototypeof@1.1.0: {}
+
setprototypeof@1.2.0: {}
sha.js@2.4.11:
@@ -18786,6 +19694,29 @@ snapshots:
dot-case: 3.0.4
tslib: 2.6.2
+ snapdragon-node@2.1.1:
+ dependencies:
+ define-property: 1.0.0
+ isobject: 3.0.1
+ snapdragon-util: 3.0.1
+
+ snapdragon-util@3.0.1:
+ dependencies:
+ kind-of: 3.2.2
+
+ snapdragon@0.8.2:
+ dependencies:
+ base: 0.11.2
+ debug: 2.6.9
+ define-property: 0.2.5
+ extend-shallow: 2.0.1
+ map-cache: 0.2.2
+ source-map: 0.5.7
+ source-map-resolve: 0.5.3
+ use: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
socket.io-adapter@1.1.2:
optional: true
@@ -18898,11 +19829,21 @@ snapshots:
source-map-js@1.2.0: {}
+ source-map-resolve@0.5.3:
+ dependencies:
+ atob: 2.1.2
+ decode-uri-component: 0.2.2
+ resolve-url: 0.2.1
+ source-map-url: 0.4.1
+ urix: 0.1.0
+
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
+ source-map-url@0.4.1: {}
+
source-map@0.5.6: {}
source-map@0.5.7: {}
@@ -18931,6 +19872,14 @@ snapshots:
spdx-license-ids@3.0.13: {}
+ split-string@3.1.0:
+ dependencies:
+ extend-shallow: 3.0.2
+
+ split@0.3.3:
+ dependencies:
+ through: 2.3.8
+
sprintf-js@1.0.3: {}
sshpk@1.17.0:
@@ -18970,10 +19919,17 @@ snapshots:
stack-generator: 2.0.10
stacktrace-gps: 3.1.2
+ static-extend@0.1.2:
+ dependencies:
+ define-property: 0.2.5
+ object-copy: 0.1.0
+
stats-gl@1.0.5: {}
stats.js@0.17.0: {}
+ statuses@1.5.0: {}
+
statuses@2.0.1: {}
std-env@3.4.3: {}
@@ -18994,6 +19950,10 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
+ stream-combiner@0.0.4:
+ dependencies:
+ duplexer: 0.1.2
+
stream-http@3.2.0:
dependencies:
builtin-status-codes: 3.0.0
@@ -19279,8 +20239,7 @@ snapshots:
readable-stream: 2.3.8
xtend: 4.0.2
- through@2.3.8:
- optional: true
+ through@2.3.8: {}
timers-browserify@2.0.12:
dependencies:
@@ -19316,10 +20275,26 @@ snapshots:
to-fast-properties@2.0.0: {}
+ to-object-path@0.3.0:
+ dependencies:
+ kind-of: 3.2.2
+
+ to-regex-range@2.1.1:
+ dependencies:
+ is-number: 3.0.0
+ repeat-string: 1.6.1
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
+ to-regex@3.0.2:
+ dependencies:
+ define-property: 2.0.2
+ extend-shallow: 3.0.2
+ regex-not: 1.0.2
+ safe-regex: 1.1.0
+
tocbot@4.21.2: {}
toggle-selection@1.0.6: {}
@@ -19532,6 +20507,13 @@ snapshots:
trough: 2.2.0
vfile: 6.0.1
+ union-value@1.0.1:
+ dependencies:
+ arr-union: 3.1.0
+ get-value: 2.0.6
+ is-extendable: 0.1.1
+ set-value: 2.0.1
+
union@0.5.0:
dependencies:
qs: 6.11.2
@@ -19590,6 +20572,8 @@ snapshots:
universalify@2.0.0: {}
+ unix-crypt-td-js@1.1.4: {}
+
unpipe@1.0.0: {}
unplugin@1.5.0:
@@ -19599,6 +20583,11 @@ snapshots:
webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0
+ unset-value@1.0.0:
+ dependencies:
+ has-value: 0.3.1
+ isobject: 3.0.1
+
untildify@4.0.0: {}
upath@1.2.0: {}
@@ -19627,6 +20616,8 @@ snapshots:
dependencies:
punycode: 2.3.0
+ urix@0.1.0: {}
+
url-join@4.0.1: {}
url-parse@1.5.10:
@@ -19684,6 +20675,8 @@ snapshots:
optionalDependencies:
typescript: 5.5.4
+ use@3.1.1: {}
+
utf8-byte-length@1.0.4: {}
utif@2.0.1:
@@ -19707,6 +20700,8 @@ snapshots:
dependencies:
macaddress: 0.5.3
+ uuid@3.4.0: {}
+
uuid@8.3.2: {}
uuid@9.0.1: {}
@@ -19914,6 +20909,14 @@ snapshots:
dependencies:
sdp: 3.2.0
+ websocket-driver@0.7.4:
+ dependencies:
+ http-parser-js: 0.5.8
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+
+ websocket-extensions@0.1.4: {}
+
whatwg-encoding@2.0.0:
dependencies:
iconv-lite: 0.6.3
diff --git a/prismarine-viewer/esbuild.mjs b/prismarine-viewer/esbuild.mjs
index 90741ee1..e410c8b6 100644
--- a/prismarine-viewer/esbuild.mjs
+++ b/prismarine-viewer/esbuild.mjs
@@ -6,20 +6,19 @@ import * as esbuild from 'esbuild'
import { polyfillNode } from 'esbuild-plugin-polyfill-node'
import path, { dirname, join } from 'path'
import { fileURLToPath } from 'url'
+import childProcess from 'child_process'
+import supportedVersions from '../src/supportedVersions.mjs'
const dev = process.argv.includes('-w')
const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url)))
-const mcDataPath = join(__dirname, '../dist/mc-data')
+const mcDataPath = join(__dirname, '../generated/minecraft-data-optimized.json')
if (!fs.existsSync(mcDataPath)) {
- // shouldn't it be in the viewer instead?
- await import('../scripts/prepareData.mjs')
+ childProcess.execSync('tsx ../scripts/makeOptimizedMcData.mjs', { stdio: 'inherit', cwd: __dirname })
}
fs.copyFileSync(join(__dirname, 'playground.html'), join(__dirname, 'public/index.html'))
-fsExtra.copySync(mcDataPath, join(__dirname, 'public/mc-data'))
-const availableVersions = fs.readdirSync(mcDataPath).map(ver => ver.replace('.js', ''))
/** @type {import('esbuild').BuildOptions} */
const buildOptions = {
@@ -37,7 +36,7 @@ const buildOptions = {
],
keepNames: true,
banner: {
- js: `globalThis.global = globalThis;globalThis.includedVersions = ${JSON.stringify(availableVersions)};`,
+ js: `globalThis.global = globalThis;globalThis.includedVersions = ${JSON.stringify(supportedVersions)};`,
},
alias: {
events: 'events',
@@ -63,13 +62,14 @@ const buildOptions = {
}, () => {
const defaultVersionsObj = {}
return {
- contents: `window.mcData ??= ${JSON.stringify(defaultVersionsObj)};module.exports = { pc: window.mcData }`,
- loader: 'js',
+ contents: fs.readFileSync(join(__dirname, '../src/shims/minecraftData.ts'), 'utf8'),
+ loader: 'ts',
+ resolveDir: join(__dirname, '../src/shims'),
}
})
build.onEnd((e) => {
if (e.errors.length) return
- // fs.writeFileSync(join(__dirname, 'dist/metafile.json'), JSON.stringify(e.metafile), 'utf8')
+ fs.writeFileSync(join(__dirname, './public/metafile.json'), JSON.stringify(e.metafile), 'utf8')
})
}
},
diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts
index 28dcceef..1726fe86 100644
--- a/prismarine-viewer/examples/playground.ts
+++ b/prismarine-viewer/examples/playground.ts
@@ -15,6 +15,7 @@ import { loadScript } from '../viewer/lib/utils'
import { TWEEN_DURATION } from '../viewer/lib/entities'
import { EntityMesh } from '../viewer/lib/entity/EntityMesh'
import { WorldDataEmitter, Viewer } from '../viewer'
+import '../../src/getCollisionShapes'
import { toMajorVersion } from '../../src/utils'
window.THREE = THREE
@@ -65,21 +66,21 @@ async function main () {
let continuousRender = false
const { version } = params
+ await window._LOAD_MC_DATA()
// temporary solution until web worker is here, cache data for faster reloads
- const globalMcData = window['mcData']
- if (!globalMcData['version']) {
- const major = toMajorVersion(version)
- const sessionKey = `mcData-${major}`
- if (sessionStorage[sessionKey]) {
- Object.assign(globalMcData, JSON.parse(sessionStorage[sessionKey]))
- } else {
- if (sessionStorage.length > 1) sessionStorage.clear()
- await loadScript(`./mc-data/${major}.js`)
- try {
- sessionStorage[sessionKey] = JSON.stringify(Object.fromEntries(Object.entries(globalMcData).filter(([ver]) => ver.startsWith(major))))
- } catch { }
- }
- }
+ // const globalMcData = window['mcData']
+ // if (!globalMcData['version']) {
+ // const major = toMajorVersion(version)
+ // const sessionKey = `mcData-${major}`
+ // if (sessionStorage[sessionKey]) {
+ // Object.assign(globalMcData, JSON.parse(sessionStorage[sessionKey]))
+ // } else {
+ // if (sessionStorage.length > 1) sessionStorage.clear()
+ // try {
+ // sessionStorage[sessionKey] = JSON.stringify(Object.fromEntries(Object.entries(globalMcData).filter(([ver]) => ver.startsWith(major))))
+ // } catch { }
+ // }
+ // }
const mcData: IndexedData = require('minecraft-data')(version)
window['loadedData'] = mcData
diff --git a/prismarine-viewer/package.json b/prismarine-viewer/package.json
index d0ea3826..02b0a304 100644
--- a/prismarine-viewer/package.json
+++ b/prismarine-viewer/package.json
@@ -38,5 +38,8 @@
"optionalDependencies": {
"canvas": "^2.11.2",
"node-canvas-webgl": "^0.3.0"
+ },
+ "devDependencies": {
+ "live-server": "^1.2.2"
}
}
diff --git a/prismarine-viewer/viewer/lib/worldrendererCommon.ts b/prismarine-viewer/viewer/lib/worldrendererCommon.ts
index 204ad65f..58e5a6f5 100644
--- a/prismarine-viewer/viewer/lib/worldrendererCommon.ts
+++ b/prismarine-viewer/viewer/lib/worldrendererCommon.ts
@@ -2,7 +2,7 @@
import { EventEmitter } from 'events'
import { Vec3 } from 'vec3'
import * as THREE from 'three'
-import mcDataRaw from 'minecraft-data/data.js' // handled correctly in esbuild plugin
+import mcDataRaw from 'minecraft-data/data.js' // note: using alias
import blocksAtlases from 'mc-assets/dist/blocksAtlases.json'
import blocksAtlasLatest from 'mc-assets/dist/blocksAtlasLatest.png'
import blocksAtlasLegacy from 'mc-assets/dist/blocksAtlasLegacy.png'
@@ -223,8 +223,12 @@ export abstract class WorldRendererCommon
sendMesherMcData () {
const allMcData = mcDataRaw.pc[this.version] ?? mcDataRaw.pc[toMajorVersion(this.version)]
- const mcData = Object.fromEntries(Object.entries(allMcData).filter(([key]) => dynamicMcDataFiles.includes(key)))
- mcData.version = JSON.parse(JSON.stringify(mcData.version))
+ const mcData = {
+ version: JSON.parse(JSON.stringify(allMcData.version))
+ }
+ for (const key of dynamicMcDataFiles) {
+ mcData[key] = allMcData[key]
+ }
for (const worker of this.workers) {
worker.postMessage({ type: 'mcData', mcData, config: this.mesherConfig })
diff --git a/rsbuild.config.ts b/rsbuild.config.ts
index fd05db8a..588cc35d 100644
--- a/rsbuild.config.ts
+++ b/rsbuild.config.ts
@@ -101,9 +101,10 @@ export default defineConfig({
const prep = async () => {
console.time('total-prep')
fs.mkdirSync('./generated', { recursive: true })
- if (!fs.existsSync('./generated/minecraft-data-data.js')) {
- childProcess.execSync('tsx ./scripts/genShims.ts', { stdio: 'inherit' })
+ if (!fs.existsSync('./generated/minecraft-data-optimized.json') || require('./generated/minecraft-data-optimized.json').versionKey !== require('minecraft-data/package.json').version) {
+ childProcess.execSync('tsx ./scripts/makeOptimizedMcData.mjs', { stdio: 'inherit' })
}
+ childProcess.execSync('tsx ./scripts/genShims.ts', { stdio: 'inherit' })
if (!fs.existsSync('./generated/latestBlockCollisionsShapes.json')) {
childProcess.execSync('tsx ./scripts/optimizeBlockCollisions.ts', { stdio: 'inherit' })
}
@@ -117,7 +118,6 @@ export default defineConfig({
configJson.defaultProxy = ':8080'
}
fs.writeFileSync('./dist/config.json', JSON.stringify(configJson), 'utf8')
- childProcess.execSync('node ./scripts/prepareData.mjs', { stdio: 'inherit' })
// childProcess.execSync('./scripts/prepareSounds.mjs', { stdio: 'inherit' })
// childProcess.execSync('tsx ./scripts/genMcDataTypes.ts', { stdio: 'inherit' })
// childProcess.execSync('tsx ./scripts/genPixelartTypes.ts', { stdio: 'inherit' })
@@ -164,7 +164,7 @@ export default defineConfig({
// throw new Error(`${resource.request} was requested by ${resource.contextInfo.issuer}`)
}
if (absolute.endsWith('/minecraft-data/data.js')) {
- resource.request = path.join(__dirname, './generated/minecraft-data-data.js')
+ resource.request = path.join(__dirname, './src/shims/minecraftData.ts')
}
}))
addRules([
diff --git a/scripts/build.js b/scripts/build.js
index 7d3dc3fc..9b8a85a5 100644
--- a/scripts/build.js
+++ b/scripts/build.js
@@ -45,7 +45,6 @@ exports.getSwAdditionalEntries = () => {
// need to be careful with this
const filesToCachePatterns = [
'index.html',
- `mc-data/${defaultLocalServerOptions.versionMajor}.js`,
'background/**',
// todo-low copy from assets
'*.mp3',
diff --git a/scripts/genShims.ts b/scripts/genShims.ts
index e688e525..0ee8d91e 100644
--- a/scripts/genShims.ts
+++ b/scripts/genShims.ts
@@ -1,24 +1,7 @@
import fs from 'fs'
-import MinecraftData from 'minecraft-data'
-import MCProtocol from 'minecraft-protocol'
import { appReplacableResources } from '../src/resourcesSource'
-const { supportedVersions, defaultVersion } = MCProtocol
-
-// gen generated/minecraft-data-data.js
-
-const data = MinecraftData(defaultVersion)
-const defaultVersionObj = {
- [defaultVersion]: {
- version: data.version,
- protocol: data.protocol,
- }
-}
-
-const mcDataContents = `window.mcData ??= ${JSON.stringify(defaultVersionObj)};module.exports = { pc: window.mcData }`
-
fs.mkdirSync('./generated', { recursive: true })
-fs.writeFileSync('./generated/minecraft-data-data.js', mcDataContents, 'utf8')
// app resources
diff --git a/scripts/makeOptimizedMcData.mjs b/scripts/makeOptimizedMcData.mjs
new file mode 100644
index 00000000..d0adcae2
--- /dev/null
+++ b/scripts/makeOptimizedMcData.mjs
@@ -0,0 +1,230 @@
+//@ts-check
+import { build } from 'esbuild'
+import { existsSync } from 'node:fs'
+import Module from "node:module"
+import { dirname } from 'node:path'
+import supportedVersions from '../src/supportedVersions.mjs'
+import { gzipSizeFromFileSync } from 'gzip-size'
+import fs from 'fs'
+import {default as _JsonOptimizer} from '../src/optimizeJson'
+import { gzipSync } from 'zlib';
+import MinecraftData from 'minecraft-data'
+import MCProtocol from 'minecraft-protocol'
+
+/** @type {typeof _JsonOptimizer} */
+//@ts-ignore
+const JsonOptimizer = _JsonOptimizer.default
+
+// console.log(a.diff_main(JSON.stringify({ a: 1 }), JSON.stringify({ a: 1, b: 2 })))
+
+const require = Module.createRequire(import.meta.url)
+
+const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json')
+
+function toMajor (version) {
+ const [a, b] = (version + '').split('.')
+ return `${a}.${b}`
+}
+
+const versions = {}
+const dataTypes = new Set()
+
+for (const [version, dataSet] of Object.entries(dataPaths.pc)) {
+ if (!supportedVersions.includes(version)) continue
+ for (const type of Object.keys(dataSet)) {
+ dataTypes.add(type)
+ }
+ versions[version] = dataSet
+}
+
+const versionToNumber = (ver) => {
+ const [x, y = '0', z = '0'] = ver.split('.')
+ return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}`
+}
+
+// if not included here (even as {}) will not be bundled & accessible!
+const compressedOutput = false
+// const dataTypeBundling = {
+// protocol: {
+// // ignoreRemoved: true,
+// // ignoreChanges: true
+// }
+// }
+const dataTypeBundling = {
+ language: {
+ ignoreRemoved: true,
+ ignoreChanges: true
+ },
+ blocks: {
+ arrKey: 'name',
+ // ignoreRemoved: true,
+ // genChanges (source, diff) {
+ // const diffs = {}
+ // const newItems = {}
+ // for (const [key, val] of Object.entries(diff)) {
+ // const src = source[key]
+ // if (!src) {
+ // newItems[key] = val
+ // continue
+ // }
+ // const { minStateId, defaultState, maxStateId } = val
+ // if (defaultState === undefined || minStateId === src.minStateId || maxStateId === src.maxStateId || defaultState === src.defaultState) continue
+ // diffs[key] = [minStateId, defaultState, maxStateId]
+ // }
+ // return {
+ // stateChanges: diffs
+ // }
+ // },
+ // ignoreChanges: true
+ },
+ items: {
+ arrKey: 'name'
+ },
+ attributes: {
+ arrKey: 'name'
+ },
+ particles: {
+ arrKey: 'name'
+ },
+ effects: {
+ arrKey: 'name'
+ },
+ enchantments: {
+ arrKey: 'name'
+ },
+ instruments: {
+ arrKey: 'name'
+ },
+ foods: {
+ arrKey: 'name'
+ },
+ entities: {
+ arrKey: 'id+type'
+ },
+ materials: {},
+ windows: {
+ arrKey: 'name'
+ },
+ version: {
+ raw: true
+ },
+ tints: {},
+ biomes: {
+ arrKey: 'name'
+ },
+ entityLoot: {
+ arrKey: 'entity'
+ },
+ blockLoot: {
+ arrKey: 'block'
+ },
+ recipes: {}, // todo we can do better
+ blockCollisionShapes: {},
+ loginPacket: {},
+ protocol: {
+ raw: true
+ },
+ sounds: {
+ arrKey: 'name'
+ }
+}
+
+const notBundling = [...dataTypes.keys()].filter(x => !Object.keys(dataTypeBundling).includes(x))
+console.log("Not bundling minecraft-data data:", notBundling)
+
+let previousData = {}
+// /** @type {Record} */
+const diffSources = {}
+const versionsArr = Object.entries(versions)
+const sizePerDataType = {}
+const rawDataVersions = {}
+// const versionsArr = Object.entries(versions).slice(-1)
+for (const [i, [version, dataSet]] of versionsArr.reverse().entries()) {
+ for (const [dataType, dataPath] of Object.entries(dataSet)) {
+ const config = dataTypeBundling[dataType]
+ if (!config) continue
+ if (dataType === 'blockCollisionShapes' && versionToNumber(version) >= versionToNumber('1.13')) {
+ // contents += ` get ${dataType} () { return window.globalGetCollisionShapes?.("${version}") },\n`
+ continue
+ }
+ const loc = `minecraft-data/data/${dataPath}/`
+ const dataPathAbsolute = require.resolve(`minecraft-data/${loc}${dataType}`)
+ // const data = fs.readFileSync(dataPathAbsolute, 'utf8')
+ const dataRaw = require(dataPathAbsolute)
+ let injectCode = ''
+ let rawData = dataRaw
+ if (config.raw) {
+ rawDataVersions[dataType] ??= {}
+ rawDataVersions[dataType][version] = rawData
+ rawData = dataRaw
+ } else {
+ if (!diffSources[dataType]) {
+ diffSources[dataType] = new JsonOptimizer(config.arrKey, config.ignoreChanges, config.ignoreRemoved)
+ }
+ try {
+ diffSources[dataType].recordDiff(version, dataRaw)
+ injectCode = `restoreDiff(sources, ${JSON.stringify(dataType)}, ${JSON.stringify(version)})`
+ } catch (err) {
+ const error = new Error(`Failed to diff ${dataType} for ${version}: ${err.message}`)
+ error.stack = err.stack
+ throw error
+ }
+ }
+ sizePerDataType[dataType] ??= 0
+ sizePerDataType[dataType] += Buffer.byteLength(JSON.stringify(injectCode || rawData), 'utf8')
+ if (config.genChanges && previousData[dataType]) {
+ const changes = config.genChanges(previousData[dataType], dataRaw)
+ // Object.assign(data, changes)
+ }
+ previousData[dataType] = dataRaw
+ }
+}
+const sources = Object.fromEntries(Object.entries(diffSources).map(x => {
+ const data = x[1].export()
+ // const data = {}
+ sizePerDataType[x[0]] += Buffer.byteLength(JSON.stringify(data), 'utf8')
+ return [x[0], data]
+}))
+Object.assign(sources, rawDataVersions)
+sources.versionKey = require('minecraft-data/package.json').version
+
+const totalSize = Object.values(sizePerDataType).reduce((acc, val) => acc + val, 0)
+console.log('total size (mb)', totalSize / 1024 / 1024)
+console.log(
+ 'size per data type (mb, %)',
+ Object.fromEntries(Object.entries(sizePerDataType).map(([dataType, size]) => {
+ return [dataType, [size / 1024 / 1024, Math.round(size / totalSize * 100)]];
+ }).sort((a, b) => {
+ //@ts-ignore
+ return b[1][1] - a[1][1];
+ }))
+)
+
+function compressToBase64(input) {
+ const buffer = gzipSync(input);
+ return buffer.toString('base64');
+}
+
+const filePath = './generated/minecraft-data-optimized.json'
+fs.writeFileSync(filePath, JSON.stringify(sources), 'utf8')
+if (compressedOutput) {
+ const minizedCompressed = compressToBase64(fs.readFileSync(filePath))
+ console.log('size of compressed', Buffer.byteLength(minizedCompressed, 'utf8') / 1000 / 1000)
+ const compressedFilePath = './experiments/compressed.js'
+ fs.writeFileSync(compressedFilePath, minizedCompressed, 'utf8')
+}
+
+console.log('size', fs.lstatSync(filePath).size / 1000 / 1000, gzipSizeFromFileSync(filePath) / 1000 / 1000)
+
+// always bundled
+
+const { defaultVersion } = MCProtocol
+const data = MinecraftData(defaultVersion)
+const initialMcData = {
+ [defaultVersion]: {
+ version: data.version,
+ protocol: data.protocol,
+ }
+}
+
+fs.writeFileSync('./generated/minecraft-initial-data.json', JSON.stringify(initialMcData), 'utf8')
diff --git a/scripts/prepareData.mjs b/scripts/prepareData.mjs
deleted file mode 100644
index ab92499e..00000000
--- a/scripts/prepareData.mjs
+++ /dev/null
@@ -1,72 +0,0 @@
-//@ts-check
-import { build } from 'esbuild'
-import { existsSync } from 'node:fs'
-import Module from "node:module"
-import { dirname } from 'node:path'
-import supportedVersions from '../src/supportedVersions.mjs'
-
-if (existsSync('dist/mc-data') && !process.argv.includes('-f')) {
- console.log('using cached prepared data')
- process.exit(0)
-}
-
-const require = Module.createRequire(import.meta.url)
-
-const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json')
-
-function toMajor (version) {
- const [a, b] = (version + '').split('.')
- return `${a}.${b}`
-}
-
-const grouped = {}
-
-for (const [version, data] of Object.entries(dataPaths.pc)) {
- if (!supportedVersions.includes(version)) continue
- const major = toMajor(version)
- grouped[major] ??= {}
- grouped[major][version] = data
-}
-
-const versionToNumber = (ver) => {
- const [x, y = '0', z = '0'] = ver.split('.')
- return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}`
-}
-
-console.log('preparing data')
-console.time('data prepared')
-let builds = []
-for (const [major, versions] of Object.entries(grouped)) {
- // if (major !== '1.19') continue
- let contents = 'Object.assign(window.mcData, {\n'
- for (const [version, dataSet] of Object.entries(versions)) {
- contents += ` '${version}': {\n`
- for (const [dataType, dataPath] of Object.entries(dataSet)) {
- if (dataType === 'blockCollisionShapes' && versionToNumber(version) >= versionToNumber('1.13')) {
- contents += ` get ${dataType} () { return window.globalGetCollisionShapes?.("${version}") },\n`
- continue
- }
- const loc = `minecraft-data/data/${dataPath}/`
- contents += ` get ${dataType} () { return require("./${loc}${dataType}.json") },\n`
- }
- contents += ' },\n'
- }
- contents += '})'
-
- const promise = build({
- bundle: true,
- outfile: `dist/mc-data/${major}.js`,
- stdin: {
- contents,
-
- resolveDir: dirname(require.resolve('minecraft-data')),
- sourcefile: `mcData${major}.js`,
- loader: 'js',
- },
- metafile: true,
- })
- // require('fs').writeFileSync('dist/mc-data/metafile.json', JSON.stringify(promise.metafile), 'utf8')
- builds.push(promise)
-}
-await Promise.all(builds)
-console.timeEnd('data prepared')
diff --git a/scripts/testOptimizedMcdata.ts b/scripts/testOptimizedMcdata.ts
new file mode 100644
index 00000000..17b5f7ed
--- /dev/null
+++ b/scripts/testOptimizedMcdata.ts
@@ -0,0 +1,99 @@
+import assert from 'assert'
+import JsonOptimizer from '../src/optimizeJson';
+import fs from 'fs'
+import minecraftData from 'minecraft-data'
+
+const json = JSON.parse(fs.readFileSync('./generated/minecraft-data-optimized.json', 'utf8'))
+
+const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json')
+
+const validateData = (ver, type) => {
+ const target = JsonOptimizer.restoreData(json[type], ver)
+ const arrKey = json[type].arrKey
+ const originalPath = dataPaths.pc[ver][type]
+ const original = require(`minecraft-data/minecraft-data/data/${originalPath}/${type}.json`)
+ if (arrKey) {
+ const originalKeys = original.map(a => JsonOptimizer.getByArrKey(a, arrKey)) as string[]
+ for (const [i, item] of originalKeys.entries()) {
+ if (originalKeys.indexOf(item) !== i) {
+ console.warn(`${type} ${ver} Incorrect source, duplicated arrKey (${arrKey}) ${item}. Ignoring!`) // todo should span instead
+ const index = originalKeys.indexOf(item);
+ original.splice(index, 1)
+ originalKeys.splice(index, 1)
+ }
+ }
+ // if (target.length !== originalKeys.length) {
+ // throw new Error(`wrong arr length: ${target.length} !== ${original.length}`)
+ // }
+ checkKeys(originalKeys, target.map(a => JsonOptimizer.getByArrKey(a, arrKey)))
+ for (const item of target as any[]) {
+ const keys = Object.entries(item).map(a => a[0])
+ const origItem = original.find(a => JsonOptimizer.getByArrKey(a, arrKey) === JsonOptimizer.getByArrKey(item, arrKey));
+ const keysSource = Object.entries(origItem).map(a => a[0])
+ checkKeys(keysSource, keys, true, 'prop keys', true)
+ checkObj(origItem, item)
+ }
+ } else {
+ const keysOriginal = Object.keys(original)
+ const keysTarget = Object.keys(target)
+ checkKeys(keysOriginal, keysTarget)
+ for (const key of keysTarget) {
+ checkObj(original[key], target[key])
+ }
+ }
+}
+
+const checkObj = (source, diffing) => {
+ checkKeys(Object.keys(source), Object.keys(diffing))
+ for (const [key, val] of Object.entries(source)) {
+ if (JSON.stringify(val) !== JSON.stringify(diffing[key])) {
+ throw new Error(`different value of ${key}: ${val} ${diffing[key]}`)
+ }
+ }
+}
+
+const checkKeys = (source, diffing, isUniq = true, msg = '', redunantOk = false) => {
+ if (isUniq) {
+ for (const [i, item] of diffing.entries()) {
+ if (diffing.indexOf(item) !== i) {
+ throw new Error(`Duplicate: ${item}: ${i} ${diffing.indexOf(item)} ${msg}`)
+ }
+ }
+ }
+ for (const key of source) {
+ if (!diffing.includes(key)) {
+ throw new Error(`Diffing does not include "${key}" (${msg})`)
+ }
+ }
+ if (!redunantOk) {
+ for (const key of diffing) {
+ if (!source.includes(key)) {
+ throw new Error(`Source does not include "${key}" (${msg})`)
+ }
+ }
+ }
+}
+
+// const data = minecraftData('1.20.4')
+const oldId = JsonOptimizer.restoreData(json['blocks'], '1.20').find(x => x.name === 'brown_stained_glass').id;
+const newId = JsonOptimizer.restoreData(json['blocks'], '1.20.4').find(x => x.name === 'brown_stained_glass').id;
+assert(oldId !== newId)
+// test all types + all versions
+
+for (const type of Object.keys(json)) {
+ if (!json[type].__IS_OPTIMIZED__) continue
+ if (type === 'language') continue // we have loose data for language for size reasons
+ console.log('validating', type)
+ const source = json[type]
+ let checkedVer = 0
+ for (const ver of Object.keys(source.diffs)) {
+ try {
+ validateData(ver, type)
+ } catch (err) {
+ err.message = `Failed to validate ${type} for ${ver}: ${err.message}`
+ throw err;
+ }
+ checkedVer++
+ }
+ console.log('Checked versions:', checkedVer)
+}
diff --git a/src/getCollisionInteractionShapes.ts b/src/getCollisionInteractionShapes.ts
new file mode 100644
index 00000000..9dead22b
--- /dev/null
+++ b/src/getCollisionInteractionShapes.ts
@@ -0,0 +1,17 @@
+import { getRenamedData } from 'flying-squid/dist/blockRenames'
+import outputInteractionShapesJson from './interactionShapesGenerated.json'
+import './getCollisionShapes'
+
+export default () => {
+ customEvents.on('gameLoaded', () => {
+ // todo also remap block states (e.g. redstone)!
+ const renamedBlocksInteraction = getRenamedData('blocks', Object.keys(outputInteractionShapesJson), '1.20.2', bot.version)
+ const interactionShapes = {
+ ...outputInteractionShapesJson,
+ ...Object.fromEntries(Object.entries(outputInteractionShapesJson).map(([block, shape], i) => [renamedBlocksInteraction[i], shape]))
+ }
+ interactionShapes[''] = interactionShapes['air']
+ // todo make earlier
+ window.interactionShapes = interactionShapes
+ })
+}
diff --git a/src/getCollisionShapes.ts b/src/getCollisionShapes.ts
index 4ee0e802..383adc0e 100644
--- a/src/getCollisionShapes.ts
+++ b/src/getCollisionShapes.ts
@@ -1,6 +1,5 @@
import { getRenamedData } from 'flying-squid/dist/blockRenames'
import collisionShapesInit from '../generated/latestBlockCollisionsShapes.json'
-import outputInteractionShapesJson from './interactionShapesGenerated.json'
// defining globally to be used in loaded data, not sure of better workaround
window.globalGetCollisionShapes = (version) => {
@@ -13,17 +12,3 @@ window.globalGetCollisionShapes = (version) => {
}
return collisionShapes
}
-
-export default () => {
- customEvents.on('gameLoaded', () => {
- // todo also remap block states (e.g. redstone)!
- const renamedBlocksInteraction = getRenamedData('blocks', Object.keys(outputInteractionShapesJson), '1.20.2', bot.version)
- const interactionShapes = {
- ...outputInteractionShapesJson,
- ...Object.fromEntries(Object.entries(outputInteractionShapesJson).map(([block, shape], i) => [renamedBlocksInteraction[i], shape]))
- }
- interactionShapes[''] = interactionShapes['air']
- // todo make earlier
- window.interactionShapes = interactionShapes
- })
-}
diff --git a/src/index.ts b/src/index.ts
index c9040e35..39a110a3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -5,7 +5,7 @@ import './globals'
import './devtools'
import './entities'
import './globalDomListeners'
-import initCollisionShapes from './getCollisionShapes'
+import initCollisionShapes from './getCollisionInteractionShapes'
import { onGameLoad } from './inventoryWindows'
import { supportedVersions } from 'minecraft-protocol'
import protocolMicrosoftAuth from 'minecraft-protocol/src/client/microsoftAuth'
@@ -380,6 +380,7 @@ async function connect (connectOptions: ConnectOptions) {
try {
const serverOptions = defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions)
Object.assign(serverOptions, connectOptions.serverOverridesFlat ?? {})
+ window._LOAD_MC_DATA() // start loading data (if not loaded yet)
const downloadMcData = async (version: string) => {
if (connectOptions.authenticatedAccount && versionToNumber(version) < versionToNumber('1.19.4')) {
// todo support it (just need to fix .export crash)
@@ -392,13 +393,13 @@ async function connect (connectOptions: ConnectOptions) {
// ignore cache hit
versionsByMinecraftVersion.pc[lastVersion]!['dataVersion']!++
}
+ setLoadingScreenStatus(`Loading data for ${version}`)
if (!document.fonts.check('1em mojangles')) {
// todo instead re-render signs on load
await document.fonts.load('1em mojangles').catch(() => { })
}
- setLoadingScreenStatus(`Downloading data for ${version}`)
+ await window._MC_DATA_RESOLVER.promise // ensure data is loaded
await downloadSoundsIfNeeded()
- await loadScript(`./mc-data/${toMajorVersion(version)}.js`)
miscUiState.loadedDataVersion = version
try {
await resourcepackReload(version)
diff --git a/src/optimizeJson.ts b/src/optimizeJson.ts
new file mode 100644
index 00000000..442a72a1
--- /dev/null
+++ b/src/optimizeJson.ts
@@ -0,0 +1,264 @@
+import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils'
+
+type IdMap = Record
+
+type DiffData = {
+ removed: number[],
+ changed: any[],
+ removedProps: Array<[number, number[]]>,
+ added
+}
+
+type SourceData = {
+ keys: IdMap,
+ properties: IdMap
+ source: Record
+ diffs: Record
+ arrKey?
+ __IS_OPTIMIZED__: true
+}
+
+export default class JsonOptimizer {
+ keys = {} as IdMap
+ idToKey = {} as Record
+ properties = {} as IdMap
+ source = {}
+ previousKeys = [] as number[]
+ previousValues = {} as Record
+ diffs = {} as Record
+
+ constructor (public arrKey?: string, public ignoreChanges = false, public ignoreRemoved = false) { }
+
+ export () {
+ const { keys, properties, source, arrKey, diffs } = this
+ return {
+ keys,
+ properties,
+ source,
+ arrKey,
+ diffs,
+ '__IS_OPTIMIZED__': true
+ } satisfies SourceData
+ }
+
+ diffObj (diffing): DiffData {
+ const removed = [] as number[]
+ const changed = [] as any[]
+ const removedProps = [] as any[]
+ const { arrKey, ignoreChanges, ignoreRemoved } = this
+ const added = [] as number[]
+
+ if (!diffing || typeof diffing !== 'object') throw new Error('diffing data is not object')
+ if (Array.isArray(diffing) && !arrKey) throw new Error('arrKey is required for arrays')
+ const diffingObj = Array.isArray(diffing) ? Object.fromEntries(diffing.map(x => {
+ const key = JsonOptimizer.getByArrKey(x, arrKey!)
+ return [key, x]
+ })) : diffing
+
+ const possiblyNewKeys = Object.keys(diffingObj)
+ this.keys ??= {}
+ this.properties ??= {}
+ let lastRootKeyId = Object.values(this.keys).length
+ let lastItemKeyId = Object.values(this.properties).length
+ for (const key of possiblyNewKeys) {
+ this.keys[key] ??= lastRootKeyId++
+ this.idToKey[this.keys[key]] = key
+ }
+ const DEBUG = false
+
+ const addDiff = (key, newVal, prevVal) => {
+ const valueMapped = [] as any[]
+ const isItemObj = typeof newVal === 'object' && newVal
+ const keyId = this.keys[key]
+ if (isItemObj) {
+ const removedPropsLocal = [] as any[]
+ for (const [prop, val] of Object.entries(newVal)) {
+ // mc-data: why push only changed props? eg for blocks only stateId are different between all versions so we skip a lot of duplicated data like block props
+ if (!isEqualStructured(newVal[prop], prevVal[prop])) {
+ let keyMapped = this.properties[prop]
+ if (keyMapped === undefined) {
+ this.properties[prop] = lastItemKeyId++
+ keyMapped = this.properties[prop]
+ }
+ valueMapped.push(DEBUG ? prop : keyMapped, newVal[prop])
+ }
+ }
+ // also add undefined for removed props
+ for (const prop of Object.keys(prevVal)) {
+ if (prop in newVal) continue
+ let keyMapped = this.properties[prop]
+ if (keyMapped === undefined) {
+ this.properties[prop] = lastItemKeyId++
+ keyMapped = this.properties[prop]
+ }
+ removedPropsLocal.push(DEBUG ? prop : keyMapped)
+ }
+ removedProps.push([keyId, removedPropsLocal])
+ }
+ changed.push(DEBUG ? key : keyId, isItemObj ? valueMapped : newVal)
+ }
+ for (const [id, sourceVal] of Object.entries(this.source)) {
+ const key = this.idToKey[id]
+ const diffVal = diffingObj[key]
+ if (!ignoreChanges && diffVal !== undefined) {
+ this.previousValues[id] ??= this.source[id]
+ const prevVal = this.previousValues[id]
+ if (!isEqualStructured(prevVal, diffVal)) {
+ addDiff(key, diffVal, prevVal)
+ }
+ this.previousValues[id] = diffVal
+ }
+ }
+ for (const [key, val] of Object.entries(diffingObj)) {
+ const id = this.keys[key]
+ if (!this.source[id]) {
+ this.source[id] = val
+ }
+ added.push(id)
+ }
+
+ for (const previousKey of this.previousKeys) {
+ const key = this.idToKey[previousKey]
+ if (diffingObj[key] === undefined && !ignoreRemoved) {
+ removed.push(previousKey)
+ }
+ }
+
+ for (const toRemove of removed) {
+ this.previousKeys.splice(this.previousKeys.indexOf(toRemove), 1)
+ }
+
+ for (const previousKey of this.previousKeys) {
+ const index = added.indexOf(previousKey)
+ if (index === -1) continue
+ added.splice(index, 1)
+ }
+
+ this.previousKeys = [...this.previousKeys, ...added]
+
+ return {
+ removed,
+ changed,
+ added,
+ removedProps
+ }
+ }
+
+ recordDiff (key: string, diffObj: string) {
+ const diff = this.diffObj(diffObj)
+ this.diffs[key] = diff
+ }
+
+ static isOptimizedChangeDiff (changePossiblyArrDiff) {
+ if (!Array.isArray(changePossiblyArrDiff)) return false
+ if (changePossiblyArrDiff.length % 2 !== 0) return false
+ for (let i = 0; i < changePossiblyArrDiff.length; i += 2) {
+ if (typeof changePossiblyArrDiff[i] !== 'number') return false
+ }
+ return true
+ }
+
+ static restoreData ({ keys, properties, source, arrKey, diffs }: SourceData, targetKey: string) {
+ // if (!diffs[targetKey]) throw new Error(`The requested data to restore with key ${targetKey} does not exist`)
+ source = structuredClone(source)
+ const keysById = Object.fromEntries(Object.entries(keys).map(x => [x[1], x[0]]))
+ const propertiesById = Object.fromEntries(Object.entries(properties).map(x => [x[1], x[0]]))
+ const dataByKeys = {} as Record
+ for (const [versionKey, { added, changed, removed, removedProps }] of Object.entries(diffs)) {
+ for (const toAdd of added) {
+ dataByKeys[toAdd] = source[toAdd]
+ }
+ for (const toRemove of removed) {
+ delete dataByKeys[toRemove]
+ }
+ for (let i = 0; i < changed.length; i += 2) {
+ const key = changed[i]
+ const change = changed[i + 1]
+ const isOptimizedChange = JsonOptimizer.isOptimizedChangeDiff(change)
+ if (isOptimizedChange) {
+ // apply optimized diff
+ for (let k = 0; k < change.length; k += 2) {
+ const propId = change[k]
+ const newVal = change[k + 1]
+ const prop = propertiesById[propId]
+ // const prop = propId
+ if (prop === undefined) throw new Error(`Property id change is undefined: ${propId}`)
+ dataByKeys[key][prop] = newVal
+ }
+ } else {
+ dataByKeys[key] = change
+ }
+ }
+ for (const [key, removePropsId] of removedProps) {
+ for (const removePropId of removePropsId) {
+ const removeProp = propertiesById[removePropId]
+ delete dataByKeys[key][removeProp]
+ }
+ }
+ if (versionToNumber(versionKey) <= versionToNumber(targetKey)) {
+ break
+ }
+ }
+ if (arrKey) {
+ return Object.values(dataByKeys)
+ } else {
+ return Object.fromEntries(Object.entries(dataByKeys).map(([key, val]) => [keysById[key], val]))
+ }
+ }
+
+ static getByArrKey (item: any, arrKey: string) {
+ return arrKey.split('+').map(x => item[x]).join('+')
+ }
+
+ static resolveDefaults (arr) {
+ if (!Array.isArray(arr)) throw new Error('not an array')
+ const propsValueCount = {} as {
+ [key: string]: {
+ [val: string]: number
+ }
+ }
+ for (const obj of arr) {
+ if (typeof obj !== 'object' || !obj) continue
+ for (const [key, val] of Object.entries(obj)) {
+ const valJson = JSON.stringify(val)
+ propsValueCount[key] ??= {}
+ propsValueCount[key][valJson] ??= 0
+ propsValueCount[key][valJson] += 1
+ }
+ }
+ const defaults = Object.fromEntries(Object.entries(propsValueCount).map(([prop, values]) => {
+ const defaultValue = Object.entries(values).sort(([, count1], [, count2]) => count2 - count1)[0][0]
+ return [prop, defaultValue]
+ }))
+
+ const newData = [] as any[]
+ const noData = {}
+ for (const [i, obj] of arr.entries()) {
+ if (typeof obj !== 'object' || !obj) {
+ newData.push(obj)
+ continue
+ }
+ for (const key of Object.keys(defaults)) {
+ const val = obj[key]
+ if (!val) {
+ noData[key] ??= []
+ noData[key].push(key)
+ continue
+ }
+ if (defaults[key] === JSON.stringify(val)) {
+ delete obj[key]
+ }
+ }
+ newData.push(obj)
+ }
+
+ return {
+ data: newData,
+ defaults
+ }
+ }
+}
+
+const isEqualStructured = (val1, val2) => {
+ return JSON.stringify(val1) === JSON.stringify(val2)
+}
diff --git a/src/react/CreateWorld.tsx b/src/react/CreateWorld.tsx
index 0ff34a39..da710be1 100644
--- a/src/react/CreateWorld.tsx
+++ b/src/react/CreateWorld.tsx
@@ -45,8 +45,8 @@ export default ({ cancelClick, createClick, customizeClick, versions, defaultVer
placeholder='World name'
/>
{ return { value: obj.version, label: obj.version === defaultVersion ? obj.version + ' (available offline)' : obj.version } })}
- selected={{ value: defaultVersion, label: defaultVersion + ' (available offline)' }}
+ versions={versions.map((obj) => { return { value: obj.version, label: obj.version } })}
+ selected={{ value: defaultVersion, label: defaultVersion }}
onChange={(value) => {
creatingWorldState.version = value ?? defaultVersion
}}
diff --git a/src/shims/minecraftData.ts b/src/shims/minecraftData.ts
new file mode 100644
index 00000000..6edb5f48
--- /dev/null
+++ b/src/shims/minecraftData.ts
@@ -0,0 +1,92 @@
+import { versionToNumber } from 'prismarine-viewer/viewer/prepare/utils'
+import JsonOptimizer from '../optimizeJson'
+import minecraftInitialDataJson from '../../generated/minecraft-initial-data.json'
+import { toMajorVersion } from '../utils'
+
+const customResolver = () => {
+ const resolver = Promise.withResolvers()
+ let resolvedData
+ return {
+ ...resolver,
+ get resolvedData () {
+ return resolvedData
+ },
+ resolve (data) {
+ resolver.resolve(data)
+ resolvedData = data
+ }
+ }
+}
+
+const optimizedDataResolver = customResolver()
+window._MC_DATA_RESOLVER = optimizedDataResolver
+window._LOAD_MC_DATA = async () => {
+ if (optimizedDataResolver.resolvedData) return
+ optimizedDataResolver.resolve(await import('../../generated/minecraft-data-optimized.json'))
+}
+
+// 30 seconds
+const cacheTtl = 30 * 1000
+const cache = new Map()
+const cacheTime = new Map()
+const possiblyGetFromCache = (version: string) => {
+ if (minecraftInitialDataJson[version] && !optimizedDataResolver.resolvedData) {
+ return minecraftInitialDataJson[version]
+ }
+ if (cache.has(version)) {
+ return cache.get(version)
+ }
+ const inner = () => {
+ if (!optimizedDataResolver.resolvedData) {
+ throw new Error(`Data for ${version} is not ready yet`)
+ }
+ const dataTypes = Object.keys(optimizedDataResolver.resolvedData)
+ const allRestored = {}
+ for (const dataType of dataTypes) {
+ if (dataType === 'blockCollisionShapes' && versionToNumber(version) >= versionToNumber('1.13')) {
+ const shapes = window.globalGetCollisionShapes?.(version)
+ if (shapes) {
+ allRestored[dataType] = shapes
+ continue
+ }
+ }
+
+ const data = optimizedDataResolver.resolvedData[dataType]
+ if (data.__IS_OPTIMIZED__) {
+ allRestored[dataType] = JsonOptimizer.restoreData(data, version)
+ } else {
+ allRestored[dataType] = data[version] ?? data[toMajorVersion(version)]
+ }
+ }
+ return allRestored
+ }
+ const data = inner()
+ cache.set(version, data)
+ cacheTime.set(version, Date.now())
+ return data
+}
+window.allLoadedMcData = new Proxy({}, {
+ get (t, version: string) {
+ // special properties like $typeof
+ if (version.includes('$')) return
+ // todo enumerate all props
+ return new Proxy({}, {
+ get (target, prop) {
+ return possiblyGetFromCache(version)[prop]
+ },
+ })
+ }
+})
+
+setInterval(() => {
+ const now = Date.now()
+ for (const [version, time] of cacheTime) {
+ if (now - time > cacheTtl) {
+ cache.delete(version)
+ cacheTime.delete(version)
+ }
+ }
+}, 1000)
+
+export const pc = window.allLoadedMcData
+export default { pc }