diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 6e574a60a00..39bce0edf18 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -107,6 +107,7 @@ jobs: QUALITATIVE_FEEDBACK_TUTORIALS_USER_FREQUENCY: "${{ vars.QUALITATIVE_FEEDBACK_TUTORIALS_USER_FREQUENCY }}" QUALITATIVE_FEEDBACK_ENDING_DATE: "${{ vars.QUALITATIVE_FEEDBACK_ENDING_DATE }}" IDEAS_GENERATOR_SOURCE: "${{ vars.IDEAS_GENERATOR_SOURCE }}" + MANUALLY_SAVE_THUMBNAILS: "${{ vars.MANUALLY_SAVE_THUMBNAILS }}" # used by src/template-config.js GTM_ID: ${{ secrets.GTM_ID }} diff --git a/bin/browserslist-to-html.cjs b/bin/browserslist-to-html.cjs new file mode 100755 index 00000000000..b83aff67be4 --- /dev/null +++ b/bin/browserslist-to-html.cjs @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +const readline = require('node:readline'); + +const friendlyBrowsers = { + and_chr: 'Android Chrome', + chrome: 'Chrome', + edge: 'Edge', + firefox: 'Firefox', + ios_saf: 'iOS Safari', + safari: 'Safari' +}; + +/** + * Zips together multiple iterables. Most implementations stop as soon as one iterable is exhausted, + * but this implementation continues until all iterables are exhausted, filling in `undefined` for + * any missing values. + * @param {...Iterable} iterables The iterables to zip together. + * @yields {Array} An array containing the next value from each iterable, or `undefined` if an iterable is exhausted. + * @example + * const zipped = zipAll([1, 2], ['a', 'b', 'c'], [true]); + * console.log([...zipped]); // [[1, 'a', true], [2, 'b', undefined], [undefined, 'c', undefined]] + */ +const zipAll = function*(...iterables) { + const iterators = iterables.map(iterable => iterable[Symbol.iterator]()); + while (true) { + const results = iterators.map(iterator => iterator.next()); + if (results.every(result => result.done)) { + return; + } + yield results.map(result => result.value); + } +}; + +const main = async () => { + const input = readline.createInterface({ + input: process.stdin + }); + + const browsers = {}; + + for await (const line of input) { + const [browser, version] = line.split(' '); + if (!browsers[browser]) { + browsers[browser] = []; + } + browsers[browser].unshift(version); + } + + process.stdout.write([ + '', + '', + ' ', + ' Scratch: Supported Browsers', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '' + ].join('\n')); + + const browserIds = Object.keys(browsers).sort(); + for (const browserId of browserIds) { + process.stdout.write(` \n`); + } + process.stdout.write([ + ' ', + ' ', + ' ', + '' + ].join('\n')); + for (const versions of zipAll(...Object.values(browsers))) { + process.stdout.write(' \n'); + for (const version of versions) { + process.stdout.write(` \n`); + } + process.stdout.write(' \n'); + } + process.stdout.write([ + ' ', + '
Supported Browsers
${friendlyBrowsers[browserId] || browserId}
${version || ''}
', + ' ', + '', + '' + ].join('\n')); +}; + +main(); diff --git a/package-lock.json b/package-lock.json index 5688c175bec..7a1a7d8ba01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,23 +23,23 @@ "react-twitter-embed": "3.0.3", "react-use": "17.6.0", "scratch-parser": "6.0.0", - "scratch-storage": "^4.0.179" + "scratch-storage": "^4.0.214" }, "devDependencies": { - "@babel/cli": "7.27.2", - "@babel/core": "7.27.7", - "@babel/eslint-parser": "7.27.5", + "@babel/cli": "7.28.3", + "@babel/core": "7.28.3", + "@babel/eslint-parser": "7.28.0", "@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-transform-async-to-generator": "7.27.1", - "@babel/plugin-transform-object-rest-spread": "7.27.7", - "@babel/preset-env": "7.27.2", + "@babel/plugin-transform-object-rest-spread": "7.28.0", + "@babel/preset-env": "7.28.3", "@babel/preset-react": "7.27.1", "@formatjs/intl-datetimeformat": "6.18.0", "@formatjs/intl-locale": "3.4.6", "@formatjs/intl-numberformat": "8.15.4", "@formatjs/intl-pluralrules": "5.4.4", "@formatjs/intl-relativetimeformat": "11.4.11", - "@scratch/scratch-gui": "11.3.0", + "@scratch/scratch-gui": "11.6.0-face-sensing.2", "@types/jest": "29.5.14", "async": "3.2.6", "autoprefixer": "10.4.21", @@ -94,7 +94,7 @@ "postcss-loader": "4.3.0", "postcss-simple-vars": "5.0.2", "prop-types": "15.8.1", - "query-string": "9.2.1", + "query-string": "9.2.2", "react": "16.14.0", "react-dom": "16.14.0", "react-intl": "5.25.1", @@ -110,17 +110,17 @@ "redux-mock-store": "1.5.5", "redux-thunk": "2.4.2", "regenerator-runtime": "0.13.9", - "sass": "1.89.2", + "sass": "1.90.0", "sass-loader": "10.5.2", - "scratch-l10n": "5.0.294", - "selenium-webdriver": "4.34.0", + "scratch-l10n": "6.0.30", + "selenium-webdriver": "4.35.0", "slick-carousel": "1.8.1", "stream-browserify": "3.0.0", "style-loader": "4.0.0", "tap": "14.11.0", "url-loader": "3.0.0", "use-onclickoutside": "0.4.1", - "webpack": "5.99.9", + "webpack": "5.101.2", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", "webpack-dev-middleware": "5.3.4", @@ -146,6 +146,7 @@ "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "dev": true, + "license": "MIT", "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", @@ -158,16 +159,17 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@babel/cli": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.2.tgz", - "integrity": "sha512-cfd7DnGlhH6OIyuPSSj3vcfIdnbXukhAyKY8NaZrFadC7pXyL9mOL5WgjcptiEJLi5k3j8aYvLIVCzezrWTaiA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.3.tgz", + "integrity": "sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.28", "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", @@ -228,9 +230,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "dev": true, "license": "MIT", "engines": { @@ -238,22 +240,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -269,9 +271,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", - "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz", + "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==", "dev": true, "license": "MIT", "dependencies": { @@ -288,16 +290,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -335,18 +337,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -375,22 +377,32 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -420,15 +432,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -541,42 +553,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.7" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -653,14 +665,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -984,15 +996,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1036,9 +1048,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1069,13 +1081,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -1086,18 +1098,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", + "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -1124,14 +1136,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.7.tgz", - "integrity": "sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.7" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1206,6 +1218,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", @@ -1473,17 +1502,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.7.tgz", - "integrity": "sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.7", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.27.7" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1610,9 +1639,9 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "dev": true, "license": "MIT", "dependencies": { @@ -1679,9 +1708,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", + "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", "dev": true, "license": "MIT", "dependencies": { @@ -1876,13 +1905,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", @@ -1890,25 +1919,26 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", @@ -1925,15 +1955,15 @@ "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1946,10 +1976,10 @@ "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "engines": { @@ -1996,9 +2026,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2020,28 +2050,28 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.2", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2101,6 +2131,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": ">=18" } @@ -2120,6 +2151,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, @@ -2143,6 +2175,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.4" @@ -2170,6 +2203,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, @@ -2192,6 +2226,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" } @@ -2206,6 +2241,448 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -2266,39 +2743,10 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { @@ -2697,16 +3145,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2801,13 +3239,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3183,18 +3614,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3207,20 +3634,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3229,15 +3646,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3393,6 +3810,13 @@ "node": ">=6.0.0" } }, + "node_modules/@mediapipe/face_detection": { + "version": "0.4.1646425229", + "resolved": "https://registry.npmjs.org/@mediapipe/face_detection/-/face_detection-0.4.1646425229.tgz", + "integrity": "sha512-aeCN+fRAojv9ch3NXorP6r5tcGVLR3/gC1HmtqB0WEZBRXrdP6/3W/sGR0dHr1iT6ueiK95G9PVjbzFosf/hrg==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/@microbit/microbit-universal-hex": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@microbit/microbit-universal-hex/-/microbit-universal-hex-0.2.2.tgz", @@ -3870,21 +4294,25 @@ "resolved": "https://registry.npmjs.org/@scratch/paper/-/paper-0.11.20221201200345.tgz", "integrity": "sha512-I3BZNrHeaQJt2H6TD7HGsuBKJPDDF/BIDOaRvnN7Gj/QBRvpSaRK8JAmzcrRHZ+AqNtKrG50eOkS/acMjTw3rw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/@scratch/scratch-gui": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@scratch/scratch-gui/-/scratch-gui-11.3.0.tgz", - "integrity": "sha512-WLg7qtBNm+KRU6+AlIDg/qUBOiraKxT44UA1MSEbUCGvnjs+2AhLTWh6mRjqSAIytem06u0xyyI6lDGpQXknvw==", + "version": "11.6.0-face-sensing.2", + "resolved": "https://registry.npmjs.org/@scratch/scratch-gui/-/scratch-gui-11.6.0-face-sensing.2.tgz", + "integrity": "sha512-TqlkOCr/WxGlD7T9YTXg8/5Ges0Pob/7qpllS5XNFoRiAE7JPmYNo8BdEmQumiUFGRWZbtTpyKJyvnBBzN+ZSA==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { + "@mediapipe/face_detection": "0.4.1646425229", "@microbit/microbit-universal-hex": "0.2.2", - "@scratch/scratch-render": "11.3.0", - "@scratch/scratch-svg-renderer": "11.3.0", - "@scratch/scratch-vm": "11.3.0", + "@scratch/scratch-render": "11.6.0-face-sensing.2", + "@scratch/scratch-svg-renderer": "11.6.0-face-sensing.2", + "@scratch/scratch-vm": "11.6.0-face-sensing.2", + "@tensorflow-models/face-detection": "^1.0.3", + "@tensorflow/tfjs": "^4.22.0", "arraybuffer-loader": "1.0.8", "autoprefixer": "9.8.8", "balance-text": "3.3.1", @@ -3933,12 +4361,12 @@ "react-virtualized": "9.22.6", "react-visibility-sensor": "5.1.1", "redux-throttle": "0.1.1", - "scratch-audio": "2.0.179", + "scratch-audio": "2.0.199", "scratch-blocks": "1.1.210", - "scratch-l10n": "5.0.293", - "scratch-paint": "3.0.314", - "scratch-render-fonts": "1.0.209", - "scratch-storage": "4.0.178", + "scratch-l10n": "6.0.13", + "scratch-paint": "3.0.339", + "scratch-render-fonts": "1.0.218", + "scratch-storage": "4.0.201", "startaudiocontext": "1.2.1", "style-loader": "4.0.0", "text-encoding": "0.7.0", @@ -3996,6 +4424,28 @@ "node": ">=0.10" } }, + "node_modules/@scratch/scratch-gui/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@scratch/scratch-gui/node_modules/intl-messageformat": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-2.2.0.tgz", @@ -4041,6 +4491,22 @@ "microee": "0.0.6" } }, + "node_modules/@scratch/scratch-gui/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@scratch/scratch-gui/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -4118,25 +4584,30 @@ } }, "node_modules/@scratch/scratch-gui/node_modules/scratch-l10n": { - "version": "5.0.293", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.293.tgz", - "integrity": "sha512-aeIwlQG8gUAL8A9zmsBq4GcS4R5N7ZDg6xY9oNU9jTejcNUtWpLlmEnstWm0PZHeuySTdOjToCC7sIsLZY0Uog==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.0.13.tgz", + "integrity": "sha512-uQyGFxd8eM9tn9dlxWLE7SGa5wBNVcIrR4YZaYLinzIysp563tsWxM/ucvvvcfo7PiNy7AOcQvy6C/IgcsJYig==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.4", - "download": "8.0.0", - "transifex": "1.6.6" + "async": "3.2.6", + "format-message-parse": "6.2.4", + "glob": "7.2.3", + "lodash.defaultsdeep": "4.6.1", + "mkdirp": "3.0.1", + "transifex": "1.6.6", + "tsx": "4.20.3" }, "bin": { - "build-i18n-src": "scripts/build-i18n-src.js", - "tx-push-src": "scripts/tx-push-src.js" + "build-i18n-src": "scripts/build-i18n-src.mts", + "tx-push-src": "scripts/tx-push-src.mts" } }, "node_modules/@scratch/scratch-gui/node_modules/scratch-storage": { - "version": "4.0.178", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.178.tgz", - "integrity": "sha512-twZ6yidoaKjoO9yCzYK4D7wwqr8zbafYhCeuzpOoEUaRmiPKuMnPlFNYDLt6FEFpXcXglpkhinmsB0d92hZj1w==", + "version": "4.0.201", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.201.tgz", + "integrity": "sha512-wexsLsewAjpARvP3wUR43zM5TE+LM4hm9blGoy2cC7m39UGzhrZCjsbDfRX26JwQBHI33RhBU7NjAFdT+WmZvQ==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -4150,14 +4621,34 @@ "minilog": "^3.1.0" } }, + "node_modules/@scratch/scratch-gui/node_modules/tsx": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/@scratch/scratch-render": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@scratch/scratch-render/-/scratch-render-11.3.0.tgz", - "integrity": "sha512-Nj2hH5+HKorxTB5ikQLUXbFgsSOu2WmjqBE+pnt2+TZZW5F0IAJzDUSvCz+sBRlDlvopSP6hp0Blg3XzZap5jw==", + "version": "11.6.0-face-sensing.2", + "resolved": "https://registry.npmjs.org/@scratch/scratch-render/-/scratch-render-11.6.0-face-sensing.2.tgz", + "integrity": "sha512-M7J105fwGHdVcc0DJjMYlf21xS3Fk0AI3hgzq5GAZm6WbnAPKHWITmWaotA8a1vQ6+kTG0OHd2xjNtkcaZR34A==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-svg-renderer": "11.3.0", + "@scratch/scratch-svg-renderer": "11.6.0-face-sensing.2", "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", "ify-loader": "1.1.0", @@ -4194,9 +4685,9 @@ "dev": true }, "node_modules/@scratch/scratch-svg-renderer": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@scratch/scratch-svg-renderer/-/scratch-svg-renderer-11.3.0.tgz", - "integrity": "sha512-/oy7oIg6ouB+qJWTQ39hhlTDU3iAuJiIPETr2Fdm+p9lU9fm53aEWzvUne8CN7ikm79mx5kEJ5wed4IyMAPwHQ==", + "version": "11.6.0-face-sensing.2", + "resolved": "https://registry.npmjs.org/@scratch/scratch-svg-renderer/-/scratch-svg-renderer-11.6.0-face-sensing.2.tgz", + "integrity": "sha512-T/V4FKki5JeO72EEHxpI+hwp9MqBU7ghRuXqvUt5miIVTLl0UlokEKS9UP9LOZ3nJTir7cUX9/YjizU6S9gtDw==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -4204,7 +4695,7 @@ "base64-loader": "1.0.0", "css-tree": "1.1.3", "fastestsmallesttextencoderdecoder": "1.0.22", - "isomorphic-dompurify": "2.25.0", + "isomorphic-dompurify": "2.26.0", "minilog": "3.1.0", "transformation-matrix": "1.15.3" }, @@ -4230,14 +4721,14 @@ } }, "node_modules/@scratch/scratch-vm": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@scratch/scratch-vm/-/scratch-vm-11.3.0.tgz", - "integrity": "sha512-4dqsmpeGRsb3iHqi0gm1CcKz7OobPg5oMCPXbsuN5pJFR1ZKh/OyjkGRo8P8yWg2MDqbDKgrqj3ghmsuE/SJHA==", + "version": "11.6.0-face-sensing.2", + "resolved": "https://registry.npmjs.org/@scratch/scratch-vm/-/scratch-vm-11.6.0-face-sensing.2.tgz", + "integrity": "sha512-8FPrELSZOz6jgq39DvTST6nuV1XaUMozI7w+MsfRIR6baloYQLKwarUKGBE8W4KU9qZGcMmLirQDM6LRfrT4KA==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { - "@scratch/scratch-render": "11.3.0", - "@scratch/scratch-svg-renderer": "11.3.0", + "@scratch/scratch-render": "11.6.0-face-sensing.2", + "@scratch/scratch-svg-renderer": "11.6.0-face-sensing.2", "@vernier/godirect": "1.8.3", "arraybuffer-loader": "1.0.8", "atob": "2.1.2", @@ -4250,10 +4741,10 @@ "immutable": "3.8.2", "jszip": "3.10.1", "minilog": "3.1.0", - "scratch-audio": "2.0.179", + "scratch-audio": "2.0.199", "scratch-parser": "6.0.0", - "scratch-sb1-converter": "2.0.177", - "scratch-storage": "4.0.178", + "scratch-sb1-converter": "2.0.199", + "scratch-storage": "4.0.201", "scratch-translate-extension-languages": "1.0.7", "text-encoding": "0.7.0", "uuid": "8.3.2", @@ -4278,9 +4769,9 @@ } }, "node_modules/@scratch/scratch-vm/node_modules/scratch-storage": { - "version": "4.0.178", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.178.tgz", - "integrity": "sha512-twZ6yidoaKjoO9yCzYK4D7wwqr8zbafYhCeuzpOoEUaRmiPKuMnPlFNYDLt6FEFpXcXglpkhinmsB0d92hZj1w==", + "version": "4.0.201", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.201.tgz", + "integrity": "sha512-wexsLsewAjpARvP3wUR43zM5TE+LM4hm9blGoy2cC7m39UGzhrZCjsbDfRX26JwQBHI33RhBU7NjAFdT+WmZvQ==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -4331,6 +4822,163 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tensorflow-models/face-detection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tensorflow-models/face-detection/-/face-detection-1.0.3.tgz", + "integrity": "sha512-4Ld/vFF8MrdFdrMWhlLKZD4hMW0PNY9OkYeqoCPNZ+LwFyenxAqVaNaWrR8JKp37vw9Nuzp4ILbkal5zPUnA0g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "rimraf": "^3.0.2", + "tslib": "2.4.0" + }, + "peerDependencies": { + "@mediapipe/face_detection": "~0.4.0", + "@tensorflow/tfjs-backend-webgl": "^4.21.0", + "@tensorflow/tfjs-converter": "^4.21.0", + "@tensorflow/tfjs-core": "^4.21.0" + } + }, + "node_modules/@tensorflow-models/face-detection/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@tensorflow/tfjs": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-4.22.0.tgz", + "integrity": "sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@tensorflow/tfjs-backend-webgl": "4.22.0", + "@tensorflow/tfjs-converter": "4.22.0", + "@tensorflow/tfjs-core": "4.22.0", + "@tensorflow/tfjs-data": "4.22.0", + "@tensorflow/tfjs-layers": "4.22.0", + "argparse": "^1.0.10", + "chalk": "^4.1.0", + "core-js": "3.29.1", + "regenerator-runtime": "^0.13.5", + "yargs": "^16.0.3" + }, + "bin": { + "tfjs-custom-module": "dist/tools/custom_module/cli.js" + } + }, + "node_modules/@tensorflow/tfjs-backend-cpu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.22.0.tgz", + "integrity": "sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-backend-webgl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", + "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@tensorflow/tfjs-backend-cpu": "4.22.0", + "@types/offscreencanvas": "~2019.3.0", + "@types/seedrandom": "^2.4.28", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-converter": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", + "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs-core": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", + "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "@types/offscreencanvas": "~2019.7.0", + "@types/seedrandom": "^2.4.28", + "@webgpu/types": "0.1.38", + "long": "4.0.0", + "node-fetch": "~2.6.1", + "seedrandom": "^3.0.5" + }, + "engines": { + "yarn": ">= 1.3.2" + } + }, + "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tensorflow/tfjs-data": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-4.22.0.tgz", + "integrity": "sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "^2.1.2", + "node-fetch": "~2.6.1", + "string_decoder": "^1.3.0" + }, + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0", + "seedrandom": "^3.0.5" + } + }, + "node_modules/@tensorflow/tfjs-layers": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-4.22.0.tgz", + "integrity": "sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==", + "dev": true, + "license": "Apache-2.0 AND MIT", + "peerDependencies": { + "@tensorflow/tfjs-core": "4.22.0" + } + }, + "node_modules/@tensorflow/tfjs/node_modules/core-js": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -4346,6 +4994,7 @@ "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.4.tgz", "integrity": "sha512-oRWw10V+YPFl1WJuORcQHcjtvqd70lFXxpmXQ/yUn3KE7cLtBMkFeC+2kULw3Rk17hD6EEO2HQLkvpR7NY/Zsw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "core-js": "^3.35.0" }, @@ -4354,11 +5003,12 @@ } }, "node_modules/@transifex/api/node_modules/core-js": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", - "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", + "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -4400,13 +5050,13 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/eslint": { @@ -4449,14 +5099,16 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "*", "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" } }, "node_modules/@types/html-minifier-terser": { @@ -4555,14 +5207,32 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "@types/node": "*", + "form-data": "^4.0.4" } }, "node_modules/@types/node-hid": { @@ -4575,6 +5245,13 @@ "@types/node": "*" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.3.0", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", + "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -4600,6 +5277,13 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/seedrandom": { + "version": "2.4.34", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.34.tgz", + "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/semver": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", @@ -4626,6 +5310,7 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/@types/usb": { @@ -4817,7 +5502,8 @@ "version": "1.8.3", "resolved": "https://registry.npmjs.org/@vernier/godirect/-/godirect-1.8.3.tgz", "integrity": "sha512-poS0LZ3jAjH36gIAI0aNBBdsGGbmt11VFbLO+eGDJ/JDSPtMu1iUStvOi0UM/ZH6Jyh34SjVd8Cnxu/Wmcb8iQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", @@ -4980,6 +5666,13 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webgpu/types": { + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", + "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", @@ -5141,6 +5834,19 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5379,6 +6085,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5440,9 +6159,9 @@ } }, "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", "dev": true, "license": "ISC" }, @@ -5506,11 +6225,14 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-bounds": { "version": "1.0.1", @@ -5812,6 +6534,7 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" }, @@ -6038,14 +6761,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -6053,27 +6776,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6113,9 +6836,9 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -6136,7 +6859,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -6203,7 +6926,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz", "integrity": "sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", @@ -6468,9 +7192,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", "dev": true, "funding": [ { @@ -6488,8 +7212,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -6515,6 +7239,7 @@ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, + "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -7041,9 +7766,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001735", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", + "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", "dev": true, "funding": [ { @@ -7091,7 +7816,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/canvas-toBlob/-/canvas-toBlob-1.0.0.tgz", "integrity": "sha512-oU5bawygt/Nef9F+C49eTFmzXzz6yKdGqn6J1wn/LZQF5ulnnZVm0KIZzik85I6tjCbZFH6aa47j4bU2tkHxRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cardinal": { "version": "0.4.4", @@ -7419,6 +8145,16 @@ "mimic-response": "^1.0.0" } }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -7847,13 +8583,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz", + "integrity": "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -7917,16 +8653,6 @@ "node": ">=6" } }, - "node_modules/coveralls/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/coveralls/node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -7938,7 +8664,22 @@ "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=4" + "node": ">=4" + } + }, + "node_modules/coveralls/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" } }, "node_modules/coveralls/node_modules/js-yaml": { @@ -7998,13 +8739,6 @@ "node": ">= 6" } }, - "node_modules/coveralls/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/coveralls/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -8100,6 +8834,48 @@ "node-fetch": "^2.7.0" } }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -8352,6 +9128,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, + "license": "MIT", "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" @@ -8805,6 +9582,7 @@ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" @@ -8900,9 +9678,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, @@ -8910,7 +9688,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/decode-html/-/decode-html-2.0.0.tgz", "integrity": "sha512-lVJ+EBozhAXA2nSQG+xAgcD0P5K3uejnIIvM09uoQfS8AALkQ+HhHcEUvKovXi0EIpIZWjm0y8X7ULjaJpgY9w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.4.1", @@ -8943,16 +9722,16 @@ } }, "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", "dev": true, "license": "MIT", "dependencies": { - "mimic-response": "^1.0.0" + "mimic-response": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/decompress-tar": { @@ -9345,7 +10124,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -9464,6 +10244,7 @@ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -9746,9 +10527,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.171", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", - "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "version": "1.5.203", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz", + "integrity": "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==", "dev": true, "license": "ISC" }, @@ -9861,9 +10642,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -10282,6 +11063,48 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -10612,35 +11435,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -11564,13 +12358,13 @@ } }, "node_modules/flow-remove-types": { - "version": "2.273.1", - "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.273.1.tgz", - "integrity": "sha512-OsiyA6URBPkG0Ns5DYH556uFtTFfyQ9kg4PfMi8l5DfSieHAtxKnlCgZFPu0lC+37sWkQtnyVCYTFbQcHxOwZg==", + "version": "2.279.0", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.279.0.tgz", + "integrity": "sha512-bPFloMR/A2b/r/sIsf7Ix0LaMicCJNjwhXc4xEEQVzJCIz5u7C7XDaEOXOiqveKlCYK7DcBNn6R01Cbbc9gsYA==", "dev": true, "license": "MIT", "dependencies": { - "hermes-parser": "0.28.0", + "hermes-parser": "0.29.1", "pirates": "^3.0.2", "vlq": "^0.2.1" }, @@ -11705,18 +12499,20 @@ } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/form-data-to-object": { @@ -11731,6 +12527,7 @@ "resolved": "https://registry.npmjs.org/format-message/-/format-message-6.2.4.tgz", "integrity": "sha512-/24zYeSRy2ZlEO2OIctm7jOHvMpoWf+uhqFCaqqyZKi1C229zAAy2E5vF4lSSaMH0a2kewPrOzq6xN4Yy7cQrw==", "dev": true, + "license": "MIT", "dependencies": { "format-message-formats": "^6.2.4", "format-message-interpret": "^6.2.4", @@ -11742,13 +12539,15 @@ "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-formats/-/format-message-formats-6.2.4.tgz", "integrity": "sha512-smT/fAqBLqusWfWCKRAx6QBDAAbmYznWsIyTyk66COmvwt2Byiqd7SJe2ma9a5oV0kwRaOJpN/F4lr4YK/n6qQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/format-message-interpret": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-interpret/-/format-message-interpret-6.2.4.tgz", "integrity": "sha512-dRvz9mXhITApyOtfuFEb/XqvCe1u6RMkQW49UJHXS8w2S8cAHCqq5LNDFK+QK6XVzcofROycLb/k1uybTAKt2w==", "dev": true, + "license": "MIT", "dependencies": { "format-message-formats": "^6.2.4", "lookup-closest-locale": "^6.2.0" @@ -11758,7 +12557,8 @@ "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-parse/-/format-message-parse-6.2.4.tgz", "integrity": "sha512-k7WqXkEzgXkW4wkHdS6Cv2Ou0rIFtiDelZjgoe1saW4p7FT7zS8OeAUpAekhormqzpeecR97e4vBft1zMsfFOQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/formik": { "version": "1.5.8", @@ -11866,6 +12666,7 @@ "resolved": "https://registry.npmjs.org/from2-array/-/from2-array-0.0.4.tgz", "integrity": "sha512-0G0cAp7sYLobH7ALsr835x98PU/YeVF7wlwxdWbCUaea7wsa7lJfKZUAo6p2YZGZ8F94luCuqHZS3JtFER6uPg==", "dev": true, + "license": "MIT", "dependencies": { "from2": "^2.0.3" } @@ -11953,9 +12754,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", "dev": true, "license": "Unlicense" }, @@ -12210,6 +13011,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/get-user-media-promise": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/get-user-media-promise/-/get-user-media-promise-1.1.4.tgz", @@ -12706,9 +13520,9 @@ "license": "MIT" }, "node_modules/gl-vec3": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", - "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.2.0.tgz", + "integrity": "sha512-ynW7j5ZshRTHXG5UPC5u6G52cBCNx53LbNlq2HQ1bAosZbO4wOCEBufXS7KGiKL1slMgy4j/77Ikt+vMznouLg==", "dev": true, "license": "zlib" }, @@ -12769,13 +13583,19 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -13198,6 +14018,19 @@ "node": ">=4" } }, + "node_modules/got/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/got/node_modules/get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -13208,6 +14041,16 @@ "node": ">=4" } }, + "node_modules/got/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/got/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -13230,6 +14073,7 @@ "resolved": "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz", "integrity": "sha512-mB6rwkw1Z7z4z2RkFFTd/+q6Ug1gnCgjKAervAKgBeNI1mSr8E5EUWoYzFNOZsLHFArLfpk+O8X8qXC7uvuawQ==", "dev": true, + "license": "MIT", "dependencies": { "brfs": "^1.2.0", "unicode-trie": "^0.3.1" @@ -13258,16 +14102,6 @@ "node": ">=0.10.0" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/gray-matter/node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -13296,13 +14130,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/gray-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/grid-index": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", @@ -13550,20 +14377,20 @@ } }, "node_modules/hermes-estree": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.28.0.tgz", - "integrity": "sha512-M5IFfnP4RCA2/Hv7VTIlZ1FV4qW33gresbv0SDaSBS/6lax23oV2sg4iE0fhYnpMeQL7Inob+jAeO+mV2T3bKA==", + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", + "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.28.0.tgz", - "integrity": "sha512-PPtmoqyz4vv5SqVCYuvJLPKZt+SqCMviICVEygi6jHyfAvDd0cQTV2MfikDd8YXPOszR/9QvauWcGyluxej+rg==", + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", + "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", "dev": true, "license": "MIT", "dependencies": { - "hermes-estree": "0.28.0" + "hermes-estree": "0.29.1" } }, "node_modules/history": { @@ -13615,6 +14442,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-encoding": "^3.1.1" }, @@ -13737,6 +14565,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -13746,10 +14575,11 @@ } }, "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } @@ -13789,7 +14619,8 @@ "resolved": "https://registry.npmjs.org/hull.js/-/hull.js-0.2.10.tgz", "integrity": "sha512-UO3W30HxhWgeSpNKCdXt00xkwjRTGmhQaoZNP8ll509Nl+DP9juXE3wRGizihuop08FSB4xtAWIbWSe+RxEoog==", "deprecated": "This package is unmaintained and vulnerable. Do not use it.", - "dev": true + "dev": true, + "license": "BSD" }, "node_modules/human-signals": { "version": "2.1.0", @@ -13857,6 +14688,7 @@ "resolved": "https://registry.npmjs.org/ify-loader/-/ify-loader-1.1.0.tgz", "integrity": "sha512-EiyC45FRIs+z4g98+jBzuYCfoM6TKG9p7Ek5YZUeM7rucNucaMZIseRj/5Q3I4ypkZXyC2wnU1RcYrVmshe2xw==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^1.0.0", "findup": "^0.1.5", @@ -13888,6 +14720,7 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14864,10 +15697,11 @@ } }, "node_modules/isomorphic-dompurify": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/isomorphic-dompurify/-/isomorphic-dompurify-2.25.0.tgz", - "integrity": "sha512-bcpJzu9DOjN21qaCVpcoCwUX1ytpvA6EFqCK5RNtPg5+F0Jz9PX50jl6jbEicBNeO87eDDfC7XtPs4zjDClZJg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/isomorphic-dompurify/-/isomorphic-dompurify-2.26.0.tgz", + "integrity": "sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==", "dev": true, + "license": "MIT", "dependencies": { "dompurify": "^3.2.6", "jsdom": "^26.1.0" @@ -15359,6 +16193,50 @@ } } }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -15565,25 +16443,8 @@ "engines": { "node": ">=0.12" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/jest-environment-jsdom/node_modules/html-encoding-sniffer": { @@ -16310,6 +17171,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -16322,6 +17190,7 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "dev": true, + "license": "MIT", "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -16357,10 +17226,11 @@ } }, "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } @@ -16370,6 +17240,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -16382,6 +17253,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -16395,6 +17267,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^6.0.0" }, @@ -16707,6 +17580,7 @@ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz", "integrity": "sha512-zt8pzlM3oq4moDN8U5mP1SbZ44yKV6dXCu44Ez6iTXmxUl8/jRFWeho2SDqL5YDBv0TBKPgU/XGovZwnXAKlOQ==", "dev": true, + "license": "MIT", "dependencies": { "base64-js": "0.0.8", "brfs": "^1.3.0", @@ -16718,6 +17592,7 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -17103,6 +17978,13 @@ "node": ">=0.8.6" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -17117,7 +17999,8 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -17511,13 +18394,16 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/min-document": { @@ -17954,6 +18840,7 @@ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.3.1.tgz", "integrity": "sha512-ZUcepNdMeKBRn/ksm2XTxFnhBaqnBJSZNqwajmiem6b7Rp3fNAAq+twYn3kqw9YMY7HJuc7I7OObX9cMgB1ANg==", "dev": true, + "license": "MIT", "dependencies": { "duplexer2": "^0.1.2" } @@ -18026,9 +18913,9 @@ } }, "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", "devOptional": true, "license": "MIT" }, @@ -18299,9 +19186,10 @@ "optional": true }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -18322,18 +19210,21 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -18481,7 +19372,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/npm-run-path": { "version": "4.0.1", @@ -18547,9 +19439,9 @@ "dev": true }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", + "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", "dev": true, "license": "MIT" }, @@ -18616,16 +19508,6 @@ "node": ">=4" } }, - "node_modules/nyc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/nyc/node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -18931,13 +19813,6 @@ "rimraf": "bin.js" } }, - "node_modules/nyc/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/nyc/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -19464,7 +20339,8 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/param-case": { "version": "3.0.4", @@ -19502,6 +20378,7 @@ "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "~0.5.0" } @@ -20510,9 +21387,9 @@ } }, "node_modules/query-string": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.2.1.tgz", - "integrity": "sha512-3jTGGLRzlhu/1ws2zlr4Q+GVMLCQTLFOj8CMX5x44cdZG9FQE07x2mQhaNxaKVPNmIDu0mvJ/cEwtY7Pim7hqA==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.2.2.tgz", + "integrity": "sha512-pDSIZJ9sFuOp6VnD+5IkakSVf+rICAuuU88Hcsr6AKL0QtxSIfVuKiVP2oahFI7tk3CRSexwV+Ya6MOoTxzg9g==", "dev": true, "license": "MIT", "dependencies": { @@ -21341,6 +22218,7 @@ "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -21354,6 +22232,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -21879,9 +22758,9 @@ } }, "node_modules/renderkid/node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -22169,6 +23048,16 @@ "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", "license": "MIT" }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", @@ -22396,7 +23285,8 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/rst-selector-parser": { "version": "2.2.3", @@ -22542,9 +23432,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22727,9 +23617,9 @@ } }, "node_modules/scratch-audio": { - "version": "2.0.179", - "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-2.0.179.tgz", - "integrity": "sha512-OpanST4r6AQOeJJU9x0fwgRekPdTuUSRKGHrYB2djZ+OZN4m+48Pk4T9Mg4uLoXmB2rYKdlT3dgBYSr1MHWNnw==", + "version": "2.0.199", + "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-2.0.199.tgz", + "integrity": "sha512-I7UqcObjH5eOc6Cm3gSA1GBO2KzpTPE5pnq3kn1EmdTlR2tvRCubo3ArbP2zW5Xzs8ejlhBm9+V5sLd2wKLCVQ==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -22782,9 +23672,9 @@ } }, "node_modules/scratch-blocks/node_modules/core-js": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz", - "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz", + "integrity": "sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -22848,25 +23738,68 @@ } }, "node_modules/scratch-l10n": { - "version": "5.0.294", - "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-5.0.294.tgz", - "integrity": "sha512-1YcThA9gzHusKVgylGgIqydcDaBhOYBWdiq6Y0sDvmHork9r0S7+cJI5KGxuQU19EyUCmXtQb+t9zLXCaEGGSg==", + "version": "6.0.30", + "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-6.0.30.tgz", + "integrity": "sha512-put22RWdf6jEq8jZopYFpXCR7/he/O1tEB+ene3fB1xRoknkdQxE1LrCq6D5WYl8kb+dbr7YmiyVJhOHsZ2MKg==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { "@transifex/api": "7.1.4", - "download": "8.0.0", - "transifex": "1.6.6" + "async": "3.2.6", + "format-message-parse": "6.2.4", + "glob": "7.2.3", + "lodash.defaultsdeep": "4.6.1", + "mkdirp": "3.0.1", + "transifex": "1.6.6", + "tsx": "4.20.4" }, "bin": { - "build-i18n-src": "scripts/build-i18n-src.js", - "tx-push-src": "scripts/tx-push-src.js" + "build-i18n-src": "scripts/build-i18n-src.mts", + "tx-push-src": "scripts/tx-push-src.mts" + } + }, + "node_modules/scratch-l10n/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/scratch-l10n/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/scratch-paint": { - "version": "3.0.314", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-3.0.314.tgz", - "integrity": "sha512-bTEDUddeA7iyB6uhtkLKlZDOGKo7m9fHcZh9cN2wc57kPJ4lLoCNsajGLHlvPmSDrnQNLJwu4ZT62i9nBw0LCA==", + "version": "3.0.339", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-3.0.339.tgz", + "integrity": "sha512-nOEDjEZ1lpTsaKcCq2CRcv/mTqCQN6DYPw2t7ZPy1B79dAi1c7vyPfsObbRaN07BTSpqH/2O5/4UmJi1TKr3tQ==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -22898,19 +23831,22 @@ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", "deprecated": "This package is deprecated. Use destructuring assignment syntax instead.", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/scratch-paint/node_modules/microee": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==", - "dev": true + "dev": true, + "license": "BSD" }, "node_modules/scratch-paint/node_modules/minilog": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/minilog/-/minilog-3.1.0.tgz", "integrity": "sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==", "dev": true, + "license": "MIT", "dependencies": { "microee": "0.0.6" } @@ -22930,18 +23866,18 @@ } }, "node_modules/scratch-render-fonts": { - "version": "1.0.209", - "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.209.tgz", - "integrity": "sha512-twrPr+4G8/Xn0vlJICr/9sNGTUOx6XL/RFlrmsnD5l9IXpMCAIkU+1rjhJnHdR16TKSwAwtLVrFEAvG+Orr+nA==", + "version": "1.0.218", + "resolved": "https://registry.npmjs.org/scratch-render-fonts/-/scratch-render-fonts-1.0.218.tgz", + "integrity": "sha512-zP2Ka0tMQGMwCtOsU87qEVR0auIT+1dffEDFdAeLEnHUQ7eYEECvKwWowPIlqoRsCusX8EALatSLSnvPx2oqcw==", "dev": true, "dependencies": { "base64-loader": "^1.0.0" } }, "node_modules/scratch-sb1-converter": { - "version": "2.0.177", - "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-2.0.177.tgz", - "integrity": "sha512-eGUdqM7lk266E74sDynN4alUOxmtP3OmqSesiQCT2CLAKv1XgxXgWvqmCNiyZ/1oA47yca0niKsWhp9lWBOy4A==", + "version": "2.0.199", + "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-2.0.199.tgz", + "integrity": "sha512-9TQGtteLrEMhF2GElAHyIHm/vEtW5QqmayuQ2O9lhlT8LinUqfuDaPgKIG6qtNMHVhLrm1zFnf7yXBypZg1KRA==", "dev": true, "license": "AGPL-3.0-only", "dependencies": { @@ -22968,9 +23904,9 @@ } }, "node_modules/scratch-storage": { - "version": "4.0.180", - "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.180.tgz", - "integrity": "sha512-EvBtMDtiA1mZqnFJduhaVoBQ5ekc2xJY3lu1turytNwKP0j9sVUnGmgz34AaHhkqJFwWr6Ivd7gEejNQOeQabA==", + "version": "4.0.215", + "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-4.0.215.tgz", + "integrity": "sha512-ZMEbX1Zhj9PJGrVceaV4leU2HJ5dPgzt4h0tki9Jo+SyUJkICC9Hspjh+nz+T3GJoY3494T0tFouIaKLf0Mgog==", "license": "AGPL-3.0-only", "dependencies": { "@babel/runtime": "^7.21.0", @@ -23002,7 +23938,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", "integrity": "sha512-6+bQU9iVYv23T8J0SjpV6MTugm0y8myh/4DPgu1BGfccysdkaWzu3MkNGQyQRUlbqAiW9wM7ctfv3USPEkzTgg==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/screenfull": { "version": "5.2.0", @@ -23023,9 +23960,9 @@ "license": "MIT" }, "node_modules/seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "dev": true, "license": "MIT" }, @@ -23051,9 +23988,9 @@ "license": "MIT" }, "node_modules/selenium-webdriver": { - "version": "4.34.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.34.0.tgz", - "integrity": "sha512-zGfQFcsASAv3KrYzYh+iw4fFqB7iZAgHW7BU6rRz7isK1i1X4x3LvjmZad4bUUgHDwTnAhlqTzDh21byB+zHMg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.35.0.tgz", + "integrity": "sha512-Baaeiuyu7BIIsSYf0SI7Mi55gsNmdI00KM0Hcofw1RnAY+0QEVpdh5yAxueDxgTZS8vcbGZFU0NJ6Qc1riIrLg==", "dev": true, "funding": [ { @@ -23383,6 +24320,13 @@ "seedrandom": "^2.4.2" } }, + "node_modules/shuffle-seed/node_modules/seedrandom": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", + "dev": true, + "license": "MIT" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -23502,32 +24446,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/simplicial-complex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", @@ -23885,9 +24803,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -23928,9 +24846,9 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, @@ -24054,7 +24972,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/static-eval": { "version": "2.1.1", @@ -26822,7 +27741,8 @@ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", "deprecated": "no longer maintained", - "dev": true + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/text-table": { "version": "0.2.0", @@ -26912,7 +27832,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", @@ -26952,6 +27873,7 @@ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, + "license": "MIT", "dependencies": { "tldts-core": "^6.1.86" }, @@ -26963,12 +27885,13 @@ "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, "license": "MIT", "engines": { @@ -27086,6 +28009,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" }, @@ -27098,6 +28022,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.3.1" }, @@ -27109,7 +28034,8 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.3.tgz", "integrity": "sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/transifex": { "version": "1.6.6", @@ -27139,6 +28065,21 @@ "dev": true, "license": "MIT" }, + "node_modules/transifex/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/transifex/node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -27334,6 +28275,26 @@ "dev": true, "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -27376,7 +28337,8 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/twgl.js/-/twgl.js-4.24.0.tgz", "integrity": "sha512-JGVTxuV9dqaBmajXyvuZIlhCHrTbIaoNjQvtdoLHyK74OtbmNwZUj6rfdp+pz9htitI/tVxiVQ2nuw+KmD29vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/two-product": { "version": "1.0.2", @@ -27423,9 +28385,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -27719,9 +28681,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "dev": true, "license": "MIT" }, @@ -27784,6 +28746,7 @@ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", "integrity": "sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==", "dev": true, + "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" @@ -28195,6 +29158,7 @@ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, + "license": "MIT", "dependencies": { "xml-name-validator": "^5.0.0" }, @@ -28260,7 +29224,8 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/webgl-context": { "version": "2.2.0", @@ -28283,22 +29248,23 @@ } }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -28312,7 +29278,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -28631,6 +29597,7 @@ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, @@ -28643,6 +29610,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -28662,6 +29630,7 @@ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -28671,6 +29640,7 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, + "license": "MIT", "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" @@ -28834,9 +29804,9 @@ } }, "node_modules/world-calendars": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", - "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.4.tgz", + "integrity": "sha512-VGRnLJS+xJmGDPodgJRnGIDwGu0s+Cr9V2HB3EzlDZ5n0qb8h5SJtGUEkjrphZYAglEiXZ6kiXdmk0H/h/uu/w==", "dev": true, "license": "MIT", "dependencies": { @@ -28883,9 +29853,9 @@ } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -28929,6 +29899,7 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18" } @@ -28985,22 +29956,22 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/yargs-parser": { @@ -29014,29 +29985,14 @@ "decamelize": "^1.2.0" } }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/yauzl": { diff --git a/package.json b/package.json index e64d1eb3582..386c4fb6411 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,9 @@ "test:unit:tap": "tap ./test/{unit-legacy,localization-legacy}/ --no-coverage -R classic", "test:unit:convertReportToXunit": "tap ./test/results/unit-raw.tap --no-coverage -R xunit > ./test/results/unit-tap-results.xml", "test:coverage": "tap ./test/{unit-legacy,localization-legacy}/ --coverage --coverage-report=lcov", - "build": "npm run clean && npm run translate && NODE_OPTIONS=--max_old_space_size=8000 webpack --bail", + "build": "npm run clean && npm run translate && npm run build:browserslist && NODE_OPTIONS=--max_old_space_size=8000 webpack --bail", "build:analyze": "ANALYZE_BUNDLE=true npm run build", + "build:browserslist": "browserslist | node ./bin/browserslist-to-html.cjs > ./build/browserslist.html", "clean": "rm -rf ./build && rm -rf ./intl && mkdir -p build && mkdir -p intl", "deploy": "npm run deploy:s3 && npm run deploy:fastly && npm run deploy:announce", "deploy:fastly": "node ./bin/configure-fastly.js", @@ -58,23 +59,23 @@ "react-twitter-embed": "3.0.3", "react-use": "17.6.0", "scratch-parser": "6.0.0", - "scratch-storage": "^4.0.179" + "scratch-storage": "^4.0.214" }, "devDependencies": { - "@babel/cli": "7.27.2", - "@babel/core": "7.27.7", - "@babel/eslint-parser": "7.27.5", + "@babel/cli": "7.28.3", + "@babel/core": "7.28.3", + "@babel/eslint-parser": "7.28.0", "@babel/plugin-syntax-dynamic-import": "7.8.3", "@babel/plugin-transform-async-to-generator": "7.27.1", - "@babel/plugin-transform-object-rest-spread": "7.27.7", - "@babel/preset-env": "7.27.2", + "@babel/plugin-transform-object-rest-spread": "7.28.0", + "@babel/preset-env": "7.28.3", "@babel/preset-react": "7.27.1", "@formatjs/intl-datetimeformat": "6.18.0", "@formatjs/intl-locale": "3.4.6", "@formatjs/intl-numberformat": "8.15.4", "@formatjs/intl-pluralrules": "5.4.4", "@formatjs/intl-relativetimeformat": "11.4.11", - "@scratch/scratch-gui": "11.3.0", + "@scratch/scratch-gui": "11.6.0-face-sensing.2", "@types/jest": "29.5.14", "async": "3.2.6", "autoprefixer": "10.4.21", @@ -129,7 +130,7 @@ "postcss-loader": "4.3.0", "postcss-simple-vars": "5.0.2", "prop-types": "15.8.1", - "query-string": "9.2.1", + "query-string": "9.2.2", "react": "16.14.0", "react-dom": "16.14.0", "react-intl": "5.25.1", @@ -145,17 +146,17 @@ "redux-mock-store": "1.5.5", "redux-thunk": "2.4.2", "regenerator-runtime": "0.13.9", - "sass": "1.89.2", + "sass": "1.90.0", "sass-loader": "10.5.2", - "scratch-l10n": "5.0.294", - "selenium-webdriver": "4.34.0", + "scratch-l10n": "6.0.30", + "selenium-webdriver": "4.35.0", "slick-carousel": "1.8.1", "stream-browserify": "3.0.0", "style-loader": "4.0.0", "tap": "14.11.0", "url-loader": "3.0.0", "use-onclickoutside": "0.4.1", - "webpack": "5.99.9", + "webpack": "5.101.2", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", "webpack-dev-middleware": "5.3.4", @@ -186,11 +187,10 @@ "all": true }, "browserslist": [ - "Chrome >= 63", - "Firefox >= 57", - "Edge >= 15", - "Safari >= 11", - "ChromeAndroid >= 63", - "ios_saf >= 11" + "Chrome >= 0 and last 3 years and not dead", + "Firefox >= 0 and last 3 years and not dead", + "Edge >= 0 and last 3 years and not dead", + "Safari >= 0 and last 3 years and not dead", + "ios_saf >= 0 and last 3 years and not dead" ] } diff --git a/renovate.json5 b/renovate.json5 index ea288a16745..c9ca1cafe93 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -3,5 +3,13 @@ "extends": [ "github>scratchfoundation/scratch-renovate-config:js-app" + ], + + "packageRules": [ + { + "description": "Force scratch-gui to follow a specific NPM tag. Use `latest` to stick to normal releases.", + "matchPackageNames": ["@scratch/scratch-gui"], + "followTag": "UEPR-282-face-sensing" + } ] } diff --git a/src/components/checkbox/simple-checkbox.jsx b/src/components/checkbox/simple-checkbox.jsx new file mode 100644 index 00000000000..ae0f3f32e6c --- /dev/null +++ b/src/components/checkbox/simple-checkbox.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import './simple-checkbox.scss'; + +export const SimpleCheckbox = ({id, checked, onChange, label}) => ( + +); + +SimpleCheckbox.propTypes = { + id: PropTypes.string.isRequired, + checked: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired, + label: PropTypes.node.isRequired +}; diff --git a/src/components/checkbox/simple-checkbox.scss b/src/components/checkbox/simple-checkbox.scss new file mode 100644 index 00000000000..892614a3962 --- /dev/null +++ b/src/components/checkbox/simple-checkbox.scss @@ -0,0 +1,41 @@ +@import "../../colors"; +@import "../../frameless"; + +.checkbox-container { + display: flex; + cursor: pointer; + align-items: center; + gap: 0.5rem; + color: $header-gray; + font-size: 0.75rem; + font-style: normal; + line-height: 1rem; + + input { + &[type=checkbox] { + cursor: pointer; + appearance: none; + border: 2px solid $active-gray; + border-radius: 4px; + width: 1.25rem; + height: 1.25rem; + + &:checked, + &:focus { + transition: all .25s ease; + } + + &:checked { + background-color: $ui-blue; + text-align: center; + text-indent: .125rem; + line-height: 1.1rem; + + &:after { + color: $type-white; + content: "\2714"; + } + } + } + } +} \ No newline at end of file diff --git a/src/components/grid/grid.jsx b/src/components/grid/grid.jsx index fd738fe5543..7c02b306227 100644 --- a/src/components/grid/grid.jsx +++ b/src/components/grid/grid.jsx @@ -1,6 +1,7 @@ const classNames = require('classnames'); const PropTypes = require('prop-types'); const React = require('react'); +const {useCallback} = require('react'); const Thumbnail = require('../thumbnail/thumbnail.jsx'); const FlexRow = require('../flex-row/flex-row.jsx'); @@ -8,49 +9,63 @@ const thumbnailUrl = require('../../lib/user-thumbnail'); require('./grid.scss'); -const Grid = props => ( -
- - {props.items.map((item, key) => { - const href = `/${props.itemType}/${item.id}/`; - if (props.itemType === 'projects') { +const Grid = props => { + const handleRemove = useCallback( + item => () => { + if (props.onRemove) { + props.onRemove(item); + } + }, + [props.onRemove] + ); + return ( +
+ + {props.items.map((item, key) => { + const href = `/${props.itemType}/${item.id}/`; + if (props.itemType === 'projects') { + return ( + + ); + } return ( ); - } - return ( - - ); - })} - -
-); + })} +
+
+ ); +}; Grid.propTypes = { className: PropTypes.string, @@ -60,7 +75,9 @@ Grid.propTypes = { showFavorites: PropTypes.bool, showLoves: PropTypes.bool, showRemixes: PropTypes.bool, - showViews: PropTypes.bool + showViews: PropTypes.bool, + showRemoveButton: PropTypes.bool, + onRemove: PropTypes.func }; Grid.defaultProps = { @@ -70,7 +87,9 @@ Grid.defaultProps = { showFavorites: false, showRemixes: false, showViews: false, - showAvatar: false + showAvatar: false, + showRemoveButton: false, + onRemove: null }; module.exports = Grid; diff --git a/src/components/modal/share/modal.jsx b/src/components/modal/share/modal.jsx new file mode 100644 index 00000000000..5f0955758fa --- /dev/null +++ b/src/components/modal/share/modal.jsx @@ -0,0 +1,128 @@ +import React, {useCallback, useState, useEffect} from 'react'; +import PropTypes from 'prop-types'; +import Modal from '../base/modal.jsx'; +import ModalTitle from '../base/modal-title.jsx'; +import ModalInnerContent from '../base/modal-inner-content.jsx'; +import {SimpleCheckbox} from '../../checkbox/simple-checkbox.jsx'; +import {FormattedMessage, useIntl} from 'react-intl'; +import {setLocalStorageValue} from '../../../lib/local-storage.js'; +import './modal.scss'; + +const updateLocalStorage = (username = 'guest', dontShowAgain) => { + if (dontShowAgain === false) { + return; + } + + // `dontShowAgain` is true => we need to update the preference to false + setLocalStorageValue('shareModalPreference', username, false); +}; + +// This modal uses texts from preview/l10n.json +// Parametrise texts if needed to be used outside of the preview context. +const ShareModal = ({ + isOpen, + onClose, + onChangeThumbnail, + onShare, + projectThumbnailUrl, + username +}) => { + const intl = useIntl(); + const [dontShowAgain, setDontShowAgain] = useState(false); + + const handleCheckboxChange = useCallback(e => { + setDontShowAgain(e.target.checked); + }, []); + + const handleChangeThumbnail = useCallback(() => { + updateLocalStorage(username, dontShowAgain); + onChangeThumbnail(); + }, [username, dontShowAgain, onChangeThumbnail]); + + const handleShare = useCallback(() => { + updateLocalStorage(username, dontShowAgain); + onShare(); + }, [username, dontShowAgain, onShare]); + + // Preload the project thumbnail image to ensure it is ready when the modal opens. + useEffect(() => { + if (projectThumbnailUrl) { + new Image().src = projectThumbnailUrl; + } + }, [projectThumbnailUrl]); + + return ( + + } + /> + +
+ +
+
+ Project thumbnail +
+
+ +
+
+ +
+
+
+
+
+ +
+
+ + +
+
+
+ + + ); +}; + +ShareModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + onChangeThumbnail: PropTypes.func.isRequired, + onShare: PropTypes.func.isRequired, + projectThumbnailUrl: PropTypes.string, + username: PropTypes.string +}; + +export {ShareModal}; diff --git a/src/components/modal/share/modal.scss b/src/components/modal/share/modal.scss new file mode 100644 index 00000000000..4b5f3fd8350 --- /dev/null +++ b/src/components/modal/share/modal.scss @@ -0,0 +1,98 @@ +@import "../../../colors"; +@import "../../../frameless"; + +.share-modal { + margin-top: 15vh; + width: 39.25rem; + border-radius: .5rem; + overflow: hidden; + + .title { + display: flex; + align-items: center; + box-shadow: inset 0 -1px 0 0 $ui-blue; + background: $ui-blue; + width: 100%; + height: 3rem; + padding-left: 12px; + } + + .title-text { + text-align: center; + color: white; + font-size: 1rem; + font-weight: 700; + line-height: 1.25rem; + } + + .share-modal-inner { + padding: 1.5rem; + padding-bottom: 1rem; + gap: 1.5rem; + background: white; + font-size: 1rem; + font-weight: 400; + line-height: 1.75rem; + } + + .thumbnail-container { + display: flex; + justify-content: center; + } + + .thumbnail-img { + border-radius: .5rem; + width: 300px; + height: 240px; + } + + .footer { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .divider { + width: 100%; + border-top: 1px solid $ui-blue-25percent; + } + + .button-row { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + } + + .actions { + display: flex; + gap: 1rem; + } + + .ok-button, .change-thumbnail-button { + border: none; + border-radius: 4px; + padding: 0.75rem 1rem; + font-size: 1rem; + font-weight: 700; + line-height: 1.25rem; + text-align: center; + cursor: pointer; + } + + .ok-button { + background: $ui-blue; + color: $type-white; + border: none; + } + + .change-thumbnail-button { + background: white; + color: $ui-blue; + border: 1px solid $ui-blue; + } +} + +.share-modal-overlay { + background-color: $active-gray; +} diff --git a/src/components/modal/update-thumbnail-info/modal.jsx b/src/components/modal/update-thumbnail-info/modal.jsx new file mode 100644 index 00000000000..c8329cf7aef --- /dev/null +++ b/src/components/modal/update-thumbnail-info/modal.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Modal from '../base/modal.jsx'; +import ModalTitle from '../base/modal-title.jsx'; +import ModalInnerContent from '../base/modal-inner-content.jsx'; +import {FormattedMessage} from 'react-intl'; +import './modal.scss'; + +const UpdateThumbnailInfoModal = ({isOpen, hideModal}) => ( + + } + /> + +
+ +
+
+ +
+
+
+); + +UpdateThumbnailInfoModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + hideModal: PropTypes.func.isRequired +}; + +export {UpdateThumbnailInfoModal}; diff --git a/src/components/modal/update-thumbnail-info/modal.scss b/src/components/modal/update-thumbnail-info/modal.scss new file mode 100644 index 00000000000..f65b56a14e2 --- /dev/null +++ b/src/components/modal/update-thumbnail-info/modal.scss @@ -0,0 +1,63 @@ +@import "../../../colors"; +@import "../../../frameless"; + +.update-thumbnail-info-modal { + margin-top: 30vh; + width: 26rem; + border-radius: .5rem; + overflow: hidden; + + .update-thumbnail-info-modal-title { + display: flex; + align-items: center; + box-shadow: inset 0 -1px 0 0 $ui-blue; + background: $ui-blue; + width: 100%; + height: 3rem; + padding-left: 12px; + } + + .update-thumbnail-info-modal-title-text { + text-align: center; + color: white; + font-size: 1rem; + font-weight: 700; + line-height: 1.25rem; + } + + .update-thumbnail-info-modal-inner { + padding: 1.5rem; + padding-bottom: 1rem; + gap: 1.5rem; + background: white; + font-size: 1rem; + font-weight: 400; + line-height: 1.75rem; + } + + .update-thumbnail-info-modal-button-row { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + } + + .update-thumbnail-info-modal-ok-button { + width: 100%; + max-width: 368px; + background: $ui-blue; + color: white; + border: none; + border-radius: 4px; + padding: 0.75rem; + font-size: 1rem; + font-weight: 700; + line-height: 1.25rem; + text-align: center; + cursor: pointer; + } +} + +.update-thumbnail-info-modal-overlay { + background-color: $active-gray; +} diff --git a/src/components/thumbnail/thumbnail-remove-button.jsx b/src/components/thumbnail/thumbnail-remove-button.jsx new file mode 100644 index 00000000000..922cde7f838 --- /dev/null +++ b/src/components/thumbnail/thumbnail-remove-button.jsx @@ -0,0 +1,20 @@ +const React = require('react'); +require('./thumbnail-remove-button.scss'); +const PropTypes = require('prop-types'); + +const ThumbnailRemoveButton = ({onClick}) => ( + +); + +ThumbnailRemoveButton.propTypes = { + onClick: PropTypes.func +}; + +module.exports = ThumbnailRemoveButton; diff --git a/src/components/thumbnail/thumbnail-remove-button.scss b/src/components/thumbnail/thumbnail-remove-button.scss new file mode 100644 index 00000000000..24f93f22b1b --- /dev/null +++ b/src/components/thumbnail/thumbnail-remove-button.scss @@ -0,0 +1,22 @@ +@import "../../colors"; + +.thumbnail-remove-button { + position: absolute; + top: -4px; + right: -4px; + background: $ui-white; + border: 1px solid $ui-border; + color: $type-gray; + font-size: 12px; + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 50%; + cursor: pointer; + z-index: 2; + + &:hover { + background: $ui-border; + } +} diff --git a/src/components/thumbnail/thumbnail.jsx b/src/components/thumbnail/thumbnail.jsx index 461cd67b1a4..9bfd7e6899a 100644 --- a/src/components/thumbnail/thumbnail.jsx +++ b/src/components/thumbnail/thumbnail.jsx @@ -4,6 +4,8 @@ const React = require('react'); require('./thumbnail.scss'); +const ThumbnailRemoveButton = require('./thumbnail-remove-button.jsx'); + const Thumbnail = props => { const extra = []; const info = []; @@ -110,6 +112,7 @@ const Thumbnail = props => { ); } + return (
{
{extra} + {props.showRemoveButton && + + } ); }; @@ -145,10 +151,12 @@ Thumbnail.propTypes = { showLoves: PropTypes.bool, showRemixes: PropTypes.bool, showViews: PropTypes.bool, + showRemoveButton: PropTypes.bool, src: PropTypes.string, title: PropTypes.string, type: PropTypes.string, - views: PropTypes.oneOfType([PropTypes.number, PropTypes.string]) + views: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + onRemove: PropTypes.func }; Thumbnail.defaultProps = { @@ -161,9 +169,11 @@ Thumbnail.defaultProps = { showLoves: false, showRemixes: false, showViews: false, + showRemoveButton: false, src: '', title: 'Project', - type: 'project' + type: 'project', + onRemove: null }; module.exports = Thumbnail; diff --git a/src/components/thumbnail/thumbnail.scss b/src/components/thumbnail/thumbnail.scss index e1f1bf79549..039caec2d33 100644 --- a/src/components/thumbnail/thumbnail.scss +++ b/src/components/thumbnail/thumbnail.scss @@ -1,6 +1,7 @@ @import "../../colors"; .thumbnail { + position: relative; .thumbnail-image { display: block; diff --git a/src/lib/extensions.js b/src/lib/extensions.js index 94e7b021b19..2254371924e 100644 --- a/src/lib/extensions.js +++ b/src/lib/extensions.js @@ -16,6 +16,10 @@ const EXTENSION_INFO = { l10nId: 'project.videoSensingChip', icon: 'extension-videosensing.svg' }, + faceSensing: { + l10nId: 'project.faceSensingChip', + icon: 'extension-facesensing.svg' + }, text2speech: { l10nId: 'project.text2SpeechChip', icon: 'extension-text2speech.svg' diff --git a/src/lib/local-storage.js b/src/lib/local-storage.js new file mode 100644 index 00000000000..568f7efdd94 --- /dev/null +++ b/src/lib/local-storage.js @@ -0,0 +1,32 @@ +/** + * Util functions for managing local storage entries as key-value pairs. + */ + +const getMap = key => { + try { + const raw = localStorage.getItem(key); + return raw ? JSON.parse(raw) : {}; + } catch (e) { + return {}; + } +}; + +const setMap = (key, map) => { + localStorage.setItem(key, JSON.stringify(map)); +}; + +const getLocalStorageValue = (key, id) => { + const map = getMap(key); + return map[id]; +}; + +const setLocalStorageValue = (key, id, value) => { + const map = getMap(key); + map[id] = value; + setMap(key, map); +}; + +module.exports = { + getLocalStorageValue, + setLocalStorageValue +}; diff --git a/src/lib/project-info.js b/src/lib/project-info.js index 30b82e777cb..27485e5a13c 100644 --- a/src/lib/project-info.js +++ b/src/lib/project-info.js @@ -21,7 +21,8 @@ module.exports = { return Object.values(stage.variables) .some(variable => variable.length === 3); // 3 entries if cloud var }, - videoSensing: project => (project.extensions || []).includes('videoSensing') + videoSensing: project => (project.extensions || []).includes('videoSensing'), + faceSensing: project => (project.extensions || []).includes('faceSensing') }, 2: { extensions: () => [], // Showing extension chip not implemented for scratch2 projects diff --git a/src/redux/preview.js b/src/redux/preview.js index 6c81a0095bc..df6cd184f92 100644 --- a/src/redux/preview.js +++ b/src/redux/preview.js @@ -686,7 +686,7 @@ module.exports.reportProject = (id, jsonData, token) => (dispatch => { }); }); -module.exports.updateProjectThumbnail = (id, blob) => (dispatch => { +module.exports.updateProjectThumbnail = (id, blob, onSuccess, onError) => (dispatch => { dispatch(module.exports.setFetchStatus('project-thumbnail', module.exports.Status.FETCHING)); api({ uri: `${process.env.THUMBNAIL_URI.replace('{}', id)}`, @@ -697,13 +697,19 @@ module.exports.updateProjectThumbnail = (id, blob) => (dispatch => { withCredentials: true, useCsrf: true, body: blob, - host: process.env.THUMBNAIL_HOST + host: process.env.THUMBNAIL_HOST, + // The responseType is `json` on success, but on error it returns `text/html`. + // Passing `json` causes an internal error in xhr when `text/html` is returned, that doesn't bubble up. + // Currently we don't use the body anyways, so it should be okay if it's unparsed. + responseType: 'text/html' }, (err, body, res) => { if (err || res.statusCode !== 200) { dispatch(module.exports.setFetchStatus('project-thumbnail', module.exports.Status.ERROR)); + onError?.(); return; } dispatch(module.exports.setFetchStatus('project-thumbnail', module.exports.Status.FETCHED)); + onSuccess?.(); }); }); diff --git a/src/views/explore/explore.jsx b/src/views/explore/explore.jsx index 049dbc08313..c370cd223c1 100644 --- a/src/views/explore/explore.jsx +++ b/src/views/explore/explore.jsx @@ -4,9 +4,11 @@ const injectIntl = require('react-intl').injectIntl; const FormattedMessage = require('react-intl').FormattedMessage; const React = require('react'); const render = require('../../lib/render.jsx'); +const {connect} = require('react-redux'); const api = require('../../lib/api'); const intlShape = require('../../lib/intl-shape'); +const PropTypes = require('prop-types'); const {getLocale} = require('../../lib/locales.js'); const Page = require('../../components/page/www/page.jsx'); @@ -27,12 +29,15 @@ class Explore extends React.Component { 'getExploreState', 'handleGetExploreMore', 'handleChangeSortMode', + 'handleToggleRemoveButton', + 'handleRemove', 'getBubble' ]); this.state = this.getExploreState(); this.state.loaded = []; this.state.offset = 0; + this.state.showRemoveButton = false; } componentDidMount () { this.handleGetExploreMore(); @@ -101,6 +106,27 @@ class Explore extends React.Component { `${window.location.origin}/explore/${this.state.itemType}/${this.state.category}/${value}`; } } + + handleToggleRemoveButton (e) { + this.setState({showRemoveButton: e.target.checked}); + } + + handleRemove (item) { + // TODO: don't slice the itemType (this was a hacky way to turn 'projects' --> 'project') + api({ + uri: `/admin/search/${this.state.itemType.slice(0, -1)}/${item.id}`, + method: 'DELETE' + }, err => { + if (err) { + alert('Error removing project.'); // eslint-disable-line no-alert + console.error(err); + } else { + const updated = this.state.loaded.filter(p => p.id !== item.id); + this.setState({loaded: updated}); + } + }); + } + getBubble (type) { const classes = classNames({ active: (this.state.category === type) @@ -211,6 +237,18 @@ class Explore extends React.Component { /> + {this.props.session?.session?.permissions?.admin && ( +
+ +
+ )}
@@ -782,6 +785,7 @@ PreviewPresentation.propTypes = { justShared: PropTypes.bool, loveCount: PropTypes.number, loved: PropTypes.bool, + manuallySaveThumbnails: PropTypes.bool, modInfo: PropTypes.shape({ scriptCount: PropTypes.number, spriteCount: PropTypes.number @@ -832,7 +836,7 @@ PreviewPresentation.propTypes = { reportOpen: PropTypes.bool, showAdminPanel: PropTypes.bool, showCloudDataAlert: PropTypes.bool, - showCloudDataAndVideoAlert: PropTypes.bool, + cloudDataDisabledForPrivacy: PropTypes.bool, showEmailConfirmationModal: PropTypes.bool, showEmailConfirmationBanner: PropTypes.bool, showModInfo: PropTypes.bool, diff --git a/src/views/preview/preview.jsx b/src/views/preview/preview.jsx index 20c042bac40..98d323115e3 100644 --- a/src/views/preview/preview.jsx +++ b/src/views/preview/preview.jsx @@ -3,6 +3,7 @@ const React = require('react'); const Page = require('../../components/page/www/page.jsx'); const render = require('../../lib/render.jsx'); +const AlertProvider = require('../../components/alert/alert-provider.jsx').default; const previewActions = require('../../redux/preview.js'); const commentActions = require('../../redux/comments.js'); @@ -14,7 +15,9 @@ const {feedbackReducer} = require('../../redux/qualitative-feedback.js'); if (isSupportedBrowser()) { const ProjectView = require('./project-view.jsx'); render( - , + + + , document.getElementById('app'), { preview: previewActions.previewReducer, diff --git a/src/views/preview/project-view.jsx b/src/views/preview/project-view.jsx index c0376afc48d..4664cabf58e 100644 --- a/src/views/preview/project-view.jsx +++ b/src/views/preview/project-view.jsx @@ -10,6 +10,7 @@ const injectIntl = require('react-intl').injectIntl; const parser = require('scratch-parser'); const queryString = require('query-string').default; +const intlShape = require('../../lib/intl-shape'); const api = require('../../lib/api'); const Page = require('../../components/page/www/page.jsx'); const storage = require('../../lib/storage.js').default; @@ -24,7 +25,12 @@ const Scratch3Registration = require('../../components/registration/scratch3-reg const ConnectedLogin = require('../../components/login/connected-login.jsx'); const CanceledDeletionModal = require('../../components/login/canceled-deletion-modal.jsx'); const NotAvailable = require('../../components/not-available/not-available.jsx'); +const Alert = require('../../components/alert/alert.jsx').default; +const AlertContext = require('../../components/alert/alert-context.js').default; const Meta = require('./meta.jsx'); +const {ShareModal} = require('../../components/modal/share/modal.jsx'); +const {UpdateThumbnailInfoModal} = require('../../components/modal/update-thumbnail-info/modal.jsx'); +const {driver} = require('driver.js'); const sessionActions = require('../../redux/session.js'); const {selectProjectCommentsGloballyEnabled, selectIsTotallyNormal} = require('../../redux/session'); @@ -52,6 +58,24 @@ const {shouldDisplayFeedbackWidget, sendUserPropertiesForFeedback} = require('.. const {displayQualitativeFeedback} = require('../../redux/qualitative-feedback.js'); const {DebuggingFeedback} = require('../../components/modal/feedback/debugging-feedback.jsx'); const {TutorialsFeedback} = require('../../components/modal/feedback/tutorials-feedback.jsx'); +const {getLocalStorageValue, setLocalStorageValue} = require('../../lib/local-storage.js'); +require('./project-view.scss'); + +const hasIntroducedShareModalFlow = (username = 'guest') => + getLocalStorageValue('hasIntroducedShareModalFlow', username) === true; + +const setHasIntroducedShareModalFlow = (username = 'guest') => + setLocalStorageValue('hasIntroducedShareModalFlow', username, true); + +const shouldShowShareModal = (username = 'guest') => + getLocalStorageValue('shareModalPreference', username) !== false; + +const isFirstManualThumbnailUpdate = (username = 'guest') => + getLocalStorageValue('isFirstManualThumbnailUpdate', username) !== false; + +const setFirstManualThumbnailUpdate = (username = 'guest') => { + setLocalStorageValue('isFirstManualThumbnailUpdate', username, false); +}; const IntlGUIWithProjectHandler = ({...props}) => { const [showJourney, setShowJourney] = useState(false); @@ -143,6 +167,7 @@ class Preview extends React.Component { super(props); bindAll(this, [ 'addEventListeners', + 'doShare', 'fetchCommunityData', 'handleAddComment', 'handleClickLogo', @@ -160,6 +185,7 @@ class Preview extends React.Component { 'handleCloseEmailConfirmationModal', 'handleBannerDismiss', 'handleIsRemixing', + 'handleManualThumbnailUpdate', 'handleOpenAdminPanel', 'handleReportClick', 'handleReportClose', @@ -176,14 +202,24 @@ class Preview extends React.Component { 'handleSetProjectThumbnailer', 'handleShare', 'handleShareAttempt', + 'handleShareModalChangeThumbnailButton', 'handleUpdateProjectData', 'handleUpdateProjectId', 'handleUpdateProjectTitle', 'handleToggleComments', + 'showThumbnailUpdateInfoTooltip', + 'hideThumbnailUpdateInfoTooltip', + 'showShareModal', + 'hideShareModal', + 'highlightSetThumbnailButton', + 'hidehighlightSetThumbnailButton', + 'showThumbnailUpdateInfoModal', + 'hideThumbnailUpdateInfoModal', 'initCounts', 'pushHistory', 'renderLogin', - 'setScreenFromOrientation' + 'setScreenFromOrientation', + 'updateLocalThumbnailFromBlob' ]); const pathname = window.location.pathname.toLowerCase(); const parts = pathname.split('/').filter(Boolean); @@ -209,6 +245,8 @@ class Preview extends React.Component { favoriteCount: 0, isProjectLoaded: false, isRemixing: false, + isThumbnailUpdateInfoModalOpen: false, + isShareModalOpen: false, invalidProject: parts.length === 1, justRemixed: false, justShared: false, @@ -223,7 +261,10 @@ class Preview extends React.Component { projectId: parts[1] === 'editor' ? '0' : parts[1], reportOpen: false, singleCommentId: singleCommentId, - greenFlagRecorded: false + greenFlagRecorded: false, + tooltipDriver: null, + highlightDriver: null, + projectThumbnailUrl: this.props.projectInfo.image ?? '' }; /* In the beginning, if user is on mobile and landscape, go to fullscreen */ this.setScreenFromOrientation(); @@ -281,6 +322,12 @@ class Preview extends React.Component { } } } + if (this.props.projectInfo.image !== prevProps.projectInfo.image && + this.props.projectInfo.image !== this.state.projectThumbnailUrl) { + this.setState({ + projectThumbnailUrl: this.props.projectInfo.image + }); + } if (this.props.faved !== prevProps.faved || this.props.loved !== prevProps.loved) { this.setState({ // eslint-disable-line react/no-did-update-set-state clientFaved: this.props.faved, @@ -292,6 +339,31 @@ class Preview extends React.Component { this.pushHistory(history.state === null); } + // eslint-disable-next-line no-undefined + if (prevProps.user.username !== this.props.user.username && + this.props.user.username && + this.props.playerMode && + isFirstManualThumbnailUpdate(this.props.user.username)) { + this.showThumbnailUpdateInfoTooltip(); + } + + // Hide the tooltip in case of any absolute position element opened + if (((!this.props.playerMode && prevProps.playerMode) || + (this.props.fullScreen && !prevProps.fullScreen) || + this.state.isShareModalOpen || + this.state.isThumbnailUpdateInfoModalOpen) && + this.state.tooltipDriver) { + this.hideThumbnailUpdateInfoTooltip(); + } + + if (((this.props.playerMode && !prevProps.playerMode) || + (this.props.playerMode && !this.props.fullScreen && prevProps.fullScreen)) && + !this.state.tooltipDriver && + isFirstManualThumbnailUpdate(this.props.user.username) && + !this.state.isShareModalOpen) { + this.showThumbnailUpdateInfoTooltip(); + } + // Switching out of editor mode, refresh data that comes from project json if (this.props.playerMode && !prevProps.playerMode) { storage.setProjectToken(this.props.projectInfo.project_token); @@ -327,6 +399,9 @@ class Preview extends React.Component { componentWillUnmount () { this.removeEventListeners(); } + + static contextType = AlertContext; + addEventListeners () { window.addEventListener('popstate', this.handlePopState); window.addEventListener('orientationchange', this.setScreenFromOrientation); @@ -352,6 +427,19 @@ class Preview extends React.Component { } } + updateLocalThumbnailFromBlob (blob) { + const reader = new FileReader(); + + reader.readAsDataURL(blob); + reader.onload = () => { + const dataUri = reader.result; + this.setState({ + projectThumbnailUrl: dataUri + }); + }; + reader.onerror = error => console.error('Error reading thumbnail blob:', error); + } + // This is copy of what is in save-project-to-server in GUI that adds // an extra get of the project info from api. We do this to wait for replication // lag to pass. This is intended to be a temporary fix until we use the data @@ -500,7 +588,10 @@ class Preview extends React.Component { // Check for username and video blocks only if user is logged in if (this.props.isLoggedIn) { newState.showUsernameBlockAlert = helpers.usernameBlock(projectData[0]); - newState.showCloudDataAndVideoAlert = hasCloudData && helpers.videoSensing(projectData[0]); + newState.cloudDataDisabledForPrivacy = + hasCloudData && + (helpers.videoSensing(projectData[0]) || + helpers.faceSensing(projectData[0])); } else { // Check for cloud vars only if user is logged out newState.showCloudDataAlert = hasCloudData; } @@ -620,7 +711,7 @@ class Preview extends React.Component { this.setState({ showUsernameBlockAlert: false, showCloudDataAlert: false, - showCloudDataAndVideoAlert: false, + cloudDataDisabledForPrivacy: false, greenFlagRecorded: true }); } @@ -745,7 +836,7 @@ class Preview extends React.Component { this.setState({ // Remove any project alerts so they don't show up later showUsernameBlockAlert: false, showCloudDataAlert: false, - showCloudDataAndVideoAlert: false + cloudDataDisabledForPrivacy: false }); this.props.setPlayer(false); if (this.state.justRemixed || this.state.justShared) { @@ -755,7 +846,7 @@ class Preview extends React.Component { }); } } - handleShare () { + doShare () { this.props.shareProject( this.props.projectInfo.id, this.props.user.token @@ -765,6 +856,13 @@ class Preview extends React.Component { justShared: true }); } + handleShare () { + if (shouldShowShareModal(this.props.user.username)) { + this.showShareModal(); + } else { + this.doShare(); + } + } handleShareAttempt () { this.setState({ showEmailConfirmationModal: true @@ -832,6 +930,127 @@ class Preview extends React.Component { this.props.user.token ); } + handleManualThumbnailUpdate (id, blob) { + const onSuccess = () => { + this.context.successAlert({ + id: 'project.updateThumbnail.success' + }); + // Update the thumbnail to point to the blob, + // to avoid having to make another request to + // refetch the thumbnail. + this.updateLocalThumbnailFromBlob(blob); + }; + const onError = () => this.context.errorAlert({ + id: 'project.updateThumbnail.error' + }); + this.hidehighlightSetThumbnailButton(); + + // Track the button click in GA + triggerAnalyticsEvent({ + event: 'set-thumbnail-button-click', + // This is a user property - ideally it would be set once on page load, + // but since this is the only event that uses it, we can set it here + // for simplicity for now. + user_id: this.props.user.id?.toString(), + project_id: id + }); + + return this.props.handleUpdateProjectThumbnail( + id, + blob, + true, // isManualUpdate + this.props.user.username, + this.showThumbnailUpdateInfoModal, + onSuccess, + onError + ); + } + handleShareModalChangeThumbnailButton () { + this.hideShareModal(); + // Only highlight the 'Set Thumbnail' button the first time + if (!hasIntroducedShareModalFlow(this.props.user.username)) { + this.highlightSetThumbnailButton(); + setHasIntroducedShareModalFlow(this.props.user.username); + } + } + showShareModal () { + this.setState({ + isShareModalOpen: true + }); + } + hideShareModal () { + this.setState({ + isShareModalOpen: false + }); + } + highlightSetThumbnailButton () { + const highlightDriver = driver({ + popoverClass: 'driverjs-theme' + }); + highlightDriver.highlight({ + element: 'span[class*="stage-header_setThumbnailButton"]' + }); + + this.setState({ + highlightDriver + }); + } + hidehighlightSetThumbnailButton () { + if (this.state.highlightDriver) { + this.state.highlightDriver.destroy(); + this.setState({ + highlightDriver: null + }); + } + } + showThumbnailUpdateInfoModal () { + this.setState({ + isThumbnailUpdateInfoModalOpen: true + }); + } + hideThumbnailUpdateInfoModal () { + this.setState({ + isThumbnailUpdateInfoModalOpen: false + }); + } + showThumbnailUpdateInfoTooltip () { + this.setState({ + tooltipDriver: driver({ + allowClose: false, + overlayColor: 'transparent', + popoverOffset: 4, + steps: [{ + element: 'span[class*="stage-header_setThumbnailButton"]', + popover: { + title: this.props.intl.formatMessage({id: 'project.updateThumbnailTooltip'}), + side: 'bottom', + align: 'center', + popoverClass: 'tooltip-set-thumbnail', + showButtons: [] + } + }] + })}); + + const showThumbnailUpdateInfoTooltipWhenGuiReady = () => { + const setThumbnailButton = document.querySelector('span[class*="stage-header_setThumbnailButton"]'); + const loadingProjectIndicator = document.querySelector('div[class*="loader_block-animation"]'); + // Has the project loaded? + if (setThumbnailButton && !loadingProjectIndicator && this.state.tooltipDriver) { + this.state.tooltipDriver.drive(); + } else { + setTimeout(showThumbnailUpdateInfoTooltipWhenGuiReady, 200); + } + }; + showThumbnailUpdateInfoTooltipWhenGuiReady(); + } + hideThumbnailUpdateInfoTooltip () { + if (this.state.tooltipDriver) { + this.state.tooltipDriver.destroy(); + this.setState({ + tooltipDriver: null + }); + } + } initCounts (favorites, loves) { this.setState({ favoriteCount: favorites, @@ -856,7 +1075,6 @@ class Preview extends React.Component { ); } render () { - // Only show GUI if the project has no id, is a loaded local project, or has the project token loaded const showGUI = (!this.state.projectId || this.state.projectId === '0' || this.state.isProjectLoaded || (this.props.projectInfo && this.props.projectInfo.project_token)); @@ -884,6 +1102,22 @@ class Preview extends React.Component { 'admin-panel-open': this.state.adminPanelOpen })} > + + + this.hideShareModal()} + onChangeThumbnail={this.handleShareModalChangeThumbnailButton} + onShare={() => { + this.hideShareModal(); + this.doShare(); + }} + projectThumbnailUrl={this.state.projectThumbnailUrl} + username={this.props.user.username} + /> : @@ -1027,7 +1262,6 @@ class Preview extends React.Component { onToggleLoginOpen={this.props.handleToggleLoginOpen} onUpdateProjectData={this.handleUpdateProjectData} onUpdateProjectId={this.handleUpdateProjectId} - onUpdateProjectThumbnail={this.props.handleUpdateProjectThumbnail} onUpdateProjectTitle={this.handleUpdateProjectTitle} user={this.props.user} platform={'WEB'} @@ -1035,6 +1269,10 @@ class Preview extends React.Component { onActivateDeck={this.props.onActivateDeck} displayFeedback={this.props.displayFeedback} feedback={this.props.feedback} + // In this case, pass the base handleUpdateProjectThumbnail + // function, to be used on project creation + onUpdateProjectThumbnail={this.props.handleUpdateProjectThumbnail} + manuallySaveThumbnails={process.env.MANUALLY_SAVE_THUMBNAILS === 'true'} /> )} @@ -1056,6 +1294,7 @@ class Preview extends React.Component { } Preview.propTypes = { + intl: intlShape, assetHost: PropTypes.string.isRequired, // If there's no author, this will be false` authorId: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), @@ -1291,9 +1530,27 @@ const mapDispatchToProps = dispatch => ({ dispatch(projectCommentActions.resetComments()); dispatch(projectCommentActions.getTopLevelComments(id, 0, ownerUsername, isAdmin, token)); }, - handleUpdateProjectThumbnail: (id, blob) => { - dispatch(previewActions.updateProjectThumbnail(id, blob)); - }, + handleUpdateProjectThumbnail: + ( + id, + blob, + isManualUpdate, + username, + showThumbnailUpdateInfoModal, + onSuccess, + onError + ) => { + // If this is the first manual thumbnail update for this user, show an + // information modal to introduce the new feature. + // Otherwise, just update the thumbnail. + // TODO: Remove this after a few months. + if (isManualUpdate && isFirstManualThumbnailUpdate(username)) { + showThumbnailUpdateInfoModal(); + setFirstManualThumbnailUpdate(username); + } else { + dispatch(previewActions.updateProjectThumbnail(id, blob, onSuccess, onError)); + } + }, getOriginalInfo: id => { dispatch(previewActions.getOriginalInfo(id)); }, @@ -1382,10 +1639,12 @@ const mapDispatchToProps = dispatch => ({ } }); -module.exports.View = connect( - mapStateToProps, - mapDispatchToProps -)(Preview); +module.exports.View = injectIntl( + connect( + mapStateToProps, + mapDispatchToProps + )(Preview) +); // replace old Scratch 2.0-style hashtag URLs with updated format if (window.location.hash) { diff --git a/src/views/preview/project-view.scss b/src/views/preview/project-view.scss new file mode 100644 index 00000000000..737128cabf7 --- /dev/null +++ b/src/views/preview/project-view.scss @@ -0,0 +1,39 @@ +@import "../../colors"; +@import "../../frameless"; + +// Below selectors are much hackier than I'd like, but we can't style the overlay +// directly, and since we have two driverjs instances in the component requiring +// different behaviors (one acts like a tooltip, the other like a highlight), +// we need to be specific. +.driver-active:has(.tooltip-set-thumbnail) * { + pointer-events: auto !important; +} + +.tooltip-set-thumbnail ~ .driver-overlay { + z-index: -1 !important; +} + +.driver-popover.tooltip-set-thumbnail { + padding: 18px; + background-color: $ui-blue; + color: white; + text-align: center; + z-index: 10; +} + +.driver-popover.tooltip-set-thumbnail .driver-popover-title { + font-weight: 700; + line-height: 1.25rem; + font-size: 1rem; +} + +.driver-popover.tooltip-set-thumbnail .driver-popover-arrow-side-bottom { + border-bottom-color: $ui-blue; +} + +// TODO: Rewrite alert.jsx to allow for passing element id, +// hence we don't need to use !important for specificity. +.thumbnail-upload-alert { + padding: 12px !important; + min-height: 52px !important; +} \ No newline at end of file diff --git a/src/views/search/search.jsx b/src/views/search/search.jsx index 738f2ae0d05..73ba2f392ac 100644 --- a/src/views/search/search.jsx +++ b/src/views/search/search.jsx @@ -16,6 +16,7 @@ import TitleBanner from '../../components/title-banner/title-banner.jsx'; import Tabs from '../../components/tabs/tabs.jsx'; import {selectIsTotallyNormal} from '../../redux/session'; +import sessionActions from '../../redux/session.js'; import Page from '../../components/page/www/page.jsx'; import render from '../../lib/render.jsx'; @@ -90,7 +91,13 @@ class Search extends React.Component { this.props.dispatch(navigationActions.setSearchTerm(term)); } componentDidUpdate (prevProps) { - if (this.props.searchTerm !== prevProps.searchTerm) { + const sessionLoaded = this.props.session.status === sessionActions.Status.FETCHED; + const wasSessionLoaded = prevProps.session.status === sessionActions.Status.FETCHED; + + const becameAuthenticated = !wasSessionLoaded && sessionLoaded; + const searchChanged = this.props.searchTerm !== prevProps.searchTerm; + + if (sessionLoaded && (searchChanged || becameAuthenticated)) { this.handleGetSearchMore(); } } @@ -133,9 +140,13 @@ class Search extends React.Component { if (termText) { queryString += `&q=${termText}`; } + + const isAdmin = this.props.session?.session?.permissions?.admin; + const token = this.props.session?.session?.user?.token; api({ - uri: `/search/${this.state.tab}?${queryString}` + uri: `${isAdmin ? '/admin' : ''}/search/${this.state.tab}?${queryString}`, + ...(isAdmin && token ? {authentication: token} : {}) }, (err, body) => { const loadedSoFar = this.state.loaded; Array.prototype.push.apply(loadedSoFar, body); @@ -284,12 +295,14 @@ class Search extends React.Component { Search.propTypes = { dispatch: PropTypes.func, intl: intlShape, - isTotallyNormal: PropTypes.bool, // eslint-disable-line react/no-unused-prop-types - searchTerm: PropTypes.string + searchTerm: PropTypes.string, + session: PropTypes.object, + isTotallyNormal: PropTypes.bool // eslint-disable-line react/no-unused-prop-types }; const mapStateToProps = state => ({ searchTerm: state.navigation.searchTerm, + session: state.session, isTotallyNormal: selectIsTotallyNormal(state) }); diff --git a/src/views/splash/presentation.jsx b/src/views/splash/presentation.jsx index 8af85947d2d..ecdfa27f4a6 100644 --- a/src/views/splash/presentation.jsx +++ b/src/views/splash/presentation.jsx @@ -476,6 +476,9 @@ class SplashPresentation extends React.Component { // eslint-disable-line react/
  • Email Search
  • +
  • + BAC +
  • Homepage Cache
    diff --git a/static/svgs/project/extension-facesensing.svg b/static/svgs/project/extension-facesensing.svg new file mode 100644 index 00000000000..c825b65ea5b --- /dev/null +++ b/static/svgs/project/extension-facesensing.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/webpack.config.js b/webpack.config.js index 554c79e1f80..01b4b81e2a7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -243,6 +243,10 @@ module.exports = { from: 'node_modules/@scratch/scratch-gui/dist/static/blocks-media', to: 'static/blocks-media' }, + { + from: 'node_modules/@scratch/scratch-gui/dist/chunks/mediapipe/face_detection/', + to: 'chunks/mediapipe/face_detection' + }, { context: 'node_modules/@scratch/scratch-gui/dist/', from: 'chunks/fetch-worker.*.{js,js.map}' @@ -335,6 +339,9 @@ module.exports = { }"`, 'process.env.IDEAS_GENERATOR_SOURCE': `"${ process.env.IDEAS_GENERATOR_SOURCE || 'https://scratch.mit.edu/projects/1108790117' + }"`, + 'process.env.MANUALLY_SAVE_THUMBNAILS': `"${ + process.env.MANUALLY_SAVE_THUMBNAILS || 'true' }"` }) ])