diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c009cf59a..04a9fe6b8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -153,17 +153,3 @@ jobs: - name: Lint run: pnpm storage lint - - svg-renderer: - name: Lint SVG Renderer - needs: [build] - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - - - name: Setup dependencies - uses: ./.github/actions/setup-deps - - - name: Lint - run: pnpm svg-renderer lint diff --git a/UPSTREAM b/UPSTREAM index 63b988752..29bcf51e6 100644 --- a/UPSTREAM +++ b/UPSTREAM @@ -7,5 +7,4 @@ scratch-paint 6d241ec scratch-storage 80b258d scratch-parser 7244904 scratch-audio 50b7ade -scratch-svg-renderer 5ad1d41 eslint-config-scratch 87ee420 diff --git a/package.json b/package.json index 91e79372c..02b97dba3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "start": "pnpm run gui start", "prepare": "husky", "build:dist": "cross-env NODE_ENV=production pnpm run build:full", - "build:full": "pnpm l10n build && pnpm audio build && pnpm storage build && pnpm svg-renderer build && pnpm render build && pnpm block build && pnpm vm build && pnpm paint build && node packages/gui/scripts/prepublish.mjs && pnpm gui build", + "build:full": "pnpm l10n build && pnpm audio build && pnpm storage build && pnpm render build && pnpm block build && pnpm vm build && pnpm paint build && node packages/gui/scripts/prepublish.mjs && pnpm gui build", "build": "pnpm block build && pnpm gui build", "test": "pnpm gui test:unit && pnpm block test && pnpm vm test", "performance": "pnpm vm performance", @@ -28,7 +28,6 @@ "block": "pnpm --filter clipcc-block", "l10n": "pnpm --filter clipcc-l10n", "render": "pnpm --filter clipcc-render", - "svg-renderer": "pnpm --filter clipcc-svg-renderer", "lint-config": "pnpm --filter eslint-config-clipcc", "storage": "pnpm --filter clipcc-storage", "paint": "pnpm --filter clipcc-paint", diff --git a/packages/audio/webpack.config.js b/packages/audio/webpack.config.js index a8b1defa6..23820490f 100644 --- a/packages/audio/webpack.config.js +++ b/packages/audio/webpack.config.js @@ -30,6 +30,8 @@ module.exports = { 'startaudiocontext': true }, plugins: [ - new NodePolyfillPlugin() + new NodePolyfillPlugin({ + includeAliases: ['events'] + }) ] }; diff --git a/packages/gui/.babelrc b/packages/gui/.babelrc index aeea6e789..7ff8a6fc4 100644 --- a/packages/gui/.babelrc +++ b/packages/gui/.babelrc @@ -1,13 +1,10 @@ { "plugins": [ - "@babel/plugin-syntax-dynamic-import", - "@babel/plugin-transform-async-to-generator", - "@babel/plugin-proposal-object-rest-spread", ["react-intl", { "messagesDir": "./translations/messages/" }]], "presets": [ - ["@babel/preset-env", {"targets": {"browsers": ["last 3 versions", "Safari >= 8", "iOS >= 8"]}}], + "@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript" ] diff --git a/packages/gui/.browserslistrc b/packages/gui/.browserslistrc index 909debc2d..d0449ca2b 100644 --- a/packages/gui/.browserslistrc +++ b/packages/gui/.browserslistrc @@ -1,3 +1,6 @@ -last 3 versions -Safari >= 8 -iOS >= 8 +Chrome >= 63 +Edge >= 15 +Firefox >= 57 +Safari >= 11 +Android >= 63 +iOS >= 11 diff --git a/packages/gui/package.json b/packages/gui/package.json index 436fea0d9..244eeb012 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -14,6 +14,7 @@ "default": "./dist/scratch-gui.js" }, "scripts": { + "analyze": "cross-env ANALYZE=1 pnpm build", "build:types": "tsc --project ./tsconfig.dts.json", "build": "pnpm run clean && pnpm run build:types && webpack --color --bail", "clean": "rimraf ./build && mkdirp build && rimraf ./dist && mkdirp dist", @@ -38,17 +39,16 @@ "clipcc-paint": "workspace:~", "clipcc-render": "workspace:~", "clipcc-storage": "workspace:~", - "clipcc-svg-renderer": "workspace:~", + "clipcc-svg-renderer": "2.5.49", "clipcc-vm": "workspace:~", "computed-style-to-inline-style": "3.0.0", - "core-js": "2.5.7", + "copy-webpack-plugin": "^14.0.0", + "css-loader": "6.7.3", "dapjs": "2.3.0", - "es6-object-assign": "1.1.0", "fastestsmallesttextencoderdecoder": "^1.0.22", "get-float-time-domain-data": "0.1.0", "get-user-media-promise": "1.1.4", "immutable": "5.1.5", - "intl": "1.2.5", "js-base64": "2.4.9", "keymirror": "0.1.1", "lodash.bindall": "4.4.0", @@ -76,7 +76,6 @@ "react-virtualized": "9.20.1", "redux": "3.7.2", "redux-throttle": "0.1.1", - "scratch-render-fonts": "1.0.252", "startaudiocontext": "1.2.1", "to-style": "1.3.3", "wav-encoder": "1.3.0", @@ -90,9 +89,6 @@ "@babel/cli": "7.28.6", "@babel/core": "7.29.0", "@babel/eslint-parser": "7.28.6", - "@babel/plugin-proposal-object-rest-spread": "7.14.7", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-transform-async-to-generator": "7.14.5", "@babel/preset-env": "7.29.2", "@babel/preset-react": "7.14.5", "@babel/preset-typescript": "^7.28.5", @@ -116,7 +112,7 @@ "chromedriver": "146.0.1", "copy-webpack-plugin": "^14.0.0", "cross-fetch": "^3.1.8", - "css-loader": "6.7.3", + "css-minimizer-webpack-plugin": "^8.0.0", "enzyme": "3.11.0", "enzyme-adapter-react-16": "1.15.7", "eslint": "^9.39.2", @@ -127,6 +123,12 @@ "eslint-plugin-react": "7.37.5", "globals": "^16.5.0", "html-webpack-plugin": "^5.6.6", + "image-minimizer-webpack-plugin": "^5.0.0", + "imagemin": "^9.0.1", + "imagemin-gifsicle": "^7.0.0", + "imagemin-jpegtran": "^8.0.0", + "imagemin-optipng": "^8.0.0", + "imagemin-svgo": "^12.0.0", "jest": "catalog:", "jest-environment-jsdom": "^30.3.0", "jest-junit": "7.0.0", @@ -139,7 +141,6 @@ "raf": "3.4.1", "react-test-renderer": "16.2.0", "redux-mock-store": "1.5.3", - "regenerator-runtime": "0.14.1", "rimraf": "2.7.1", "rule-inheritance-webpack-plugin": "^0.4.0", "selenium-webdriver": "3.6.0", @@ -147,6 +148,7 @@ "terser-webpack-plugin": "^5.3.17", "typescript": "catalog:", "webpack": "catalog:", + "webpack-bundle-analyzer": "^5.2.0", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.3", "yauzl": "2.10.0" diff --git a/packages/gui/src/components/connection-modal/update-peripheral-step.jsx b/packages/gui/src/components/connection-modal/update-peripheral-step.jsx index 3ba9f92ae..4c61be731 100644 --- a/packages/gui/src/components/connection-modal/update-peripheral-step.jsx +++ b/packages/gui/src/components/connection-modal/update-peripheral-step.jsx @@ -1,4 +1,3 @@ -import 'regenerator-runtime/runtime'; import {FormattedMessage} from 'react-intl'; import PropTypes from 'prop-types'; import classNames from 'classnames'; diff --git a/packages/gui/src/index.js b/packages/gui/src/index.js index b94d3985d..d61bf2c7d 100644 --- a/packages/gui/src/index.js +++ b/packages/gui/src/index.js @@ -2,7 +2,6 @@ import GUI from './containers/gui.tsx'; import AppStateHOC from './lib/app-state-hoc.tsx'; import GuiReducer, {guiInitialState, guiMiddleware, initEmbedded, initFullScreen, initPlayer} from './reducers/gui'; import LocalesReducer, {localesInitialState, initLocale} from './reducers/locales'; -import {ScratchPaintReducer} from 'clipcc-paint'; import {setFullScreen, setPlayer} from './reducers/mode'; import {remixProject} from './reducers/project-state'; import {setAppElement} from 'react-modal'; @@ -10,8 +9,7 @@ import totallyNormalStrings from './lib/l10n.js'; const guiReducers = { locales: LocalesReducer, - scratchGui: GuiReducer, - scratchPaint: ScratchPaintReducer + scratchGui: GuiReducer }; export { diff --git a/packages/gui/src/lib/backpack/sound-thumbnail.jpg b/packages/gui/src/lib/backpack/sound-thumbnail.jpg index f709aaa13..1d5e58a85 100644 Binary files a/packages/gui/src/lib/backpack/sound-thumbnail.jpg and b/packages/gui/src/lib/backpack/sound-thumbnail.jpg differ diff --git a/packages/gui/src/lib/type-traits.ts b/packages/gui/src/lib/type-traits.ts index 7d77703fd..37d0e7946 100644 --- a/packages/gui/src/lib/type-traits.ts +++ b/packages/gui/src/lib/type-traits.ts @@ -1 +1,7 @@ +import type {Reducer} from 'redux'; + export type PropsOf = C extends React.ComponentType ? P : never; + +export type ReducerMap = { + [P in keyof S]: Reducer; +}; diff --git a/packages/gui/src/playground/index.jsx b/packages/gui/src/playground/index.jsx index ef3784b60..20d5a71fd 100644 --- a/packages/gui/src/playground/index.jsx +++ b/packages/gui/src/playground/index.jsx @@ -1,9 +1,3 @@ -// Polyfills -import 'es6-object-assign/auto'; -import 'core-js/fn/array/includes'; -import 'core-js/fn/promise/finally'; -import 'intl'; // For Safari 9 - import React from 'react'; import ReactDOM from 'react-dom'; @@ -22,19 +16,6 @@ const appTarget = document.createElement('div'); appTarget.className = styles.app; document.body.appendChild(appTarget); -if ('serviceWorker' in navigator) { - window.addEventListener('load', () => { - navigator.serviceWorker.register('/service-worker.js').then(registration => { - // eslint-disable-next-line no-console - console.log('SW registered: ', registration); - }) - .catch(registrationError => { - // eslint-disable-next-line no-console - console.log('SW registration failed: ', registrationError); - }); - }); -} - if (supportedBrowser()) { // require needed here to avoid importing unsupported browser-crashing code // at the top level diff --git a/packages/gui/webpack.config.js b/packages/gui/webpack.config.js index 87fc87a98..0ef65c8ec 100644 --- a/packages/gui/webpack.config.js +++ b/packages/gui/webpack.config.js @@ -8,6 +8,8 @@ const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); +const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const RuleInheritancePlugin = require('rule-inheritance-webpack-plugin'); const STATIC_PATH = process.env.STATIC_PATH || '/static'; @@ -25,9 +27,13 @@ const base = { }, output: { filename: '[name].js', - chunkFilename: 'chunks/[name].js' + chunkFilename: 'chunks/[name].js', + assetModuleFilename: 'assets/[hash][ext][query]' }, resolve: { + alias: { + 'text-encoding': 'fastestsmallesttextencoderdecoder' + }, extensions: ['.ts', '.js', '.tsx', '.jsx'] }, module: { @@ -40,9 +46,6 @@ const base = { // in much lower dependencies. babelrc: false, plugins: [ - '@babel/plugin-syntax-dynamic-import', - '@babel/plugin-transform-async-to-generator', - '@babel/plugin-proposal-object-rest-spread', ['react-intl', { messagesDir: './translations/messages/' }]], @@ -78,10 +81,7 @@ const base = { }] }, { test: /\.hex$/, - type: 'asset/inline', - generator: { - dataUrl: content => `data:text/plain;base64,${content.toString('base64')}` - } + type: 'asset' }, { resourceQuery: '?arrayBuffer', type: 'javascript/auto', @@ -92,9 +92,50 @@ const base = { }] }, optimization: { + splitChunks: { + chunks: 'async', + minChunks: 2, + maxInitialRequests: 5, + cacheGroups: { + default: false, + defaultVendors: false, + metadata: { + test: module => module.type === 'json' && module.size() > 128 * 1024, + name: 'metadata', + chunks: 'all', + priority: 20, + reuseExistingChunk: true, + enforce: true + }, + lib: { + test: /[\\/]node_modules[\\/]/, + name: 'lib.min', + chunks: 'initial', + priority: 10, + reuseExistingChunk: true, + enforce: true + } + } + }, minimizer: [ new TerserPlugin({ include: /\.min\.js$/ + }), + new ImageMinimizerPlugin({ + minimizer: { + implementation: ImageMinimizerPlugin.imageminMinify, + options: { + plugins: [ + ['gifsicle', {interlaced: true}], + ['jpegtran', {progressive: true}], + ['optipng', {optimizationLevel: 5}], + ['svgo'] + ] + } + } + }), + new CssMinimizerPlugin({ + minify: CssMinimizerPlugin.lightningCssMinify }) ] }, @@ -107,11 +148,12 @@ const base = { path.resolve(__dirname, '../paint'), path.resolve(__dirname, '../render'), path.resolve(__dirname, '../storage'), - path.resolve(__dirname, '../svg-renderer'), path.resolve(__dirname, '../vm') ] }), - new NodePolyfillPlugin(), + new NodePolyfillPlugin({ + includeAliases: ['buffer', 'events'] + }), new CopyWebpackPlugin({ patterns: [ { @@ -136,6 +178,12 @@ if (!IS_CI) { base.plugins.push(new webpack.ProgressPlugin()); } +if (process.env.ANALYZE) { + // eslint-disable-next-line global-require + const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer'); + base.plugins.push(new BundleAnalyzerPlugin()); +} + if (!IS_PRODUCTION) { base.module.rules.push({ test: /blocks-msgs\.js$/, @@ -170,16 +218,10 @@ module.exports = [ { test: /\.(svg|png|wav|gif|jpg)$/, resourceQuery: {not: [/raw/]}, - type: 'asset/inline' + type: 'asset' } ]) }, - optimization: { - splitChunks: { - chunks: 'all', - name: 'lib.min' - } - }, plugins: base.plugins.concat([ new webpack.DefinePlugin({ 'process.env.DEBUG': Boolean(process.env.DEBUG), @@ -188,30 +230,30 @@ module.exports = [ 'clipcc.BUILD_TIME': Date.now() }), new HtmlWebpackPlugin({ - chunks: ['lib.min', 'gui'], + chunks: ['runtime.min', 'lib.min', 'gui'], template: 'src/playground/index.ejs', title: 'ClipCC GUI' }), new HtmlWebpackPlugin({ - chunks: ['lib.min', 'blocksonly'], + chunks: ['runtime.min', 'lib.min', 'blocksonly'], template: 'src/playground/index.ejs', filename: 'blocks-only.html', title: 'ClipCC GUI: Blocks Only Example' }), new HtmlWebpackPlugin({ - chunks: ['lib.min', 'compatibilitytesting'], + chunks: ['runtime.min', 'lib.min', 'compatibilitytesting'], template: 'src/playground/index.ejs', filename: 'compatibility-testing.html', title: 'ClipCC GUI: Compatibility Testing' }), new HtmlWebpackPlugin({ - chunks: ['lib.min', 'player'], + chunks: ['runtime.min', 'lib.min', 'player'], template: 'src/playground/index.ejs', filename: 'player.html', title: 'ClipCC GUI: Player Example' }), new HtmlWebpackPlugin({ - chunks: ['lib.min', 'lifecycle'], + chunks: ['runtime.min', 'lib.min', 'lifecycle'], template: 'src/playground/index.ejs', filename: 'lifecycle.html', title: 'ClipCC GUI: Lifecycle Test' @@ -268,7 +310,7 @@ module.exports = [ { test: /\.(svg|png|wav|gif|jpg)$/, resourceQuery: {not: [/raw/]}, - type: 'asset/inline' + type: 'asset' } ]) }, diff --git a/packages/l10n/.babelrc b/packages/l10n/.babelrc index 3ddfd2a4c..48765250a 100644 --- a/packages/l10n/.babelrc +++ b/packages/l10n/.babelrc @@ -1,9 +1,17 @@ { - "plugins": [ - "@babel/plugin-proposal-object-rest-spread" - ], "presets": [ - ["@babel/preset-env", {"targets": {"browsers": ["last 3 versions", "Safari >= 8", "iOS >= 8"]}}], + ["@babel/preset-env", { + "targets": { + "browsers": [ + "Chrome >= 63", + "Edge >= 15", + "Firefox >= 57", + "Safari >= 11", + "Android >= 63", + "iOS >= 8" + ] + } + }], "@babel/preset-react" ] } diff --git a/packages/l10n/package.json b/packages/l10n/package.json index efae948bd..b6316d2eb 100644 --- a/packages/l10n/package.json +++ b/packages/l10n/package.json @@ -30,9 +30,6 @@ "babel-plugin-react-intl": "^8.2.25", "@babel/eslint-parser": "7.28.6", "@babel/node": "7.29.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.1.0", "@babel/preset-env": "^7.29.2", "@babel/preset-react": "^7.0.0", "async": "3.2.3", diff --git a/packages/l10n/webpack.config.js b/packages/l10n/webpack.config.js index 2d803f8ec..c6cfcb3af 100644 --- a/packages/l10n/webpack.config.js +++ b/packages/l10n/webpack.config.js @@ -10,12 +10,7 @@ module.exports = { use: { loader: 'babel-loader', options: { - presets: ['@babel/preset-env'], - plugins: [ - '@babel/plugin-proposal-object-rest-spread', - '@babel/plugin-syntax-dynamic-import', - '@babel/plugin-transform-async-to-generator' - ] + presets: ['@babel/preset-env'] } } }] diff --git a/packages/paint/.babelrc b/packages/paint/.babelrc index 00bc561f1..0890ca983 100644 --- a/packages/paint/.babelrc +++ b/packages/paint/.babelrc @@ -1,6 +1,5 @@ { "plugins": [ - "@babel/plugin-proposal-object-rest-spread", ["react-intl", { "messagesDir": "./translations/messages/" }] diff --git a/packages/paint/package.json b/packages/paint/package.json index 837ad9182..8cddc7c59 100644 --- a/packages/paint/package.json +++ b/packages/paint/package.json @@ -44,7 +44,7 @@ "react-style-proptype": "^3", "react-tooltip": "^3", "redux": "^3", - "scratch-render-fonts": "^1.0.252" + "clipcc-render-fonts": "^1.0.256" }, "devDependencies": { "@babel/cli": "7.28.6", @@ -52,7 +52,6 @@ "@babel/eslint-parser": "7.28.6", "@babel/preset-env": "7.29.2", "@babel/preset-react": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "7.14.7", "autoprefixer": "9.7.4", "babel-core": "7.0.0-bridge.0", "babel-eslint": "10.1.0", @@ -90,10 +89,9 @@ "redux": "3.7.2", "redux-mock-store": "1.5.4", "redux-throttle": "0.1.1", - "regenerator-runtime": "0.14.1", "rimraf": "2.7.1", "clipcc-l10n": "workspace:~", - "scratch-render-fonts": "1.0.252", + "clipcc-render-fonts": "1.0.256", "style-loader": "^4.0.0", "terser-webpack-plugin": "^5.3.17", "webpack": "catalog:", diff --git a/packages/paint/src/playground/playground.jsx b/packages/paint/src/playground/playground.jsx index befcf4572..12a267d30 100644 --- a/packages/paint/src/playground/playground.jsx +++ b/packages/paint/src/playground/playground.jsx @@ -9,9 +9,9 @@ import {createStore} from 'redux'; import reducer from './reducers/combine-reducers'; import {intlInitialState, IntlProvider} from './reducers/intl.js'; import styles from './playground.css'; -// scratch-render-fonts is a playground-only dep. Fonts are expected to be imported +// clipcc-render-fonts is a playground-only dep. Fonts are expected to be imported // as a peer dependency, otherwise there will be two copies of them. -import 'scratch-render-fonts'; +import 'clipcc-render-fonts'; const appTarget = document.createElement('div'); appTarget.setAttribute('class', styles.playgroundContainer); diff --git a/packages/paint/webpack.config.js b/packages/paint/webpack.config.js index b0bcb8099..4c096540f 100644 --- a/packages/paint/webpack.config.js +++ b/packages/paint/webpack.config.js @@ -14,7 +14,6 @@ const base = { loader: 'babel-loader', include: path.resolve(__dirname, 'src'), options: { - plugins: ['@babel/plugin-proposal-object-rest-spread'], presets: ['@babel/preset-env', '@babel/preset-react'] } }, diff --git a/packages/render/package.json b/packages/render/package.json index fb3bac203..56d081af6 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -43,23 +43,21 @@ "json": "9.0.6", "node-polyfill-webpack-plugin": "^3.0.0", "playwright-chromium": "1.13.0", - "rule-inheritance-webpack-plugin": "^0.4.0", - "scratch-render-fonts": "1.0.252", + "clipcc-render-fonts": "1.0.256", "tap": "21.0.1", "terser-webpack-plugin": "^5.3.17", - "travis-after-all": "1.4.5", "typescript": "catalog:", "webpack": "catalog:", "webpack-cli": "^6.0.1", "webpack-dev-server": "^5.2.3" }, "peerDependencies": { - "scratch-render-fonts": "^1.0.252" + "clipcc-render-fonts": "^1.0.256" }, "dependencies": { "@turbowarp/nanolog": "^1.0.1", "clipcc-storage": "workspace:~", - "clipcc-svg-renderer": "workspace:~", + "clipcc-svg-renderer": "2.5.49", "grapheme-breaker": "0.3.2", "hull.js": "1.0.6", "ify-loader": "1.1.0", diff --git a/packages/render/src/SVGSkin.js b/packages/render/src/SVGSkin.js index c5bd76c50..0011dff11 100644 --- a/packages/render/src/SVGSkin.js +++ b/packages/render/src/SVGSkin.js @@ -193,7 +193,8 @@ class SVGSkin extends Skin { */ setSVG (svgData, rotationCenter) { const svgTag = loadSvgString(svgData); - const svgText = serializeSvgToString(svgTag, true /* shouldInjectFonts */); + let svgText = serializeSvgToString(svgTag, true /* shouldInjectFonts */); + svgText = svgText.replace(/"/g, "'"); this._svgImageLoaded = false; const {x, y, width, height} = svgTag.viewBox.baseVal; diff --git a/packages/render/test/integration/cpu-render.html b/packages/render/test/integration/cpu-render.html index a8fde32e2..0dca33224 100644 --- a/packages/render/test/integration/cpu-render.html +++ b/packages/render/test/integration/cpu-render.html @@ -1,7 +1,7 @@ - + diff --git a/packages/render/test/integration/index.html b/packages/render/test/integration/index.html index 5796f4082..5fdfcaa07 100644 --- a/packages/render/test/integration/index.html +++ b/packages/render/test/integration/index.html @@ -1,7 +1,7 @@ - + diff --git a/packages/render/webpack.config.js b/packages/render/webpack.config.js index d198dba61..eb1a270eb 100644 --- a/packages/render/webpack.config.js +++ b/packages/render/webpack.config.js @@ -2,7 +2,6 @@ const CopyWebpackPlugin = require('copy-webpack-plugin'); const path = require('path'); const TerserPlugin = require('terser-webpack-plugin'); const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); -const RuleInheritancePlugin = require('rule-inheritance-webpack-plugin'); const base = { mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', @@ -39,12 +38,9 @@ const base = { ] }, plugins: [ - new RuleInheritancePlugin({ - packages: [ - path.resolve(__dirname, '../svg-renderer') - ] - }), - new NodePolyfillPlugin() + new NodePolyfillPlugin({ + includeAliases: ['events'] + }) ] }; diff --git a/packages/storage/package.json b/packages/storage/package.json index 7a47b46b8..f8ab8bd55 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -40,7 +40,6 @@ }, "devDependencies": { "@babel/core": "7.29.0", - "@babel/plugin-transform-runtime": "7.29.0", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.29.2", "@babel/preset-typescript": "^7.28.5", @@ -57,6 +56,7 @@ "json": "^9.0.6", "node-fetch": "^3.3.2", "rimraf": "6.0.1", + "terser-webpack-plugin": "^5.3.17", "ts-jest": "^29.4.5", "ts-jest-mock-import-meta": "1.2.1", "typescript": "catalog:", diff --git a/packages/storage/webpack.config.js b/packages/storage/webpack.config.js index f1ddb2fbb..29c1cc916 100644 --- a/packages/storage/webpack.config.js +++ b/packages/storage/webpack.config.js @@ -110,7 +110,7 @@ const nodeConfig = { 'base64-js': true, 'js-md5': true, 'localforage': true, - 'text-encoding': true + 'fastestsmallesttextencoderdecoder': true }, plugins: baseConfig.plugins.concat([ new webpack.ProvidePlugin({ diff --git a/packages/svg-renderer/.editorconfig b/packages/svg-renderer/.editorconfig deleted file mode 100644 index 6176ee860..000000000 --- a/packages/svg-renderer/.editorconfig +++ /dev/null @@ -1,6 +0,0 @@ -[*.{js}] -indent_style = space - -[*.{json,json5}] -indent_style = space -indent_size = 2 diff --git a/packages/svg-renderer/.gitattributes b/packages/svg-renderer/.gitattributes deleted file mode 100644 index 71521c9c5..000000000 --- a/packages/svg-renderer/.gitattributes +++ /dev/null @@ -1,38 +0,0 @@ -# Set the default behavior, in case people don't have core.autocrlf set. -* text=auto - -# Explicitly specify line endings for as many files as possible. -# People who (for example) rsync between Windows and Linux need this. - -# File types which we know are binary -*.sb2 binary - -# Prefer LF for most file types -*.css text eol=lf -*.frag text eol=lf -*.htm text eol=lf -*.html text eol=lf -*.iml text eol=lf -*.js text eol=lf -*.js.map text eol=lf -*.json text eol=lf -*.json5 text eol=lf -*.md text eol=lf -*.vert text eol=lf -*.xml text eol=lf -*.yml text eol=lf - -# Prefer LF for these files -.editorconfig text eol=lf -.eslintignore text eol=lf -.eslintrc text eol=lf -.gitattributes text eol=lf -.gitignore text eol=lf -.gitmodules text eol=lf -.npmignore text eol=lf -LICENSE text eol=lf -Makefile text eol=lf -README text eol=lf -TRADEMARK text eol=lf - -# Use CRLF for Windows-specific file types diff --git a/packages/svg-renderer/.gitignore b/packages/svg-renderer/.gitignore deleted file mode 100644 index bc5fa44c1..000000000 --- a/packages/svg-renderer/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Mac OS -.DS_Store - -# NPM -/node_modules -npm-* - -# Build -dist/* -/playground - -# Tests -/.tap - -# Editors -/#* -*~ - -# Act -.secrets \ No newline at end of file diff --git a/packages/svg-renderer/.npmignore b/packages/svg-renderer/.npmignore deleted file mode 100644 index 24f83fb6f..000000000 --- a/packages/svg-renderer/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -# Development files -.eslintrc.js -/.editorconfig -/.eslintignore -/.gitattributes -/.github -/test diff --git a/packages/svg-renderer/LICENSE b/packages/svg-renderer/LICENSE deleted file mode 100644 index 6d00c99e8..000000000 --- a/packages/svg-renderer/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2016, Massachusetts Institute of Technology -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/svg-renderer/README.md b/packages/svg-renderer/README.md deleted file mode 100644 index ee866c0dd..000000000 --- a/packages/svg-renderer/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# clipcc-svg-renderer - -A class built for importing SVGs into [ClipCC](https://github.com/Clipteam/clipcc). Imports an SVG -string to a DOM element or an HTML canvas. Handles some of the quirks with Scratch 2.0 / ClipCC 1.x SVGs, which sometimes misreport -their width, height and view box. - -## Installation - -This requires you to have Git and Node.js installed. - -To install as a dependency for your own application: - -```bash -pnpm install clipcc-svg-renderer -``` - -> you may need to follow root [contribution guide](../../CONTRIBUTING.md) to set up the development environment first. - -## How to include in a Node.js App - -```js -import SvgRenderer from 'clipcc-svg-renderer'; - -const svgRenderer = new SvgRenderer(); - -const svgData = "..."; -const scale = 1; -const quirksMode = false; // If true, emulate Scratch 2.0 SVG rendering "quirks" -function doSomethingWith(canvas) {...}; - -svgRenderer.loadSVG(svgData, quirksMode, () => { - svgRenderer.draw(scale); - doSomethingWith(svgRenderer.canvas); -}); -``` - -## How to run locally as part of clipcc-gui - -Just run `pnpm start` in the root of the repository to start a GUI development server, which will automatically build and include the latest version of this package. You can then test your changes in the GUI. diff --git a/packages/svg-renderer/TRADEMARK b/packages/svg-renderer/TRADEMARK deleted file mode 100644 index 17b5d4c91..000000000 --- a/packages/svg-renderer/TRADEMARK +++ /dev/null @@ -1 +0,0 @@ -The Scratch trademarks, including the Scratch name, logo, the Scratch Cat, Gobo, Pico, Nano, Tera and Giga graphics (the "Marks"), are property of the Massachusetts Institute of Technology (MIT). Marks may not be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/packages/svg-renderer/eslint.config.js b/packages/svg-renderer/eslint.config.js deleted file mode 100644 index b31506e7b..000000000 --- a/packages/svg-renderer/eslint.config.js +++ /dev/null @@ -1,38 +0,0 @@ -const clipccConfig = require('eslint-config-clipcc'); -const clipccES6 = require('eslint-config-clipcc/es6'); -const clipccNode = require('eslint-config-clipcc/node'); -const clipccTS = require('eslint-config-clipcc/ts'); -const globals = require('globals'); - -module.exports = [ - ...clipccConfig, - ...clipccES6, - ...clipccNode, - ...clipccTS, - { - languageOptions: { - globals: { - ...globals.browser, - document: true, - window: true, - DOMParser: true, - Image: true, - XMLSerializer: true - } - } - }, - { - files: ['src/**/*.ts', 'test/**/*.ts'], - rules: { - '@typescript-eslint/ban-ts-comment': 'off' - } - }, - { - ignores: [ - 'node_modules/**', - 'dist/**', - 'playground/**', - '**/*.min.js' - ] - } -]; diff --git a/packages/svg-renderer/package.json b/packages/svg-renderer/package.json deleted file mode 100644 index efed7098c..000000000 --- a/packages/svg-renderer/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "clipcc-svg-renderer", - "version": "3.2.0", - "description": "SVG renderer for ClipCC", - "exports": { - "types": "./dist/types/index.d.ts", - "webpack": "./src/index.ts", - "node": "./dist/node/index.js", - "browser": "./dist/web/scratch-svg-renderer.js", - "default": "./dist/node/index.js" - }, - "scripts": { - "build": "pnpm run clean && tsc --project ./tsconfig.node.json && webpack", - "clean": "rimraf ./dist", - "start": "webpack-dev-server", - "test": "pnpm run test:types && pnpm run lint && pnpm run test:unit", - "test:types": "tsc --noEmit", - "lint": "eslint . --ext .ts", - "test:unit": "tap ./test/*.ts --allow-incomplete-coverage --allow-empty-coverage --reporter=tap", - "watch": "webpack --watch" - }, - "author": "Massachusetts Institute of Technology", - "license": "AGPL-3.0-only", - "homepage": "https://github.com/Clipteam/clipcc/packages/svg-renderer#readme", - "peerDependencies": { - "scratch-render-fonts": "^1.0.252" - }, - "dependencies": { - "@turbowarp/nanolog": "^1.0.1", - "base64-js": "^1.5.1", - "css-tree": "^1.1.3", - "fastestsmallesttextencoderdecoder": "^1.0.22", - "isomorphic-dompurify": "^2.14.0", - "transformation-matrix": "^2.16.1" - }, - "devDependencies": { - "@babel/cli": "7.28.6", - "@babel/core": "7.29.0", - "@babel/eslint-parser": "7.28.6", - "@babel/preset-env": "7.29.2", - "@babel/preset-typescript": "^7.28.5", - "@types/css-tree": "^2.3.8", - "@types/jsdom": "^28.0.0", - "babel-core": "7.0.0-bridge.0", - "babel-loader": "^10.1.1", - "base64-loader": "^1.0.0", - "copy-webpack-plugin": "^14.0.0", - "eslint": "^9.39.2", - "eslint-config-clipcc": "workspace:*", - "eslint-plugin-import": "2.29.1", - "globals": "^16.5.0", - "jsdom": "28.1.0", - "json": "9.0.6", - "mkdirp": "3.0.1", - "rimraf": "3.0.2", - "scratch-render-fonts": "1.0.252", - "tap": "21.0.1", - "terser-webpack-plugin": "^5.3.17", - "typescript": "catalog:", - "webpack": "catalog:", - "webpack-cli": "6.0.1", - "webpack-dev-server": "5.2.3", - "@xmldom/xmldom": "0.8.11" - }, - "browserslist": [ - "Chrome >= 63", - "Edge >= 15", - "Firefox >= 57", - "Safari >= 11" - ] -} diff --git a/packages/svg-renderer/renovate.json5 b/packages/svg-renderer/renovate.json5 deleted file mode 100644 index 6dc461c62..000000000 --- a/packages/svg-renderer/renovate.json5 +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - - "extends": [ - "github>scratchfoundation/scratch-renovate-config:js-lib-bundled" - ] -} diff --git a/packages/svg-renderer/src/bitmap-adapter.ts b/packages/svg-renderer/src/bitmap-adapter.ts deleted file mode 100644 index c3ebeffa2..000000000 --- a/packages/svg-renderer/src/bitmap-adapter.ts +++ /dev/null @@ -1,174 +0,0 @@ -import base64js from 'base64-js'; - -type ResolutionConvertCallback = (error: string | null, dataURI?: string) => void; - -/** - * Adapts Scratch 2.0 bitmaps for use in scratch 3.0 - */ -class BitmapAdapter { - private _makeImage: () => HTMLImageElement; - private _makeCanvas: () => HTMLCanvasElement; - stageWidth = 480; - stageHeight = 360; - /** - * @param makeImage HTML image constructor. Tests can provide this. - * @param makeCanvas HTML canvas constructor. Tests can provide this. - */ - constructor (makeImage?: () => HTMLImageElement, makeCanvas?: () => HTMLCanvasElement) { - this._makeImage = makeImage ? makeImage : () => new Image(); - this._makeCanvas = makeCanvas ? makeCanvas : () => document.createElement('canvas'); - } - - /** - * Set current stage size. - * @param width The stage width. - * @param height The stage height. - */ - setStageSize (width: number, height: number) { - this.stageWidth = width; - this.stageHeight = height; - } - - /** - * Return a canvas with the resized version of the given image, done using nearest-neighbor interpolation - * @param image The image to resize - * @param newWidth The desired post-resize width of the image - * @param newHeight The desired post-resize height of the image - * @returns A canvas with the resized image drawn on it. - */ - resize ( - image: Exclude, - newWidth: int, - newHeight: int - ): HTMLCanvasElement { - // We want to always resize using nearest-neighbor interpolation. However, canvas implementations are free to - // use linear interpolation (or other "smooth" interpolation methods) when downscaling: - // https://bugzilla.mozilla.org/show_bug.cgi?id=1360415 - // It seems we can get around this by resizing in two steps: first width, then height. This will always result - // in nearest-neighbor interpolation, even when downscaling. - const stretchWidthCanvas = this._makeCanvas(); - stretchWidthCanvas.width = newWidth; - stretchWidthCanvas.height = image.height; - let context = stretchWidthCanvas.getContext('2d')!; - context.imageSmoothingEnabled = false; - context.drawImage(image, 0, 0, stretchWidthCanvas.width, stretchWidthCanvas.height); - const stretchHeightCanvas = this._makeCanvas(); - stretchHeightCanvas.width = newWidth; - stretchHeightCanvas.height = newHeight; - context = stretchHeightCanvas.getContext('2d')!; - context.imageSmoothingEnabled = false; - context.drawImage(stretchWidthCanvas, 0, 0, stretchHeightCanvas.width, stretchHeightCanvas.height); - return stretchHeightCanvas; - } - - /** - * Scratch 2.0 had resolution 1 and 2 bitmaps. All bitmaps in Scratch 3.0 are equivalent - * to resolution 2 bitmaps. Therefore, converting a resolution 1 bitmap means doubling - * it in width and height. - * @param dataURI Base 64 encoded image data of the bitmap - * @param callback Node-style callback that returns updated dataURI if conversion succeeded - */ - convertResolution1Bitmap (dataURI: string, callback: ResolutionConvertCallback) { - const image = this._makeImage(); - image.src = dataURI; - image.onload = () => { - callback(null, this.resize(image, image.width * 2, image.height * 2).toDataURL()); - }; - image.onerror = () => { - callback('Image load failed'); - }; - } - - /** - * Given width/height of an uploaded item, return width/height the image will be resized - * to in Scratch 3.0 - * @param oldWidth original width - * @param oldHeight original height - * @returns Array of new width, new height - */ - getResizedWidthHeight (oldWidth: number, oldHeight: number) { - const STAGE_RATIO = this.stageWidth / this.stageHeight; - - // If both dimensions are smaller than or equal to corresponding stage dimension, - // double both dimensions - if ((oldWidth <= this.stageWidth) && (oldHeight <= this.stageHeight)) { - return {width: oldWidth * 2, height: oldHeight * 2}; - } - - // If neither dimension is larger than 2x corresponding stage dimension, - // this is an in-between image, return it as is - if ((oldWidth <= this.stageWidth * 2) && (oldHeight <= this.stageHeight * 2)) { - return {width: oldWidth, height: oldHeight}; - } - - const imageRatio = oldWidth / oldHeight; - // Otherwise, figure out how to resize - if (imageRatio >= STAGE_RATIO) { - // Wide Image - return {width: this.stageWidth * 2, height: this.stageWidth * 2 / imageRatio}; - } - // In this case we have either: - // - A wide image, but not with as big a ratio between width and height, - // making it so that fitting the width to double stage size would leave - // the height too big to fit in double the stage height - // - A square image that's still larger than the double at least - // one of the stage dimensions, so pick the smaller of the two dimensions (to fit) - // - A tall image - // In any of these cases, resize the image to fit the height to double the stage height - return {width: this.stageHeight * 2 * imageRatio, height: this.stageHeight * 2}; - } - - /** - * Given bitmap data, resize as necessary. - * @param fileData Base 64 encoded image data of the bitmap - * @param fileType The MIME type of this file - * @returns Resolves to resized image data Uint8Array - */ - importBitmap (fileData: ArrayBuffer | string, fileType: string) { - let dataURI = fileData; - if (fileData instanceof ArrayBuffer) { - dataURI = this.convertBinaryToDataURI(fileData, fileType); - } - return new Promise((resolve, reject) => { - const image = this._makeImage(); - image.src = dataURI as string; - image.onload = () => { - const newSize = this.getResizedWidthHeight(image.width, image.height); - if (newSize.width === image.width && newSize.height === image.height) { - // No change - resolve(this.convertDataURIToBinary(dataURI as string)); - } else { - const resizedDataURI = this.resize(image, newSize.width, newSize.height).toDataURL(); - resolve(this.convertDataURIToBinary(resizedDataURI)); - } - }; - image.onerror = () => { - // TODO: reject with an Error (breaking API change!) - // eslint-disable-next-line prefer-promise-reject-errors - reject('Image load failed'); - }; - }); - } - - // TODO consolidate with scratch-vm/src/util/base64-util.js - // From https://gist.github.com/borismus/1032746 - convertDataURIToBinary (dataURI: string) { - const BASE64_MARKER = ';base64,'; - const base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; - const base64 = dataURI.substring(base64Index); - const raw = window.atob(base64); - const rawLength = raw.length; - const array = new Uint8Array(new ArrayBuffer(rawLength)); - - for (let i = 0; i < rawLength; i++) { - array[i] = raw.charCodeAt(i); - } - return array; - } - - convertBinaryToDataURI (arrayBuffer: ArrayBuffer, contentType: string) { - return `data:${contentType};base64,${base64js.fromByteArray(new Uint8Array(arrayBuffer))}`; - } -} - -export default BitmapAdapter; diff --git a/packages/svg-renderer/src/fixup-svg-string.ts b/packages/svg-renderer/src/fixup-svg-string.ts deleted file mode 100644 index 3e3aaa05e..000000000 --- a/packages/svg-renderer/src/fixup-svg-string.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Fixup svg string prior to parsing. - * @param svgString String of the svg to fix. - * @returns fixed svg that should be parseable. - */ -export default function (svgString: string): string { - // Add root svg namespace if it does not exist. - const svgAttrs = svgString.match(/]*>/); - if (svgAttrs && svgAttrs[0].indexOf('xmlns=') === -1) { - svgString = svgString.replace(']+?xlink:href=["'])data:img\/png/g, - // use the captured ]+?xmlns:(?!xml=)[^ ]+=)"http:\/\/www.w3.org\/XML\/1998\/namespace"/g; - if (svgString.match(xmlnsRegex) !== null) { - svgString = svgString.replace( - // capture the entire attribute - xmlnsRegex, - // use the captured attribute name; replace only the URL - ($0, $1) => `${$1}"http://dummy.namespace"` - ); - } - - // Strip `svg:` prefix (sometimes added by Inkscape) from all tags. They interfere with DOMPurify (prefixed tag - // names are not recognized) and the paint editor. - // This matches opening and closing tags--the capture group captures the slash if it exists, and it is reinserted - // in the replacement text. - svgString = svgString.replace(/<(\/?)\s*svg:/g, '<$1'); - - // The element is not needed for rendering and sometimes contains - // unparseable garbage from Illustrator :( Empty out the contents. - // Note: [\s\S] matches everything including newlines, which .* does not - svgString = svgString.replace(/[\s\S]*<\/metadata>/, ''); - - // Empty script tags and javascript executing - svgString = svgString.replace(/[\s\S]*<\/script>/, ''); - - return svgString; -} diff --git a/packages/svg-renderer/src/font-converter.ts b/packages/svg-renderer/src/font-converter.ts deleted file mode 100644 index ed28af49d..000000000 --- a/packages/svg-renderer/src/font-converter.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @fileoverview Convert 2.0 fonts to 3.0 fonts. - */ - -/** - * Given an SVG, replace Scratch 2.0 fonts with new 3.0 fonts. Add defaults where there are none. - * @param svgTag The SVG dom object - */ -const convertFonts = function (svgTag: SVGElement) { - // Collect all text elements into a list. - const textElements: Element[] = []; - const collectText = (domElement: Element | Node) => { - if (domElement instanceof Element && domElement.localName === 'text') { - textElements.push(domElement); - } - for (let i = 0; i < domElement.childNodes.length; i++) { - collectText(domElement.childNodes[i]); - } - }; - collectText(svgTag); - // If there's an old font-family, switch to the new one. - for (const textElement of textElements) { - // If there's no font-family provided, provide one. - if (!textElement.getAttribute('font-family') || - textElement.getAttribute('font-family') === 'Helvetica') { - textElement.setAttribute('font-family', 'Sans Serif'); - } else if (textElement.getAttribute('font-family') === 'Mystery') { - textElement.setAttribute('font-family', 'Curly'); - } else if (textElement.getAttribute('font-family') === 'Gloria') { - textElement.setAttribute('font-family', 'Handwriting'); - } else if (textElement.getAttribute('font-family') === 'Donegal') { - textElement.setAttribute('font-family', 'Serif'); - } - } -}; - -export default convertFonts; diff --git a/packages/svg-renderer/src/font-inliner.ts b/packages/svg-renderer/src/font-inliner.ts deleted file mode 100644 index c29ef0ad9..000000000 --- a/packages/svg-renderer/src/font-inliner.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @fileoverview Import bitmap data into Scratch 3.0, resizing image as necessary. - */ -import getFonts from 'scratch-render-fonts'; - -/** - * Given SVG data, inline the fonts. This allows them to be rendered correctly when set - * as the source of an HTMLImageElement. Here is a note from tmickel: - * // Inject fonts that are needed. - * // It would be nice if there were another way to get the SVG-in-canvas - * // to render the correct font family, but I couldn't find any other way. - * // Other things I tried: - * // Just injecting the font-family into the document: no effect. - * // External stylesheet linked to by SVG: no effect. - * // Using a or to link to font-family - * // injected into the document: no effect. - * @param {string} svgString The string representation of the svg to modify - * @returns {string} The svg with any needed fonts inlined - */ -export default function inlineSvgFonts (svgString: string): string { - const FONTS = getFonts(); - // Make it clear that this function only operates on strings. - // If we don't explicitly throw this here, the function silently fails. - if (typeof svgString !== 'string') { - throw new Error('SVG to be inlined is not a string'); - } - - // Collect fonts that need injection. - const fontsNeeded = new Set(); - const fontRegex = /font-family="([^"]*)"/g; - let matches = fontRegex.exec(svgString); - while (matches) { - fontsNeeded.add(matches[1]); - matches = fontRegex.exec(svgString); - } - if (fontsNeeded.size > 0) { - let str = ''; - svgString = svgString.replace(/]*>/, `$&${str}`); - return svgString; - } - return svgString; -}; diff --git a/packages/svg-renderer/src/index.ts b/packages/svg-renderer/src/index.ts deleted file mode 100644 index a502ff27b..000000000 --- a/packages/svg-renderer/src/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import SVGRenderer from './svg-renderer'; -import BitmapAdapter from './bitmap-adapter'; -import inlineSvgFonts from './font-inliner'; -import loadSvgString from './load-svg-string'; -import sanitizeSvg from './sanitize-svg'; -import serializeSvgToString from './serialize-svg-to-string'; -import SvgElement from './svg-element'; -import convertFonts from './font-converter'; -// /** -// * Export for NPM & Node.js -// * @type {RenderWebGL} -// */ -export { - BitmapAdapter, - convertFonts, - inlineSvgFonts, - loadSvgString, - sanitizeSvg, - serializeSvgToString, - SvgElement, - SVGRenderer -}; diff --git a/packages/svg-renderer/src/load-svg-string.ts b/packages/svg-renderer/src/load-svg-string.ts deleted file mode 100644 index 67c78e4f8..000000000 --- a/packages/svg-renderer/src/load-svg-string.ts +++ /dev/null @@ -1,336 +0,0 @@ -import DOMPurify from 'isomorphic-dompurify'; -import SvgElement from './svg-element'; -import convertFonts from './font-converter'; -import fixupSvgString from './fixup-svg-string'; -import transformStrokeWidths from './transform-applier'; - -/** - * @param svgTag the tag to search within - * @param tagName svg tag to search for (or collect all elements if not given) - * @returns a list of elements with the given tagname - */ -const collectElements = (svgTag: SVGElement, tagName?: string) => { - const elts: Element[] = []; - const collectElementsInner = (domElement: Element) => { - if ((domElement.localName === tagName || typeof tagName === 'undefined') && 'getAttribute' in domElement) { - elts.push(domElement); - } - for (let i = 0; i < domElement.childNodes.length; i++) { - collectElementsInner(domElement.childNodes[i] as Element); - } - }; - collectElementsInner(svgTag); - return elts; -}; - -/** - * Fix SVGs to comply with SVG spec. Scratch 2 defaults to x2 = 0 when x2 is missing, but - * SVG defaults to x2 = 1 when missing. - * @param {SVGSVGElement} svgTag the SVG tag to apply the transformation to - */ -const transformGradients = (svgTag: SVGSVGElement) => { - const linearGradientElements = collectElements(svgTag, 'linearGradient'); - - // For each gradient element, supply x2 if necessary. - for (const gradientElement of linearGradientElements) { - if (!gradientElement.getAttribute('x2')) { - gradientElement.setAttribute('x2', '0'); - } - } -}; - -/** - * Fix SVGs to match appearance in Scratch 2, which used nearest neighbor scaling for bitmaps - * within SVGs. - * @param {SVGSVGElement} svgTag the SVG tag to apply the transformation to - */ -const transformImages = (svgTag: SVGSVGElement) => { - const imageElements = collectElements(svgTag, 'image'); - - // For each image element, set image rendering to pixelated - const pixelatedImages = 'image-rendering: optimizespeed; image-rendering: pixelated;'; - for (const elt of imageElements) { - if (elt.getAttribute('style')) { - elt.setAttribute('style', - `${pixelatedImages} ${elt.getAttribute('style')}`); - } else { - elt.setAttribute('style', pixelatedImages); - } - } -}; - -/** - * Transforms an SVG's text elements for Scratch 2.0 quirks. - * These quirks include: - * 1. `x` and `y` properties are removed/ignored. - * 2. Alignment is set to `text-before-edge`. - * 3. Line-breaks are converted to explicit elements. - * 4. Any required fonts are injected. - * @param {SVGSVGElement} svgTag the SVG tag to apply the transformation to - */ -const transformText = (svgTag: SVGSVGElement) => { - // Collect all text elements into a list. - const textElements: SVGTextElement[] = []; - const collectText = (domElement: SVGElement) => { - if (domElement.localName === 'text') { - textElements.push(domElement as SVGTextElement); - } - for (let i = 0; i < domElement.childNodes.length; i++) { - collectText(domElement.childNodes[i] as SVGElement); - } - }; - collectText(svgTag); - convertFonts(svgTag); - // For each text element, apply quirks. - for (const textElement of textElements) { - // Remove x and y attributes - they are not used in Scratch. - textElement.removeAttribute('x'); - textElement.removeAttribute('y'); - // Set text-before-edge alignment: - // Scratch renders all text like this. - textElement.setAttribute('alignment-baseline', 'text-before-edge'); - textElement.setAttribute('xml:space', 'preserve'); - // If there's no font size provided, provide one. - if (!textElement.getAttribute('font-size')) { - textElement.setAttribute('font-size', '18'); - } - let text = textElement.textContent; - - // Fix line breaks in text, which are not natively supported by SVG. - // Only fix if text does not have child tspans. - // @todo this will not work for font sizes with units such as em, percent - // However, text made in scratch 2 should only ever export size 22 font. - const fontSize = parseFloat(textElement.getAttribute('font-size') ?? ''); - const tx = 2; - let ty = 0; - let spacing = 1.2; - // Try to match the position and spacing of Scratch 2.0's fonts. - // Different fonts seem to use different line spacing. - // Scratch 2 always uses alignment-baseline=text-before-edge - // However, most SVG readers don't support this attribute - // or don't support it alongside use of tspan, so the translations - // here are to make up for that. - if (textElement.getAttribute('font-family') === 'Handwriting') { - spacing = 2; - ty = -11 * fontSize / 22; - } else if (textElement.getAttribute('font-family') === 'Scratch') { - spacing = 0.89; - ty = -3 * fontSize / 22; - } else if (textElement.getAttribute('font-family') === 'Curly') { - spacing = 1.38; - ty = -6 * fontSize / 22; - } else if (textElement.getAttribute('font-family') === 'Marker') { - spacing = 1.45; - ty = -6 * fontSize / 22; - } else if (textElement.getAttribute('font-family') === 'Sans Serif') { - spacing = 1.13; - ty = -3 * fontSize / 22; - } else if (textElement.getAttribute('font-family') === 'Serif') { - spacing = 1.25; - ty = -4 * fontSize / 22; - } - - if (textElement.transform.baseVal.numberOfItems === 0) { - const transform = svgTag.createSVGTransform(); - textElement.transform.baseVal.appendItem(transform); - } - - // Right multiply matrix by a translation of (tx, ty) - const mtx = textElement.transform.baseVal.getItem(0).matrix; - mtx.e += (mtx.a * tx) + (mtx.c * ty); - mtx.f += (mtx.b * tx) + (mtx.d * ty); - - if (text && textElement.childElementCount === 0) { - textElement.textContent = ''; - const lines = text.split('\n'); - text = ''; - for (const line of lines) { - const tspanNode = SvgElement.create('tspan'); - tspanNode.setAttribute('x', '0'); - tspanNode.setAttribute('style', 'white-space: pre'); - tspanNode.setAttribute('dy', `${spacing}em`); - tspanNode.textContent = line ? line : ' '; - textElement.appendChild(tspanNode); - } - } - } -}; - -/** - * Find the largest stroke width in the svg. If a shape has no - * `stroke` property, it has a stroke-width of 0. If it has a `stroke`, - * it is by default a stroke-width of 1. - * This is used to enlarge the computed bounding box, which doesn't take - * stroke width into account. - * @param {SVGSVGElement} rootNode The root SVG node to traverse. - * @returns {number} The largest stroke width in the SVG. - */ -const findLargestStrokeWidth = (rootNode: SVGSVGElement) => { - let largestStrokeWidth = 0; - const collectStrokeWidths = (domElement: SVGElement) => { - if (domElement.getAttribute) { - if (domElement.getAttribute('stroke')) { - largestStrokeWidth = Math.max(largestStrokeWidth, 1); - } - if (domElement.getAttribute('stroke-width')) { - largestStrokeWidth = Math.max( - largestStrokeWidth, - Number(domElement.getAttribute('stroke-width')) || 0 - ); - } - } - for (let i = 0; i < domElement.childNodes.length; i++) { - collectStrokeWidths(domElement.childNodes[i] as SVGElement); - } - }; - collectStrokeWidths(rootNode); - return largestStrokeWidth; -}; - -/** - * Transform the measurements of the SVG. - * In Scratch 2.0, SVGs are drawn without respect to the width, - * height, and viewBox attribute on the tag. The exporter - * does output these properties - but they appear to be incorrect often. - * To address the incorrect measurements, we append the DOM to the - * document, and then use SVG's native `getBBox` to find the real - * drawn dimensions. This ensures things drawn in negative dimensions, - * outside the given viewBox, etc., are all eventually drawn to the canvas. - * I tried to do this several other ways: stripping the width/height/viewBox - * attributes and then drawing (Firefox won't draw anything), - * or inflating them and then measuring a canvas. But this seems to be - * a natural and performant way. - * @param {SVGSVGElement} svgTag the SVG tag to apply the transformation to - */ -const transformMeasurements = (svgTag: SVGSVGElement) => { - // Append the SVG dom to the document. - // This allows us to use `getBBox` on the page, - // which returns the full bounding-box of all drawn SVG - // elements, similar to how Scratch 2.0 did measurement. - const svgSpot = document.createElement('span'); - // Since we're adding user-provided SVG to document.body, - // sanitizing is required. This should not affect bounding box calculation. - // outerHTML is attribute of Element (and not HTMLElement), so use it instead of - // calling serializer or toString() - // NOTE: svgTag remains untouched! - const rawValue = svgTag.outerHTML; - const sanitizedValue = DOMPurify.sanitize(rawValue, { - // Use SVG profile (no HTML elements) - USE_PROFILES: {svg: true}, - // Remove some tags that Scratch does not use. - FORBID_TAGS: ['a', 'audio', 'canvas', 'video'], - // Allow data URI in image tags (e.g. SVGs converted from bitmap) - ADD_DATA_URI_TAGS: ['image'] - }); - let bbox; - try { - // Insert sanitized value. - svgSpot.innerHTML = sanitizedValue; - document.body.appendChild(svgSpot); - // Take the bounding box. We have to get elements via svgSpot - // because we added it via innerHTML. - bbox = (svgSpot.children[0] as SVGSVGElement).getBBox(); - } finally { - // Always destroy the element, even if, for example, getBBox throws. - document.body.removeChild(svgSpot); - } - - // Enlarge the bbox from the largest found stroke width - // This may have false-positives, but at least the bbox will always - // contain the full graphic including strokes. - // If the width or height is zero however, don't enlarge since - // they won't have a stroke width that needs to be enlarged. - let halfStrokeWidth; - if (bbox.width === 0 || bbox.height === 0) { - halfStrokeWidth = 0; - } else { - halfStrokeWidth = findLargestStrokeWidth(svgTag) / 2; - } - const width = bbox.width + (halfStrokeWidth * 2); - const height = bbox.height + (halfStrokeWidth * 2); - const x = bbox.x - halfStrokeWidth; - const y = bbox.y - halfStrokeWidth; - - // Set the correct measurements on the SVG tag - svgTag.setAttribute('width', String(width)); - svgTag.setAttribute('height', String(height)); - svgTag.setAttribute('viewBox', - `${x} ${y} ${width} ${height}`); -}; - -/** - * Find all instances of a URL-referenced `stroke` in the svg. In 2.0, all gradient strokes - * have a round `stroke-linejoin` and `stroke-linecap`... for some reason. - * @param {SVGSVGElement} svgTag the SVG tag to apply the transformation to - */ -const setGradientStrokeRoundedness = (svgTag: SVGSVGElement) => { - const elements = collectElements(svgTag) as SVGElement[]; - - for (const elt of elements) { - if (!elt.style) continue; - const stroke = elt.style.stroke || elt.getAttribute('stroke'); - if (stroke && stroke.match(/^url\(#.*\)$/)) { - // @ts-expect-error ignore - elt.style['stroke-linejoin'] = 'round'; - // @ts-expect-error ignore - elt.style['stroke-linecap'] = 'round'; - } - } -}; - -/** - * In-place, convert passed SVG to something consistent that will be rendered the way we want them to be. - * @param {SVGSvgElement} svgTag root SVG node to operate upon - * @param {boolean} [fromVersion2] True if we should perform conversion from version 2 to version 3 svg. - */ -const normalizeSvg = (svgTag: SVGSVGElement, fromVersion2?: boolean) => { - if (fromVersion2) { - // Fix gradients. Scratch 2 exports no x2 when x2 = 0, but - // SVG default is that x2 is 1. This must be done before - // transformStrokeWidths since transformStrokeWidths affects - // gradients. - transformGradients(svgTag); - } - transformStrokeWidths(svgTag, window); - transformImages(svgTag); - if (fromVersion2) { - // Transform all text elements. - transformText(svgTag); - // Transform measurements. - transformMeasurements(svgTag); - // Fix stroke roundedness. - setGradientStrokeRoundedness(svgTag); - } else if (!svgTag.getAttribute('viewBox')) { - // Renderer expects a view box. - transformMeasurements(svgTag); - } else if (!svgTag.getAttribute('width') || !svgTag.getAttribute('height')) { - svgTag.setAttribute('width', String(svgTag.viewBox.baseVal.width)); - svgTag.setAttribute('height', String(svgTag.viewBox.baseVal.height)); - } -}; - -/** - * Load an SVG string and normalize it. All the steps before drawing/measuring. - * Currently, this will normalize stroke widths (see transform-applier.js) and render all embedded images pixelated. - * The returned SVG will be guaranteed to always have a `width`, `height` and `viewBox`. - * In addition, if the `fromVersion2` parameter is `true`, several "quirks-mode" transformations will be applied which - * mimic Scratch 2.0's SVG rendering. - * @param {!string} svgString String of SVG data to draw in quirks-mode. - * @param {boolean} [fromVersion2] True if we should perform conversion from version 2 to version 3 svg. - * @returns {SVGSVGElement} The normalized SVG element. - */ -const loadSvgString = (svgString: string, fromVersion2?: boolean) => { - // Parse string into SVG XML. - const parser = new DOMParser(); - svgString = fixupSvgString(svgString); - const svgDom = parser.parseFromString(svgString, 'text/xml'); - if (svgDom.childNodes.length < 1 || - svgDom.documentElement.localName !== 'svg') { - throw new Error('Document does not appear to be SVG.'); - } - const svgTag = svgDom.documentElement as unknown as SVGSVGElement; - normalizeSvg(svgTag, fromVersion2); - return svgTag; -}; - -export default loadSvgString; diff --git a/packages/svg-renderer/src/playground/index.html b/packages/svg-renderer/src/playground/index.html deleted file mode 100644 index 6f8fe3451..000000000 --- a/packages/svg-renderer/src/playground/index.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - Scratch SVG rendering playground - - - -

- -

-

- - - -

-

- - -

- -
-
-
Rendered Result
- -
-
-
Reference
- -
-
-
-
-
Rendered Content
- -
-
-
Reference
- - -
-
- - - - - diff --git a/packages/svg-renderer/src/sanitize-svg.ts b/packages/svg-renderer/src/sanitize-svg.ts deleted file mode 100644 index d013c9f28..000000000 --- a/packages/svg-renderer/src/sanitize-svg.ts +++ /dev/null @@ -1,105 +0,0 @@ -// @ts-nocheck - -/** - * @fileoverview Sanitize the content of an SVG aggressively, to make it as safe - * as possible - */ -import fixupSvgString from './fixup-svg-string'; -import {generate, parse, walk} from 'css-tree'; -import DOMPurify from 'isomorphic-dompurify'; - -DOMPurify.addHook( - 'beforeSanitizeAttributes', - currentNode => { - - if (currentNode && currentNode.href && currentNode.href.baseVal) { - const href = currentNode.href.baseVal.replace(/\s/g, ''); - // "data:" and "#" are valid hrefs - if ((href.slice(0, 5) !== 'data:') && (href.slice(0, 1) !== '#')) { - - if (currentNode.attributes.getNamedItem('xlink:href')) { - currentNode.attributes.removeNamedItem('xlink:href'); - delete currentNode['xlink:href']; - } - if (currentNode.attributes.getNamedItem('href')) { - currentNode.attributes.removeNamedItem('href'); - delete currentNode.href; - } - } - } - return currentNode; - } -); - -DOMPurify.addHook( - 'uponSanitizeElement', - (node, data) => { - if (data.tagName === 'style') { - const ast = parse(node.textContent); - let isModified = false; - // Remove any @import rules as it could leak HTTP requests - walk(ast, (astNode, item, list) => { - if (astNode.type === 'Atrule' && astNode.name === 'import') { - list.remove(item); - isModified = true; - } - }); - if (isModified) { - node.textContent = generate(ast); - } - } - } -); - -// Use JS implemented TextDecoder and TextEncoder if it is not provided by the -// browser. -let _TextDecoder; -let _TextEncoder; -if (typeof TextDecoder === 'undefined' || typeof TextEncoder === 'undefined') { - // Wait to require the text encoding polyfill until we know it's needed. - // eslint-disable-next-line global-require, @typescript-eslint/no-require-imports - const encoding = require('fastestsmallesttextencoderdecoder'); - _TextDecoder = encoding.TextDecoder; - _TextEncoder = encoding.TextEncoder; -} else { - _TextDecoder = TextDecoder; - _TextEncoder = TextEncoder; -} - -const sanitizeSvg = { - /** - * Load an SVG Uint8Array of bytes and "sanitize" it - * @param rawData unsanitized SVG daata - * @returns sanitized SVG data - */ - sanitizeByteStream (rawData: Uint8Array): Uint8Array { - const decoder = new _TextDecoder(); - const encoder = new _TextEncoder(); - const sanitizedText = sanitizeSvg.sanitizeSvgText(decoder.decode(rawData)); - return encoder.encode(sanitizedText); - }, - /** - * Load an SVG string and "sanitize" it. This is more aggressive than the handling in - * fixup-svg-string.js, and thus more risky; there are known examples of SVGs that - * it will clobber. We use DOMPurify's svg profile, which restricts many types of tag. - * @param rawSvgText unsanitized SVG string - * @returns sanitized SVG text - */ - sanitizeSvgText (rawSvgText: string): string { - let sanitizedText = DOMPurify.sanitize(rawSvgText, { - USE_PROFILES: {svg: true} - }); - - // Remove partial XML comment that is sometimes left in the HTML - const badTag = sanitizedText.indexOf(']>'); - if (badTag >= 0) { - sanitizedText = sanitizedText.substring(5, sanitizedText.length); - } - - // also use our custom fixup rules - sanitizedText = fixupSvgString(sanitizedText); - return sanitizedText; - } -}; - -export default sanitizeSvg; diff --git a/packages/svg-renderer/src/serialize-svg-to-string.ts b/packages/svg-renderer/src/serialize-svg-to-string.ts deleted file mode 100644 index 1ca1ef495..000000000 --- a/packages/svg-renderer/src/serialize-svg-to-string.ts +++ /dev/null @@ -1,19 +0,0 @@ -import inlineSvgFonts from './font-inliner'; - -/** - * Serialize a given SVG DOM to a string. - * @param svgTag The SVG element to serialize. - * @param shouldInjectFonts True if fonts should be included in the SVG as - * base64 data. - * @returns String representing current SVG data. - */ -const serializeSvgToString = (svgTag: SVGElement, shouldInjectFonts?: boolean): string => { - const serializer = new XMLSerializer(); - let string = serializer.serializeToString(svgTag); - if (shouldInjectFonts) { - string = inlineSvgFonts(string); - } - return string; -}; - -export default serializeSvgToString; diff --git a/packages/svg-renderer/src/svg-element.ts b/packages/svg-renderer/src/svg-element.ts deleted file mode 100644 index 29f8250d1..000000000 --- a/packages/svg-renderer/src/svg-element.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Adapted from - * Paper.js - The Swiss Army Knife of Vector Graphics Scripting. - * http://paperjs.org/ - * - * Copyright (c) 2011 - 2016, Juerg Lehni & Jonathan Puckey - * http://scratchdisk.com/ & http://jonathanpuckey.com/ - * - * Distributed under the MIT license. See LICENSE file for details. - * - * All rights reserved. - */ - -/** - * @name SvgElement - * @namespace - * @private - */ -class SvgElement { - // SVG related namespaces - static get svg (): string { - return 'http://www.w3.org/2000/svg'; - } - - static get xmlns (): string { - return 'http://www.w3.org/2000/xmlns'; - } - - static get xlink (): string { - return 'http://www.w3.org/1999/xlink'; - } - - // Mapping of attribute names to required namespaces: - static attributeNamespace (): Record { - return { - 'href': SvgElement.xlink, - 'xlink': SvgElement.xmlns, - // Only the xmlns attribute needs the trailing slash. See #984 - 'xmlns': `${SvgElement.xmlns}/`, - // IE needs the xmlns namespace when setting 'xmlns:xlink'. See #984 - 'xmlns:xlink': `${SvgElement.xmlns}/` - }; - } - - static create ( - tag: string, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - attributes?: Record, - formatter?: { number: (num: number) => string } - ): SVGElement { - return SvgElement.set(document.createElementNS(SvgElement.svg, tag) as SVGElement, attributes, formatter); - } - - static get (node: SVGElement, name: string): string | null { - const namespace = SvgElement.attributeNamespace()[name]; - const value = namespace ? - node.getAttributeNS(namespace, name) : - node.getAttribute(name); - return value === 'null' ? null : value; - } - - static set ( - node: SVGElement, - attributes?: Record, - formatter?: { number: (num: number) => string } - ): SVGElement { - for (const name in attributes) { - let value = attributes[name]; - const namespace = SvgElement.attributeNamespace()[name]; - if (typeof value === 'number' && formatter) { - value = formatter.number(value); - } - if (namespace) { - node.setAttributeNS(namespace, name, value as string); - } else { - node.setAttribute(name, value as string); - } - } - return node; - } -} - -export default SvgElement; diff --git a/packages/svg-renderer/src/svg-renderer.ts b/packages/svg-renderer/src/svg-renderer.ts deleted file mode 100644 index a82d5e687..000000000 --- a/packages/svg-renderer/src/svg-renderer.ts +++ /dev/null @@ -1,183 +0,0 @@ -import loadSvgString from './load-svg-string'; -import serializeSvgToString from './serialize-svg-to-string'; - -/** - * A measured SVG "viewbox" - */ -interface SvgMeasurements { - /** - * The left edge of the SVG viewbox. - */ - x: number; - /** - * The top edge of the SVG viewbox. - */ - y: number; - /** - * The width of the SVG viewbox. - */ - width: number; - /** - * The height of the SVG viewbox. - */ - height: number; -} - -/** - * Main quirks-mode SVG rendering code. - * @deprecated Call into individual methods exported from this library instead. - */ -class SvgRenderer { - private _canvas: HTMLCanvasElement; - private _context: CanvasRenderingContext2D; - private _measurements: SvgMeasurements; - private _cachedImage: HTMLImageElement | null; - private _svgTag?: SVGElement; - loaded: boolean; - /** - * Create a quirks-mode SVG renderer for a particular canvas. - * @param {HTMLCanvasElement} [canvas] An optional canvas element to draw to. If this is not provided, the renderer - * will create a new canvas. - * @class - */ - constructor (canvas: HTMLCanvasElement) { - /** - * The canvas that this SVG renderer will render to. - * @type {HTMLCanvasElement} - * @private - */ - this._canvas = canvas || document.createElement('canvas'); - this._context = this._canvas.getContext('2d')!; - - /** - * The measurement box of the currently loaded SVG. - */ - this._measurements = {x: 0, y: 0, width: 0, height: 0}; - - /** - * The `` element with the contents of the currently loaded SVG. - */ - this._cachedImage = null; - - /** - * True if this renderer's current SVG is loaded and can be rendered to the canvas. - */ - this.loaded = false; - } - - get canvas () { - return this._canvas; - } - - /** - * @returns the natural size, in Scratch units, of this SVG. - */ - get size (): [number, number] { - return [this._measurements.width, this._measurements.height]; - } - - /** - * @returns {Array} the offset (upper left corner) of the SVG's view box. - */ - get viewOffset () { - return [this._measurements.x, this._measurements.y]; - } - - /** - * Load an SVG string and normalize it. All the steps before drawing/measuring. - * @param {!string} svgString String of SVG data to draw in quirks-mode. - * @param {?boolean} fromVersion2 True if we should perform conversion from - * version 2 to version 3 svg. - */ - loadString (svgString: string, fromVersion2?: boolean) { - // New svg string invalidates the cached image - this._cachedImage = null; - const svgTag = loadSvgString(svgString, fromVersion2); - - this._svgTag = svgTag; - this._measurements = { - width: svgTag.viewBox.baseVal.width, - height: svgTag.viewBox.baseVal.height, - x: svgTag.viewBox.baseVal.x, - y: svgTag.viewBox.baseVal.y - }; - } - - /** - * Load an SVG string, normalize it, and prepare it for (synchronous) rendering. - * @param svgString String of SVG data to draw in quirks-mode. - * @param fromVersion2 True if we should perform conversion from version 2 to version 3 svg. - * @param onFinish - An optional callback to call when the SVG is loaded and can be rendered. - */ - loadSVG (svgString: string, fromVersion2: boolean | undefined, onFinish: () => void) { - this.loadString(svgString, fromVersion2); - this._createSVGImage(onFinish); - } - - /** - * Creates an element for the currently loaded SVG string, then calls the callback once it's loaded. - * @param {Function} [onFinish] - An optional callback to call when the has loaded. - */ - _createSVGImage (onFinish: () => void) { - if (this._cachedImage === null) this._cachedImage = new Image(); - const img = this._cachedImage; - - img.onload = () => { - this.loaded = true; - if (onFinish) onFinish(); - }; - const svgText = this.toString(true /* shouldInjectFonts */); - img.src = `data:image/svg+xml;utf8,${encodeURIComponent(svgText)}`; - this.loaded = false; - } - - /** - * Serialize the active SVG DOM to a string. - * @param {?boolean} shouldInjectFonts True if fonts should be included in the SVG as - * base64 data. - * @returns {string} String representing current SVG data. - * @deprecated Use the standalone `serializeSvgToString` export instead. - */ - toString (shouldInjectFonts?: boolean) { - if (!this._svgTag) { - throw new Error('SVG not loaded'); - } - return serializeSvgToString(this._svgTag, shouldInjectFonts); - } - - /** - * Synchronously draw the loaded SVG to this renderer's `canvas`. - * @param {number} [scale] - Optionally, also scale the image by this factor. - */ - draw (scale: number) { - if (!this.loaded) throw new Error('SVG image has not finished loading'); - this._drawFromImage(scale); - } - - /** - * Draw to the canvas from a loaded image element. - * @param {number} [scale] - Optionally, also scale the image by this factor. - */ - _drawFromImage (scale: number) { - if (this._cachedImage === null) return; - - const ratio = Number.isFinite(scale) ? scale : 1; - const bbox = this._measurements; - this._canvas.width = bbox.width * ratio; - this._canvas.height = bbox.height * ratio; - // Even if the canvas at the current scale has a nonzero size, the image's dimensions are floored pre-scaling. - // e.g. if an image has a width of 0.4 and is being rendered at 3x scale, the canvas will have a width of 1, but - // the image's width will be rounded down to 0 on some browsers (Firefox) prior to being drawn at that scale. - if ( - this._canvas.width <= 0 || - this._canvas.height <= 0 || - this._cachedImage.naturalWidth <= 0 || - this._cachedImage.naturalHeight <= 0 - ) return; - this._context.clearRect(0, 0, this._canvas.width, this._canvas.height); - this._context.setTransform(ratio, 0, 0, ratio, 0, 0); - this._context.drawImage(this._cachedImage, 0, 0); - } -} - -export default SvgRenderer; diff --git a/packages/svg-renderer/src/transform-applier.ts b/packages/svg-renderer/src/transform-applier.ts deleted file mode 100644 index e04e892fb..000000000 --- a/packages/svg-renderer/src/transform-applier.ts +++ /dev/null @@ -1,669 +0,0 @@ -import * as Matrix from 'transformation-matrix'; -import SvgElement from './svg-element'; -import log from './util/log'; - -interface BBox { - x: number; - y: number; - width: number; - height: number; -} - -/** - * @fileoverview Apply transforms to match stroke width appearance in 2.0 and 3.0 - */ - -// Adapted from paper.js's Path.applyTransform -const _parseTransform = function (domElement: Element): Matrix.Matrix { - let matrix: Matrix.Matrix = Matrix.identity(); - const string = domElement.attributes?.getNamedItem('transform')?.value; - if (!string) return matrix; - - const transforms = string.split(/\)\s*/g); - for (const transform of transforms) { - if (!transform) break; - - const parts = transform.split(/\(\s*/); - const command = parts[0].trim(); - const v = parts[1].split(/[\s,]+/g).map(parseFloat); - - switch (command) { - case 'matrix': - matrix = Matrix.compose(matrix, {a: v[0], b: v[1], c: v[2], d: v[3], e: v[4], f: v[5]}); - break; - case 'rotate': - matrix = Matrix.compose(matrix, Matrix.rotateDEG(v[0], v[1] || 0, v[2] || 0)); - break; - case 'translate': - matrix = Matrix.compose(matrix, Matrix.translate(v[0], v[1] || 0)); - break; - case 'scale': - matrix = Matrix.compose(matrix, Matrix.scale(v[0], v[1] || v[0])); - break; - case 'skewX': - matrix = Matrix.compose(matrix, Matrix.skewDEG(v[0], 0)); - break; - case 'skewY': - matrix = Matrix.compose(matrix, Matrix.skewDEG(0, v[0])); - break; - default: - log.error(`Couldn't parse: ${command}`); - } - } - return matrix; -}; - -// Adapted from paper.js's Matrix.decompose -// Given a matrix, return the x and y scale factors of the matrix -const _getScaleFactor = function (matrix: Matrix.Matrix) { - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const det = (a * d) - (b * c); - - if (a !== 0 || b !== 0) { - const r = Math.sqrt((a * a) + (b * b)); - return {x: r, y: det / r}; - } - if (c !== 0 || d !== 0) { - const s = Math.sqrt((c * c) + (d * d)); - return {x: det / s, y: s}; - } - // a = b = c = d = 0 - return {x: 0, y: 0}; -}; - -// Returns null if matrix is not invertible. Otherwise returns given ellipse -// transformed by transform, an object {radiusX, radiusY, rotation}. -const _calculateTransformedEllipse = function ( - radiusX: number, radiusY: number, theta: number, transform: Matrix.Matrix -) { - theta = -theta * Math.PI / 180; - const a = transform.a; - const b = -transform.c; - const c = -transform.b; - const d = transform.d; - // Since other parameters determine the translation of the ellipse in SVG, we do not need to worry - // about what e and f are. - const det = (a * d) - (b * c); - // Non-invertible matrix - if (det === 0) return null; - - // rotA, rotB, and rotC represent Ax^2 + Bxy + Cy^2 = 1 coefficients for a rotated ellipse formula - const sinT = Math.sin(theta); - const cosT = Math.cos(theta); - const sin2T = Math.sin(2 * theta); - const rotA = (cosT * cosT / radiusX / radiusX) + (sinT * sinT / radiusY / radiusY); - const rotB = (sin2T / radiusX / radiusX) - (sin2T / radiusY / radiusY); - const rotC = (sinT * sinT / radiusX / radiusX) + (cosT * cosT / radiusY / radiusY); - - // Calculate the ellipse formula of the transformed ellipse - // A, B, and C represent Ax^2 + Bxy + Cy^2 = 1 / det / det coefficients in a transformed ellipse formula - // scaled by inverse det squared (to preserve accuracy) - const A = ((rotA * d * d) - (rotB * d * c) + (rotC * c * c)); - const B = ((-2 * rotA * b * d) + (rotB * a * d) + (rotB * b * c) - (2 * rotC * a * c)); - const C = ((rotA * b * b) - (rotB * a * b) + (rotC * a * a)); - - // Derive new radii and theta from the transformed ellipse formula - const newRadiusXOverDet = Math.sqrt(2) * - Math.sqrt( - (A + C - Math.sqrt((A * A) + (B * B) - (2 * A * C) + (C * C))) / - ((-B * B) + (4 * A * C)) - ); - const newRadiusYOverDet = 1 / Math.sqrt(A + C - (1 / newRadiusXOverDet / newRadiusXOverDet)); - let temp = (A - (1 / newRadiusXOverDet / newRadiusXOverDet)) / - ((1 / newRadiusYOverDet / newRadiusYOverDet) - (1 / newRadiusXOverDet / newRadiusXOverDet)); - if (temp < 0 && Math.abs(temp) < 1e-8) temp = 0; // Fix floating point issue - temp = Math.sqrt(temp); - if (Math.abs(1 - temp) < 1e-8) temp = 1; // Fix floating point issue - // Solve for which of the two possible thetas is correct - let newTheta = Math.asin(temp); - temp = (B / ( - (1 / newRadiusXOverDet / newRadiusXOverDet) - - (1 / newRadiusYOverDet / newRadiusYOverDet))); - const newTheta2 = -newTheta; - if (Math.abs(Math.sin(2 * newTheta2) - temp) < - Math.abs(Math.sin(2 * newTheta) - temp)) { - newTheta = newTheta2; - } - - return { - radiusX: newRadiusXOverDet * det, - radiusY: newRadiusYOverDet * det, - rotation: -newTheta * 180 / Math.PI - }; -}; - -// Adapted from paper.js's PathItem.setPathData -const _transformPath = function (pathString: string, transform: Matrix.Matrix) { - if (!transform || Matrix.toString(transform) === Matrix.toString(Matrix.identity())) return pathString; - // First split the path data into parts of command-coordinates pairs - // Commands are any of these characters: mzlhvcsqta - // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain - const parts = pathString?.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig)!; - let coords: RegExpMatchArray; - let relative = false; - let previous: string | undefined = undefined; - let control: PointObjectNotation; - let current: PointObjectNotation = {x: 0, y: 0}; - let start: PointObjectNotation = {x: 0, y: 0}; - let result = ''; - - const getCoord = function (index: number, coord: keyof PointObjectNotation) { - let val = +coords[index]; - if (relative) { - val += current[coord]; - } - return val; - }; - - const getPoint = function (index: number) { - return {x: getCoord(index, 'x'), y: getCoord(index + 1, 'y')}; - }; - - const roundTo4Places = function (num: number) { - return Number(num.toFixed(4)); - }; - - // Returns the transformed point as a string - const getString = function (point: PointObjectNotation) { - const transformed = Matrix.applyToPoint(transform, point); - return `${roundTo4Places(transformed.x)} ${roundTo4Places(transformed.y)} `; - }; - - for (let i = 0, l = parts && parts.length; i < l; i++) { - const part = parts[i]; - const command = part[0]; - const lower = command.toLowerCase(); - // Match all coordinate values - coords = part.match(/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g)!; - const length = coords && coords.length; - relative = command === lower; - // Fix issues with z in the middle of SVG path data, not followed by - // a m command, see paper.js#413: - if (previous === 'z' && !/[mz]/.test(lower)) { - result += `M ${current.x} ${current.y} `; - } - switch (lower) { - case 'm': // Move to - case 'l': // Line to - { - let move = lower === 'm'; - for (let j = 0; j < length; j += 2) { - result += move ? 'M ' : 'L '; - current = getPoint(j); - result += getString(current); - if (move) { - start = current; - move = false; - } - } - control = current; - break; - } - case 'h': // Horizontal line - case 'v': // Vertical line - { - const coord = lower === 'h' ? 'x' : 'y'; - current = {x: current.x, y: current.y}; // Clone as we're going to modify it. - for (let j = 0; j < length; j++) { - current[coord] = getCoord(j, coord); - result += `L ${getString(current)}`; - } - control = current; - break; - } - case 'c': - // Cubic Bezier curve - for (let j = 0; j < length; j += 6) { - const handle1 = getPoint(j); - control = getPoint(j + 2); - current = getPoint(j + 4); - result += `C ${getString(handle1)}${getString(control)}${getString(current)}`; - } - break; - case 's': - // Smooth cubic Bezier curve - for (let j = 0; j < length; j += 4) { - const handle1 = /[cs]/.test(previous!) ? - {x: (current.x * 2) - control!.x, y: (current.y * 2) - control!.y} : - current; - control = getPoint(j); - current = getPoint(j + 2); - - result += `C ${getString(handle1)}${getString(control)}${getString(current)}`; - previous = lower; - } - break; - case 'q': - // Quadratic Bezier curve - for (let j = 0; j < length; j += 4) { - control = getPoint(j); - current = getPoint(j + 2); - result += `Q ${getString(control)}${getString(current)}`; - } - break; - case 't': - // Smooth quadratic Bezier curve - for (let j = 0; j < length; j += 2) { - control = /[qt]/.test(previous!) ? - {x: (current.x * 2) - control!.x, y: (current.y * 2) - control!.y} : - current; - current = getPoint(j); - - result += `Q ${getString(control)}${getString(current)}`; - previous = lower; - } - break; - case 'a': - // Elliptical arc curve - for (let j = 0; j < length; j += 7) { - current = getPoint(j + 5); - const rx = +coords[j]; - const ry = +coords[j + 1]; - const rotation = +coords[j + 2]; - const largeArcFlag = +coords[j + 3]; - let clockwiseFlag = +coords[j + 4]; - const newEllipse = _calculateTransformedEllipse(rx, ry, rotation, transform); - const matrixScale = _getScaleFactor(transform); - if (newEllipse) { - if ((matrixScale.x > 0 && matrixScale.y < 0) || - (matrixScale.x < 0 && matrixScale.y > 0)) { - clockwiseFlag = clockwiseFlag ^ 1; - } - result += `A ${roundTo4Places(Math.abs(newEllipse.radiusX))} ` + - `${roundTo4Places(Math.abs(newEllipse.radiusY))} ` + - `${roundTo4Places(newEllipse.rotation)} ${largeArcFlag} ` + - `${clockwiseFlag} ${getString(current)}`; - } else { - result += `L ${getString(current)}`; - } - } - break; - case 'z': - // Close path - result += `Z `; - // Correctly handle relative m commands, see paper.js#1101: - current = start; - break; - } - previous = lower; - } - return result; -}; - -const GRAPHICS_ELEMENTS = ['circle', 'ellipse', 'image', 'line', 'path', 'polygon', 'polyline', 'rect', 'text', 'use']; -const CONTAINER_ELEMENTS = ['a', 'defs', 'g', 'marker', 'glyph', 'missing-glyph', 'pattern', 'svg', 'switch', 'symbol']; -const _isContainerElement = function (element: Element) { - return element.tagName && CONTAINER_ELEMENTS.includes(element.tagName.toLowerCase()); -}; -const _isGraphicsElement = function (element: Element) { - return element.tagName && GRAPHICS_ELEMENTS.includes(element.tagName.toLowerCase()); -}; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const _isPathWithTransformAndStroke = function (element: any, strokeWidth: number) { - if (!element.attributes) return false; - strokeWidth = element.attributes['stroke-width'] ? - Number(element.attributes['stroke-width'].value) : Number(strokeWidth); - return strokeWidth && - element.tagName && element.tagName.toLowerCase() === 'path' && - element.attributes.d && element.attributes.d.value; -}; -const _quadraticMean = function (a: number, b: number) { - return Math.sqrt(((a * a) + (b * b)) / 2); -}; - -const _createGradient = function (gradientId: string, svgTag: SVGElement, bbox: BBox, matrix: Matrix.Matrix) { - // Adapted from Paper.js's SvgImport.getValue - const getValue = function ( - node: SVGElement, - name: string, - isString?: boolean, - allowNull?: boolean, - allowPercent?: boolean, - defaultValue?: string - ) { - // Interpret value as number. Never return NaN, but 0 instead. - // If the value is a sequence of numbers, parseFloat will - // return the first occurring number, which is enough for now. - let value = SvgElement.get(node, name); - let res; - if (value === null) { - if (defaultValue) { - res = defaultValue; - if (/%\s*$/.test(res)) { - value = defaultValue; - res = parseFloat(value!); - } - } else if (allowNull) { - res = null; - } else if (isString) { - res = ''; - } else { - res = 0; - } - } else if (isString) { - res = value; - } else { - res = parseFloat(value); - } - // Support for dimensions in percentage of the root size. If root-size - // is not set (e.g. during ), just scale the percentage value to - // 0..1, as required by gradients with gradientUnits="objectBoundingBox" - if (/%\s*$/.test(value!)) { - const size = allowPercent ? 1 : bbox[/x|^width/.test(name) ? 'width' : 'height']; - return Number(res) / 100 * size; - } - return res; - }; - const getPoint = function ( - node: SVGElement, - x: string, - y: string, - allowNull?: boolean, - allowPercent?: boolean, - defaultX?: string, - defaultY?: string - ) { - const resultX = Number(getValue(node, x || 'x', false, allowNull, allowPercent, defaultX)); - const resultY = Number(getValue(node, y || 'y', false, allowNull, allowPercent, defaultY)); - return allowNull && (x === null || y === null) ? null : {x: resultX, y: resultY}; - }; - - let [defs] = svgTag.getElementsByTagName('defs'); - if (!defs) { - defs = SvgElement.create('defs') as SVGDefsElement; - svgTag.appendChild(defs); - } - - // Clone the old gradient. We'll make a new one, since the gradient might be reused elsewhere - // with different transform matrix - // @ts-expect-error ignore it - const oldGradient = svgTag.getElementById(gradientId); - if (!oldGradient) return; - - const radial = oldGradient.tagName.toLowerCase() === 'radialgradient'; - // @ts-expect-error ignore it - const newGradient = svgTag.getElementById(gradientId).cloneNode(true /* deep */); - - // Give the new gradient a new ID - let matrixString = Matrix.toString(matrix); - matrixString = matrixString.substring(8, matrixString.length - 1); - const newGradientId = `${gradientId}-${matrixString}`; - newGradient.setAttribute('id', newGradientId); - - // This gradient already exists and was transformed before. Just reuse the already-transformed one. - // @ts-expect-error ignore it - if (svgTag.getElementById(newGradientId)) { - // This is the same code as in the end of the function, but I don't feel like wrapping the next 80 lines - // in an `if (!svgTag.getElementById(newGradientId))` block - return `url(#${newGradientId})`; - } - - const scaleToBounds = getValue(newGradient, 'gradientUnits', true) !== - 'userSpaceOnUse'; - let origin; - let destination; - let radius; - let focal; - if (radial) { - origin = getPoint(newGradient, 'cx', 'cy', false, scaleToBounds, '50%', '50%'); - radius = Number(getValue(newGradient, 'r', false, false, scaleToBounds, '50%')); - focal = getPoint(newGradient, 'fx', 'fy', true, scaleToBounds); - } else { - origin = getPoint(newGradient, 'x1', 'y1', false, scaleToBounds); - destination = getPoint(newGradient, 'x2', 'y2', false, scaleToBounds, '1'); - if (origin!.x === destination!.x && origin!.y === destination!.y) { - // If it's degenerate, use the color of the last stop, as described by - // https://www.w3.org/TR/SVG/pservers.html#LinearGradientNotes - const stops = newGradient.getElementsByTagName('stop'); - if (!stops.length || !stops[stops.length - 1].attributes || - !stops[stops.length - 1].attributes['stop-color']) { - return null; - } - return stops[stops.length - 1].attributes['stop-color'].value; - } - } - - // Transform points - // Emulate SVG's gradientUnits="objectBoundingBox" - if (scaleToBounds) { - const boundsMatrix = Matrix.compose(Matrix.translate(bbox.x, bbox.y), Matrix.scale(bbox.width, bbox.height)); - origin = Matrix.applyToPoint(boundsMatrix, origin!); - if (destination) destination = Matrix.applyToPoint(boundsMatrix, destination); - if (radius) { - radius = _quadraticMean(bbox.width, bbox.height) * radius; - } - if (focal) focal = Matrix.applyToPoint(boundsMatrix, focal); - } - - if (radial) { - origin = Matrix.applyToPoint(matrix, origin!); - const matrixScale = _getScaleFactor(matrix); - radius = _quadraticMean(matrixScale.x, matrixScale.y) * radius!; - if (focal) focal = Matrix.applyToPoint(matrix, focal); - } else { - const dot = (a: PointObjectNotation, b: PointObjectNotation) => (a.x * b.x) + (a.y * b.y); - const multiply = - (coefficient: number, v: PointObjectNotation) => ({x: coefficient * v.x, y: coefficient * v.y}); - const add = (a: PointObjectNotation, b: PointObjectNotation) => ({x: a.x + b.x, y: a.y + b.y}); - const subtract = (a: PointObjectNotation, b: PointObjectNotation) => ({x: a.x - b.x, y: a.y - b.y}); - - // The line through origin and gradientPerpendicular is the line at which the gradient starts - let gradientPerpendicular = Math.abs(origin!.x - destination!.x) < 1e-8 ? - add(origin!, {x: 1, y: (origin!.x - destination!.x) / (destination!.y - origin!.y)}) : - add(origin!, {x: (destination!.y - origin!.y) / (origin!.x - destination!.x), y: 1}); - - // Transform points - gradientPerpendicular = Matrix.applyToPoint(matrix, gradientPerpendicular); - origin = Matrix.applyToPoint(matrix, origin!); - destination = Matrix.applyToPoint(matrix, destination!); - - // Calculate the direction that the gradient has changed to - const originToPerpendicular = subtract(gradientPerpendicular, origin); - const originToDestination = subtract(destination, origin); - const gradientDirection = Math.abs(originToPerpendicular.x) < 1e-8 ? - {x: 1, y: -originToPerpendicular.x / originToPerpendicular.y} : - {x: -originToPerpendicular.y / originToPerpendicular.x, y: 1}; - - // Set the destination so that the gradient moves in the correct direction, by projecting the destination vector - // onto the gradient direction vector - const projectionCoeff = dot(originToDestination, gradientDirection) / dot(gradientDirection, gradientDirection); - const projection = multiply(projectionCoeff, gradientDirection); - destination = {x: origin.x + projection.x, y: origin.y + projection.y}; - } - - // Put values back into svg - if (radial) { - newGradient.setAttribute('cx', Number(origin.x.toFixed(4))); - newGradient.setAttribute('cy', Number(origin.y.toFixed(4))); - newGradient.setAttribute('r', Number(radius!.toFixed(4))); - if (focal) { - newGradient.setAttribute('fx', Number(focal.x.toFixed(4))); - newGradient.setAttribute('fy', Number(focal.y.toFixed(4))); - } - } else { - newGradient.setAttribute('x1', Number(origin.x.toFixed(4))); - newGradient.setAttribute('y1', Number(origin.y.toFixed(4))); - newGradient.setAttribute('x2', Number(destination!.x.toFixed(4))); - newGradient.setAttribute('y2', Number(destination!.y.toFixed(4))); - } - newGradient.setAttribute('gradientUnits', 'userSpaceOnUse'); - defs.appendChild(newGradient); - - return `url(#${newGradientId})`; -}; - -// Adapted from paper.js's SvgImport.getDefinition -const _parseUrl = (value: string | undefined, windowRef: Window) => { - // When url() comes from a style property, '#'' seems to be missing on - // WebKit. We also get variations of quotes or no quotes, single or - // double, so handle it all with one regular expression: - const match = value && value.match(/\((?:["'#]*)([^"')]+)/); - const name = match && match[1]; - const res = name && windowRef ? - // This is required by Firefox, which can produce absolute - // urls for local gradients, see paperjs#1001: - name.replace(`${windowRef.location.href.split('#')[0]}#`, '') : - name; - return res; -}; - -/** - * Scratch 2.0 displays stroke widths in a "normalized" way, that is, - * if a shape with a stroke width has a transform applied, it will be - * rendered with a stroke that is the same width all the way around, - * instead of stretched looking. - * - * The vector paint editor also prefers to normalize the stroke width, - * rather than keep track of transforms at the group level, as this - * simplifies editing (e.g. stroke width 3 always means the same thickness) - * - * This function performs that normalization process, pushing transforms - * on groups down to the leaf level and averaging out the stroke width - * around the shapes. Note that this doens't just change stroke widths, it - * changes path data and attributes throughout the SVG. - * - * @param {SVGElement} svgTag The SVG dom object - * @param {Window} windowRef The window to use. Need to pass in for - * tests to work, as they get angry at even the mention of window. - * @param {object} bboxForTesting The bounds to use. Need to pass in for - * tests only, because getBBox doesn't work in Node. This should - * be the bounds of the svgTag without including stroke width or transforms. - * @returns {void} - */ -const transformStrokeWidths = function (svgTag: SVGElement, windowRef: Window, bboxForTesting?: BBox) { - const inherited = Matrix.identity(); - - const applyTransforms = ( - element: Element, matrix: Matrix.Matrix, strokeWidth: number, fill?: string, stroke?: string - ) => { - if (_isContainerElement(element)) { - // Push fills and stroke width down to leaves - // @ts-expect-error ignore it - if (element.attributes['stroke-width']) { - // @ts-expect-error ignore it - strokeWidth = element.attributes['stroke-width'].value; - } - if (element.attributes) { - // @ts-expect-error ignore it - if (element.attributes.fill) fill = element.attributes.fill.value; - // @ts-expect-error ignore it - if (element.attributes.stroke) stroke = element.attributes.stroke.value; - } - - // If any child nodes don't take attributes, leave the attributes - // at the parent level. - for (let i = 0; i < element.childNodes.length; i++) { - applyTransforms( - // @ts-expect-error ignore it - element.childNodes[i], - Matrix.compose(matrix, _parseTransform(element)), - strokeWidth, - fill, - stroke - ); - } - element.removeAttribute('transform'); - element.removeAttribute('stroke-width'); - element.removeAttribute('fill'); - element.removeAttribute('stroke'); - } else if (_isPathWithTransformAndStroke(element, strokeWidth)) { - // @ts-expect-error ignore it - if (element.attributes['stroke-width']) { - // @ts-expect-error ignore it - strokeWidth = element.attributes['stroke-width'].value; - } - // @ts-expect-error ignore it - if (element.attributes.fill) fill = element.attributes.fill.value; - // @ts-expect-error ignore it - if (element.attributes.stroke) stroke = element.attributes.stroke.value; - matrix = Matrix.compose(matrix, _parseTransform(element)); - if (Matrix.toString(matrix) === Matrix.toString(Matrix.identity())) { - element.removeAttribute('transform'); - element.setAttribute('stroke-width', String(strokeWidth)); - if (fill) element.setAttribute('fill', fill); - if (stroke) element.setAttribute('stroke', stroke); - return; - } - - // Transform gradient - const fillGradientId = _parseUrl(fill, windowRef); - const strokeGradientId = _parseUrl(stroke, windowRef); - - if (fillGradientId || strokeGradientId) { - const doc = windowRef.document; - // Need path bounds to transform gradient - const svgSpot = doc.createElement('span'); - let bbox; - if (bboxForTesting) { - bbox = bboxForTesting; - } else { - try { - doc.body.appendChild(svgSpot); - const svg = SvgElement.set(doc.createElementNS(SvgElement.svg, 'svg') as SVGElement); - const path = SvgElement.set(doc.createElementNS(SvgElement.svg, 'path') as SVGElement); - // @ts-expect-error ignore it - path.setAttribute('d', element.attributes.d.value); - svg.appendChild(path); - svgSpot.appendChild(svg); - // Take the bounding box. - // @ts-expect-error ignore it - bbox = svg.getBBox(); - } finally { - // Always destroy the element, even if, for example, getBBox throws. - doc.body.removeChild(svgSpot); - } - } - - if (fillGradientId) { - const newFillRef = _createGradient(fillGradientId, svgTag, bbox, matrix); - if (newFillRef) fill = newFillRef; - } - - if (strokeGradientId) { - const newStrokeRef = _createGradient(strokeGradientId, svgTag, bbox, matrix); - if (newStrokeRef) stroke = newStrokeRef; - } - } - - // Transform path data - // @ts-expect-error ignore it - element.setAttribute('d', _transformPath(element.attributes.d.value, matrix)); - element.removeAttribute('transform'); - - // Transform stroke width - const matrixScale = _getScaleFactor(matrix); - element.setAttribute('stroke-width', String(_quadraticMean(matrixScale.x, matrixScale.y) * strokeWidth)); - if (fill) element.setAttribute('fill', fill); - if (stroke) element.setAttribute('stroke', stroke); - } else if (_isGraphicsElement(element)) { - // Push stroke width, fill, and stroke down to leaves - // @ts-expect-error ignore it - if (strokeWidth && !element.attributes['stroke-width']) { - element.setAttribute('stroke-width', String(strokeWidth)); - } - - // @ts-expect-error ignore it - if (fill && !element.attributes.fill) { - element.setAttribute('fill', fill); - } - // @ts-expect-error ignore it - if (stroke && !element.attributes.stroke) { - element.setAttribute('stroke', stroke); - } - - // Push transform down to leaves - matrix = Matrix.compose(matrix, _parseTransform(element)); - if (Matrix.toString(matrix) === Matrix.toString(Matrix.identity())) { - element.removeAttribute('transform'); - } else { - element.setAttribute('transform', Matrix.toString(matrix)); - } - } - }; - applyTransforms(svgTag, inherited, 1 /* default SVG stroke width */); -}; - -export default transformStrokeWidths; diff --git a/packages/svg-renderer/src/types/global.d.ts b/packages/svg-renderer/src/types/global.d.ts deleted file mode 100644 index 8293c0a85..000000000 --- a/packages/svg-renderer/src/types/global.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -import type {Matrix} from 'transformation-matrix'; - -declare global { - type int = number; -} diff --git a/packages/svg-renderer/src/types/scratch-render-fonts.d.ts b/packages/svg-renderer/src/types/scratch-render-fonts.d.ts deleted file mode 100644 index a36c32072..000000000 --- a/packages/svg-renderer/src/types/scratch-render-fonts.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'scratch-render-fonts' { - export default function getFonts(): Record; -} diff --git a/packages/svg-renderer/src/types/transformation-matrix.d.ts b/packages/svg-renderer/src/types/transformation-matrix.d.ts deleted file mode 100644 index 8a6c42398..000000000 --- a/packages/svg-renderer/src/types/transformation-matrix.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'transformation-matrix' { - export function skewDEG(ax: number, ay: number): Matrix; -} diff --git a/packages/svg-renderer/src/util/log.ts b/packages/svg-renderer/src/util/log.ts deleted file mode 100644 index b5a2a9a73..000000000 --- a/packages/svg-renderer/src/util/log.ts +++ /dev/null @@ -1,4 +0,0 @@ -import nanolog from '@turbowarp/nanolog'; -nanolog.enable(); - -export default nanolog('scratch-svg-render'); diff --git a/packages/svg-renderer/test/bitmapAdapter_getResized.ts b/packages/svg-renderer/test/bitmapAdapter_getResized.ts deleted file mode 100644 index de125a7a8..000000000 --- a/packages/svg-renderer/test/bitmapAdapter_getResized.ts +++ /dev/null @@ -1,102 +0,0 @@ -// Test getResizedWidthHeight function of bitmap adapter class - -import {test} from 'tap'; -import BitmapAdapter from '../src/bitmap-adapter'; - -test('zero', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(0, 0); - t.equal(0, size.width); - t.equal(0, size.height); - t.end(); -}); - -// Double (as if it is bitmap resolution 1) -test('smallImg', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(50, 50); - t.equal(100, size.width); - t.equal(100, size.height); - t.end(); -}); - -// Double (as if it is bitmap resolution 1) -test('stageSizeImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(480, 360); - t.equal(960, size.width); - t.equal(720, size.height); - t.end(); -}); - -// Don't resize -test('mediumHeightImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(50, 700); - t.equal(50, size.width); - t.equal(700, size.height); - t.end(); -}); - -// Don't resize -test('mediumWidthImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(700, 50); - t.equal(700, size.width); - t.equal(50, size.height); - t.end(); -}); - -// Don't resize -test('mediumImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(700, 700); - t.equal(700, size.width); - t.equal(700, size.height); - t.end(); -}); - -// Don't resize -test('doubleStageSizeImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(960, 720); - t.equal(960, size.width); - t.equal(720, size.height); - t.end(); -}); - -// Fit to stage width -test('wideImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(1000, 50); - t.equal(960, size.width); - t.equal(960 / 1000 * 50, size.height); - t.end(); -}); - -// Fit to stage height -test('tallImage', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(50, 1000); - t.equal(720, size.height); - t.equal(720 / 1000 * 50, size.width); - t.end(); -}); - -// Fit to stage height -test('largeImageHeightConstraint', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(1000, 1000); - t.equal(720, size.height); - t.equal(720 / 1000 * 1000, size.width); - t.end(); -}); - -// Fit to stage width -test('largeImageWidthConstraint', t => { - const bitmapAdapter = new BitmapAdapter(); - const size = bitmapAdapter.getResizedWidthHeight(2000, 1000); - t.equal(960, size.width); - t.equal(960 / 2000 * 1000, size.height); - t.end(); -}); diff --git a/packages/svg-renderer/test/fixtures/css-import.sanitized.svg b/packages/svg-renderer/test/fixtures/css-import.sanitized.svg deleted file mode 100644 index d570ed541..000000000 --- a/packages/svg-renderer/test/fixtures/css-import.sanitized.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/packages/svg-renderer/test/fixtures/css-import.svg b/packages/svg-renderer/test/fixtures/css-import.svg deleted file mode 100644 index f413f2e45..000000000 --- a/packages/svg-renderer/test/fixtures/css-import.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/packages/svg-renderer/test/fixtures/embedded-cat-foo.sanitized.svg b/packages/svg-renderer/test/fixtures/embedded-cat-foo.sanitized.svg deleted file mode 100644 index efd820ee7..000000000 --- a/packages/svg-renderer/test/fixtures/embedded-cat-foo.sanitized.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/svg-renderer/test/fixtures/embedded-cat-foo.svg b/packages/svg-renderer/test/fixtures/embedded-cat-foo.svg deleted file mode 100644 index 274a0cfe0..000000000 --- a/packages/svg-renderer/test/fixtures/embedded-cat-foo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/svg-renderer/test/fixtures/embedded-cat-xlink.svg b/packages/svg-renderer/test/fixtures/embedded-cat-xlink.svg deleted file mode 100644 index 5c74ddf44..000000000 --- a/packages/svg-renderer/test/fixtures/embedded-cat-xlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/svg-renderer/test/fixtures/hearts.svg b/packages/svg-renderer/test/fixtures/hearts.svg deleted file mode 100644 index e85b16055..000000000 --- a/packages/svg-renderer/test/fixtures/hearts.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/svg-renderer/test/fixtures/invalid-cloud.svg b/packages/svg-renderer/test/fixtures/invalid-cloud.svg deleted file mode 100644 index 374b1b645..000000000 --- a/packages/svg-renderer/test/fixtures/invalid-cloud.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/svg-renderer/test/fixtures/metadata-body.svg b/packages/svg-renderer/test/fixtures/metadata-body.svg deleted file mode 100644 index f902d7ae2..000000000 --- a/packages/svg-renderer/test/fixtures/metadata-body.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - stuff inside - diff --git a/packages/svg-renderer/test/fixtures/metadata-onload.sanitized.svg b/packages/svg-renderer/test/fixtures/metadata-onload.sanitized.svg deleted file mode 100644 index 6df228d06..000000000 --- a/packages/svg-renderer/test/fixtures/metadata-onload.sanitized.svg +++ /dev/null @@ -1,3 +0,0 @@ - - ad="alert('from the svg')"> - diff --git a/packages/svg-renderer/test/fixtures/metadata-onload.svg b/packages/svg-renderer/test/fixtures/metadata-onload.svg deleted file mode 100644 index 766ed08c9..000000000 --- a/packages/svg-renderer/test/fixtures/metadata-onload.svg +++ /dev/null @@ -1,7 +0,0 @@ - - ad="alert('from the svg')"> - diff --git a/packages/svg-renderer/test/fixtures/onload-script.svg b/packages/svg-renderer/test/fixtures/onload-script.svg deleted file mode 100644 index dab9a5710..000000000 --- a/packages/svg-renderer/test/fixtures/onload-script.svg +++ /dev/null @@ -1,7 +0,0 @@ - - ad="alert('from the svg')"> - diff --git a/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.sanitized.svg b/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.sanitized.svg deleted file mode 100644 index ec1192ec9..000000000 --- a/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.sanitized.svg +++ /dev/null @@ -1,74 +0,0 @@ - - red and white carousel - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.svg b/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.svg deleted file mode 100644 index c19a08102..000000000 --- a/packages/svg-renderer/test/fixtures/red-and-white-carousel-pound-in-href.svg +++ /dev/null @@ -1,74 +0,0 @@ - - red and white carousel - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - Layer 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/svg-renderer/test/fixtures/reserved-namespace.sanitized.svg b/packages/svg-renderer/test/fixtures/reserved-namespace.sanitized.svg deleted file mode 100644 index 4f6aebd4f..000000000 --- a/packages/svg-renderer/test/fixtures/reserved-namespace.sanitized.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/svg-renderer/test/fixtures/reserved-namespace.svg b/packages/svg-renderer/test/fixtures/reserved-namespace.svg deleted file mode 100644 index 4bad8db8b..000000000 --- a/packages/svg-renderer/test/fixtures/reserved-namespace.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.sanitized.svg b/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.sanitized.svg deleted file mode 100644 index b42e29903..000000000 --- a/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.sanitized.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.svg b/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.svg deleted file mode 100644 index edb068b41..000000000 --- a/packages/svg-renderer/test/fixtures/scratch_cat_bitmap_within_svg.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/packages/svg-renderer/test/fixtures/script.sanitized.svg b/packages/svg-renderer/test/fixtures/script.sanitized.svg deleted file mode 100644 index 15fa831ba..000000000 --- a/packages/svg-renderer/test/fixtures/script.sanitized.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/svg-renderer/test/fixtures/script.svg b/packages/svg-renderer/test/fixtures/script.svg deleted file mode 100644 index 85cc86886..000000000 --- a/packages/svg-renderer/test/fixtures/script.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/packages/svg-renderer/test/fixtures/svg-tag-prefixes.svg b/packages/svg-renderer/test/fixtures/svg-tag-prefixes.svg deleted file mode 100644 index d2988b3ca..000000000 --- a/packages/svg-renderer/test/fixtures/svg-tag-prefixes.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/svg-renderer/test/fixup-svg-string.ts b/packages/svg-renderer/test/fixup-svg-string.ts deleted file mode 100644 index a41fae5a7..000000000 --- a/packages/svg-renderer/test/fixup-svg-string.ts +++ /dev/null @@ -1,144 +0,0 @@ -import {test} from 'tap'; -import fs from 'fs'; -import path from 'path'; -import {DOMParser} from '@xmldom/xmldom'; -import fixupSvgString from '../src/fixup-svg-string'; - -// The browser DOMParser throws on errors by default, replicate that here -// by customizing the error callback to throw (defaults to logging) -const domParser = new DOMParser({ - errorHandler: { - error: e => { - throw new Error(e); - } - } -}); - -test('fixupSvgString should make parsing fixtures not throw', t => { - const filePath = path.resolve(__dirname, './fixtures/hearts.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - - // Make sure undefineds aren't being written into the file - t.equal(fixed.indexOf('undefined'), -1); - t.doesNotThrow(() => { - domParser.parseFromString(fixed, 'text/xml'); - }); - t.end(); -}); - -test('fixupSvgString should correct namespace declarations bound to reserved namespace names', t => { - const filePath = path.resolve(__dirname, './fixtures/reserved-namespace.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - - // Make sure undefineds aren't being written into the file - t.equal(fixed.indexOf('undefined'), -1); - t.doesNotThrow(() => { - domParser.parseFromString(fixed, 'text/xml'); - }); - t.end(); -}); - -test('fixupSvgString shouldn\'t correct non-attributes', t => { - const dontFix = fixupSvgString('xmlns:test="http://www/w3.org/XML/1998/namespace" is not an xmlns attribute'); - - t.not(dontFix.indexOf('http://www/w3.org/XML/1998/namespace'), -1); - t.end(); -}); - -test('fixupSvgString should strip `svg:` prefix from tag names', t => { - const filePath = path.resolve(__dirname, './fixtures/svg-tag-prefixes.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - - const checkPrefixes = (element: Element) => { - t.not(element.prefix, 'svg'); - // JSDOM doesn't have element.children, only element.childNodes - if (element.childNodes) { - // JSDOM's childNodes is not iterable, so for...of cannot be used here - for (let i = 0; i < element.childNodes.length; i++) { - const child = element.childNodes[i]; - if (child.nodeType === 1 /* Node.ELEMENT_NODE */) checkPrefixes(child as Element); - } - } - }; - - // Make sure undefineds aren't being written into the file - t.equal(fixed.indexOf('undefined'), -1); - t.doesNotThrow(() => { - domParser.parseFromString(fixed, 'text/xml'); - }); - - checkPrefixes(domParser.parseFromString(fixed, 'text/xml') as unknown as Element); - - t.end(); -}); - -test('fixupSvgString should empty script tags', t => { - const filePath = path.resolve(__dirname, './fixtures/script.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - // Script tag should remain but have no contents. - t.equal(fixed.indexOf(''), 207); - // The contents of the script tag (e.g. the alert) are no longer there. - t.equal(fixed.indexOf('stuff inside'), -1); - t.end(); -}); - -test('fixupSvgString should empty script tags in onload', t => { - const filePath = path.resolve(__dirname, './fixtures/onload-script.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - // Script tag should remain but have no contents. - t.equal(fixed.indexOf(''), 792); - t.end(); -}); - -test('fixupSvgString strips contents of metadata', t => { - const filePath = path.resolve(__dirname, './fixtures/metadata-body.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - // Metadata tag should still exist, it'll just be empty. - t.equal(fixed.indexOf(''), 207); - // The contents of the metadata tag are gone. - t.equal(fixed.indexOf('stuff inside'), -1); - t.end(); -}); - -test('fixupSvgString strips contents of metadata in onload', t => { - const filePath = path.resolve(__dirname, './fixtures/metadata-onload.svg'); - const svgString = fs.readFileSync(filePath) - .toString(); - const fixed = fixupSvgString(svgString); - // Metadata tag should still exist, it'll just be empty. - t.equal(fixed.indexOf(''), 800); - t.end(); -}); - -test('fixupSvgString should correct invalid mime type', t => { - const filePath = path.resolve(__dirname, './fixtures/invalid-cloud.svg'); - const svgString = fs.readFileSync(filePath, 'utf8'); - const fixed = fixupSvgString(svgString); - - // Make sure we replace an invalid mime type from Photoshop exported SVGs - t.not(svgString.indexOf('img/png'), -1); - t.equal(fixed.indexOf('img/png'), -1); - t.doesNotThrow(() => { - domParser.parseFromString(fixed, 'text/xml'); - }); - t.end(); -}); - -test('fixupSvgString shouldn\'t correct non-image tags', t => { - const dontFix = fixupSvgString('data:img/png is not a mime type'); - - t.not(dontFix.indexOf('img/png'), -1); - t.end(); -}); diff --git a/packages/svg-renderer/test/sanitize-svg.ts b/packages/svg-renderer/test/sanitize-svg.ts deleted file mode 100644 index e14d320da..000000000 --- a/packages/svg-renderer/test/sanitize-svg.ts +++ /dev/null @@ -1,34 +0,0 @@ -import {test} from 'tap'; -import fs from 'fs'; -import path from 'path'; - -import sanitizeSvg from '../src/sanitize-svg'; - -// find all svg fixtures with filenames ending '.sanitized.svg', and compare their -// content to the result when we run sanitizeSvg.sanitizeSvgText() on the raw -// versions -test('compare svg content before and after sanitize-svg sanitizes it', t => { - const dirPath = path.resolve(__dirname, './fixtures/'); - const fixtureFilenames = fs.readdirSync(dirPath); - // for simplicity, we'll call those existing '.sanitized.svg' files "correct" - const correctSvgFilenames: string[] = []; - fixtureFilenames.forEach(filename => { - if (/^.*.sanitized.svg$/.test(filename)) { - correctSvgFilenames.push(filename); - } - }); - correctSvgFilenames.forEach(correctSvgFilename => { - // load raw svg content and run it through sanitizeSvg.sanitizeSvgText() - const rawSvgFilename = correctSvgFilename.replace('.sanitized.svg', '.svg'); - const rawSvgFilePath = path.resolve(__dirname, `./fixtures/${rawSvgFilename}`); - const rawSvgString = fs.readFileSync(rawSvgFilePath).toString(); - const testSanitizedSvgString = sanitizeSvg.sanitizeSvgText(rawSvgString); - - // load "correct" content - const correctSvgFilePath = path.resolve(__dirname, `./fixtures/${correctSvgFilename}`); - const correctSvgString = fs.readFileSync(correctSvgFilePath).toString(); - - t.equal(testSanitizedSvgString, correctSvgString); - }); - t.end(); -}); diff --git a/packages/svg-renderer/test/test-output/transform-applier-test.html b/packages/svg-renderer/test/test-output/transform-applier-test.html deleted file mode 100644 index be0edfe1d..000000000 --- a/packages/svg-renderer/test/test-output/transform-applier-test.html +++ /dev/null @@ -1,373 +0,0 @@ - -

noTransformPath

-
- -
-
- -

noStrokeWidthPath

-
- -
-
- -

identityTransformPath

-
- -
-
- -

transformBox

-
- -
-
- -

transformPath

-
- -
-
- -

composedTransformPathIdentity

-
- -
-
- -

composedTransformPath

-
- -
-
- -

parentTransformPath

-
- -
-
- -

nestedNoTransformPath

-
- -
-
- -

nestedTransformPath

-
- -
-
- -

variousTransformsPath

-
- -
-
- -

siblingsTransformPath

-
- -
-
- -

siblingsStroke

-
- -
-
- -

transformedNestedStroke

-
- -
-
- -

variousTransformsRelativePath

-
- -
-
- -

scaleTransformEllipticalPath

-
- -
-
- -

invertTransformEllipticalPath

-
- -
-
- -

rotateTransformEllipticalPath

-
- -
-
- -

skewXTransformEllipticalPath

-
- -
-
- -

skewYTransformEllipticalPath

-
- -
-
- -

variousTransformsEllipticalPath

-
- -
-
- -

linearGradientTransformSquareSkewY

-
- -
-
- -

linearGradientTransformSquareSkewX

-
- -
-
- -

linearGradientTransform

-
- -
-
- -

reusedLinearGradientTransform

-
- -
-
- -

nestedLinearGradientTransform

-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - -

percentLinearGradientTransform

-
- - - - - - - - - -
-
- - - - - - - - - - - - -

userSpaceLinearGradientTransform

-
- - - - - - - - - -
-
- - - - - - - - - - - - -

linearGradientTransform

-
- -
-
- -

nestedRadialGradientTransform. Note that radial gradients are not expected to match exactly.

-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - -

focalRadialGradientTransform

-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - -

percentRadialGradientTransform

-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - -

userSpaceRadialGradientTransform

-
- - - - - - - - - -
-
- - - - - - - - - - - - -

blackFillsBugFix

-
- - - - - - - -
-
- - - - - - - -
- \ No newline at end of file diff --git a/packages/svg-renderer/test/transform-applier.ts b/packages/svg-renderer/test/transform-applier.ts deleted file mode 100644 index 5e86a7288..000000000 --- a/packages/svg-renderer/test/transform-applier.ts +++ /dev/null @@ -1,797 +0,0 @@ -// @ts-nocheck -// Test transform-applier - -import {test} from 'tap'; -import {JSDOM} from 'jsdom'; -import transformStrokeWidths from '../src/transform-applier'; -import log from '../src/util/log'; - -// PathData, absolute instructions only -const d = 'M -20 -20 0 10 ' + - 'L 5 5 H 10 V 10 ' + - 'C 10 10 20 10 15 25 ' + - 'S 15 30 15 40 ' + - 'Q 20 50 30 60 ' + - 'T 30 70 20 80 ' + - 'M 0 0 ' + - 'A 40 50 0 1 1 0 100 Z '; -// Path constructed specifically for testing elliptical arcs -const ellipticalPath = 'M10,300 l 50,-25 ' + - 'a25,25 -60 0,1 50,-25 l 50,-25 ' + - 'a25,50 -45 0,1 50,-25 l 50,-25 ' + - 'a25,75 -30 0,1 50,-25 l 50,-25 ' + - 'a25,100 -15 0,1 50,-25 l 50,-25 v 50 l -50,25 ' + - 'a25,25 60 1,1 -50,25 l -50,25 ' + - 'a25,50 45 1,1 -50,25 l -50,25 ' + - 'a25,75 30 1,1 -50,25 l -50,25 ' + - 'a25,100 15 1,1 -50,25 l -50,25 '; - -// This path is tricky because all of its bounds lie outside -// the 2 given points -const trickyBoundsPath = 'M 40 40 A 30 50 -45 1,1 80 80'; -// Because jsdom doesn't simulate SvgElement.getBBox(), we need to store -// the bounds for testing. -const trickyBoundsPathBounds = { - height: 82.46210479736328, - width: 82.46211242675781, - x: 36.26179885864258, - y: 1.2760814428329468 -}; - -const {window} = new JSDOM(); -const parser = new window.DOMParser(); -// eslint-disable-next-line @typescript-eslint/no-require-imports -const fs = require('fs'); -const OUTPUT_COMPARISON_FILES = false; -let comparisonFileString = ''; - -const comparisonFileAppend = function (svgString, svgElement, name) { - if (!OUTPUT_COMPARISON_FILES) return; - const newSvgString = new window.XMLSerializer().serializeToString(svgElement); - comparisonFileString += - `

${name}

-
- ${svgString} -
-
- ${newSvgString} -
`; -}; - -const outputComparisonFile = function () { - if (!OUTPUT_COMPARISON_FILES) return; - fs.writeFile( - `${__dirname}/test-output/transform-applier-test.html`, - `\n${comparisonFileString}\n`, - err => log.error(err) - ); -}; - -// No transform attribute on the path -test('noTransformPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'noTransformPath'); - - t.equal(d, svgElement.getElementById('path').attributes.d.value); - t.notOk(svgElement.getElementById('path').attributes.transform); - t.end(); -}); - -// No stroke width attribute on the path. Stroke width is 1 by default in SVG, so transform should increase it to 2. -test('transformedNoStrokeWidthPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'noStrokeWidthPath'); - - t.equal('2', svgElement.getElementById('path').attributes['stroke-width'].value); - t.end(); -}); - -// Transform is identity matrix -test('identityTransformPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'identityTransformPath'); - - t.equal(d, svgElement.getElementById('path').attributes.d.value); - t.notOk(svgElement.getElementById('path').attributes.transform); - t.end(); -}); - -// Transform on a simple box -test('transformBox', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'transformBox'); - - const transformed = `M 45 45 L 245 45 L 245 145 L 45 145 Z `; - t.equal(transformed, svgElement.getElementById('path').attributes.d.value); - // Transform is integrated into path, so the attribute should be gone - t.notOk(svgElement.getElementById('path').attributes.transform); - const quadraticMean = Math.sqrt(((20 * 20) + (10 * 10)) / 2); - t.equal(`${quadraticMean}`, svgElement.getElementById('path').attributes['stroke-width'].value); - t.end(); -}); - -// Transform is not identity matrix -test('transformPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'transformPath'); - - const doubled = 'M 5 5 L 45 65 L 55 55 L 65 55 L 65 65 C 65 65 85 65 75 95 C 65 125 75 105 75 125 ' + - 'Q 85 145 105 165 Q 125 185 105 185 Q 85 185 85 205 M 45 45 A 80 100 0 1 1 45 245 Z '; - t.equal(doubled, svgElement.getElementById('path').attributes.d.value); - // Transform is integrated into path, so the attribute should be gone - t.notOk(svgElement.getElementById('path').attributes.transform); - t.equal('2', svgElement.getElementById('path').attributes['stroke-width'].value); - t.end(); -}); - -// Transform has multiple matrices that compose to identity matrix -test('composedTransformPathIdentity', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'composedTransformPathIdentity'); - - t.equal(d, svgElement.getElementById('path').attributes.d.value); - t.notOk(svgElement.getElementById('path').attributes.transform); - t.end(); -}); - -// Transform has multiple matrices that don't compose to identity -test('composedTransformPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'composedTransformPath'); - - const transformedPath = 'M -29.5 -29 L 0.5 16 L 8 8.5 L 15.5 8.5 L 15.5 16 C 15.5 16 30.5 16 23 38.5 ' + - 'C 15.5 61 23 46 23 61 Q 30.5 76 45.5 91 Q 60.5 106 45.5 106 Q 30.5 106 30.5 121 M 0.5 1 ' + - 'A 60 75 0 1 1 0.5 151 Z '; - t.equal(transformedPath, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Transform is on parent group -test('parentTransformPath', t => { - const svgString = - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'parentTransformPath'); - - const doubled = 'M -40 -40 L 0 20 L 10 10 L 20 10 L 20 20 C 20 20 40 20 30 50 C 20 80 30 60 30 80 ' + - 'Q 40 100 60 120 Q 80 140 60 140 Q 40 140 40 160 M 0 0 A 80 100 0 1 1 0 200 Z '; - t.equal(doubled, svgElement.getElementById('path').attributes.d.value); - // Transform should be gone from both child and parent - t.notOk(svgElement.getElementById('group').attributes.transform); - t.notOk(svgElement.getElementById('path').attributes.transform); - t.equal('2', svgElement.getElementById('path').attributes['stroke-width'].value); - t.end(); -}); - -// Nested path -test('nestedNoTransformPath', t => { - const svgString = - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'nestedNoTransformPath'); - - t.equal(d, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Transforms on parents and children -test('nestedTransformPath', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'nestedTransformPath'); - - const quartered = 'M -45 -45 L 0 22.5 L 11.25 11.25 L 22.5 11.25 L 22.5 22.5 C 22.5 22.5 45 22.5 33.75 56.25 ' + - 'C 22.5 90 33.75 67.5 33.75 90 Q 45 112.5 67.5 135 Q 90 157.5 67.5 157.5 Q 45 157.5 45 180 M 0 0 ' + - 'A 90 112.5 0 1 1 0 225 Z '; - t.equal(quartered, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Transform combines all types of transforms -test('variousTransformsPath', t => { - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'variousTransformsPath'); - - const transformedPath = 'M 115.3172 96.7866 L 134.6908 171.2195 L 151.9584 175.6212 L 164.2563 185.7055 ' + - 'L 159.2866 191.3881 C 159.2866 191.3881 183.8824 211.5567 156.6755 218.5202 ' + - 'C 129.4685 225.4837 151.7058 224.2028 141.7664 235.568 Q 144.1249 257.0175 158.7814 288.5514 ' + - 'Q 173.4379 320.0852 148.842 299.9166 Q 124.2462 279.7479 114.3068 291.1131 M 144.6301 159.8543 ' + - 'A 75.4328 127.2656 -51.6345 1 1 45.2364 273.5062 Z '; - t.equal(transformedPath, svgElement.getElementById('path').attributes.d.value); - t.notOk(svgElement.getElementById('path').attributes.transform); - t.end(); -}); - -// Transform is pushed down to other children -test('siblingsTransformPath', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'siblingsTransformPath'); - - t.equal('matrix(0.5,0,0,0.5,5,10)', svgElement.getElementById('sibling').attributes.transform.value); - t.equal('matrix(0.5,0,0,0.5,-0.25,-0.25)', svgElement.getElementById('distantCousin1').attributes.transform.value); - t.equal('matrix(0.5,0,0,0.5,0,0)', svgElement.getElementById('distantCousin2').attributes.transform.value); - t.end(); -}); - -// Stroke width is pushed down to leaf level -test('siblingsStroke', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'siblingsStroke'); - - t.equal('10', svgElement.getElementById('sibling').attributes['stroke-width'].value); - t.equal('15', svgElement.getElementById('distantCousin1').attributes['stroke-width'].value); - t.equal('5', svgElement.getElementById('distantCousin2').attributes['stroke-width'].value); - t.end(); -}); - -// Nested stroke width is transformed -test('transformedNestedStroke', t => { - const svgString = - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'transformedNestedStroke'); - - const quadraticMean = Math.sqrt(((5 / 2 * 5 / 2) + (2 / 2 * 2 / 2)) / 2); - t.equal(`${quadraticMean}`, svgElement.getElementById('path').attributes['stroke-width'].value); - t.end(); -}); - -// Various transforms applied to a path with relative instructions -test('variousTransformsRelativePath', t => { - const pathData = 'm 20 20 0 20 10 0 l 5 5 h 10 v 10 c 0 10 0 20 15 5 z ' + - 'm -50 5 s 15 0 15 10 q 20 10 10 20 t 20 10 20 10 a 30 10 30 1 1 0 1 '; - const svgString = - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'variousTransformsRelativePath'); - - const transformed = 'M 44.0917 25.6869 L 55.7402 43.813 L 64.0581 39.5868 L 71.1292 42.0053 L 79.447 37.7791 ' + - 'L 85.2713 46.8422 C 91.0955 55.9052 96.9198 64.9683 100.6603 45.0344 Z M 5.4144 51.3493 ' + - 'C 5.4144 51.3493 17.8912 45.01 23.7155 54.0731 Q 46.1755 54.6838 43.6819 67.9731 ' + - 'Q 41.1882 81.2623 66.1419 68.5838 Q 91.0955 55.9052 88.6019 69.1945 ' + - 'A 9.8314 30.5145 -83.9007 1 1 89.1843 70.1008 '; - t.equal(transformed, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing scale transform, elliptical paths -test('scaleTransformEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'scaleTransformEllipticalPath'); - - const scaled = 'M 5 150 L 30 137.5 A 12.5 12.5 -50.7685 0 1 55 125 L 80 112.5 A 12.5 25 -45 0 1 105 100 ' + - 'L 130 87.5 A 12.5 37.5 -30 0 1 155 75 L 180 62.5 A 12.5 50 -15 0 1 205 50 L 230 37.5 L 230 62.5 L 205 75 ' + - 'A 12.5 12.5 -50.7685 1 1 180 87.5 L 155 100 A 12.5 25 45 1 1 130 112.5 L 105 125 A 12.5 37.5 30 1 1 80 137.5 ' + - 'L 55 150 A 12.5 50 15 1 1 30 162.5 L 5 175 '; - t.equal(scaled, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing invert transform, elliptical paths -test('invertTransformEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'invertTransformEllipticalPath'); - - const inverted = 'M 300 10 L 275 60 A 25 25 -50.7685 0 0 250 110 L 225 160 A 25 50 -45 0 0 200 210 ' + - 'L 175 260 A 25 75 -60 0 0 150 310 L 125 360 A 25 100 -75 0 0 100 410 L 75 460 L 125 460 L 150 410 ' + - 'A 25 25 -50.7685 1 0 175 360 L 200 310 A 25 50 45 1 0 225 260 L 250 210 A 25 75 60 1 0 275 160 L 300 110 ' + - 'A 25 100 75 1 0 325 60 L 350 10 '; - t.equal(inverted, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing rotate transform, elliptical paths -test('rotateTransformEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'rotateTransformEllipticalPath'); - - const rotated = 'M 190.597 61.4231 L 201.8042 116.1898 A 25 25 -50.7685 0 1 213.0114 170.9566 ' + - 'L 224.2186 225.7234 A 25 50 60 0 1 235.4257 280.4901 L 246.6329 335.2569 A 25 75 75 0 1 257.8401 390.0237 ' + - 'L 269.0473 444.7904 A 25 100 90 0 1 280.2545 499.5572 L 291.4617 554.324 L 243.1654 541.383 ' + - 'L 231.9582 486.6163 A 25 25 -50.7685 1 1 220.751 431.8495 L 209.5438 377.0827 ' + - 'A 25 50 -30 1 1 198.3367 322.316 L 187.1295 267.5492 A 25 75 -45 1 1 175.9223 212.7824 L 164.7151 158.0156 ' + - 'A 25 100 -60 1 1 153.5079 103.2489 L 142.3007 48.4821 '; - t.equal(rotated, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing skewX transform, elliptical paths -test('skewXTransformEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'skewXTransformEllipticalPath'); - - const skewed = 'M -99.1911 300 L -40.0918 275 A 20.861 29.9602 50.1571 0 1 19.0074 250 L 78.1067 225 ' + - 'A 29.7657 41.9946 -28.5971 0 1 137.206 200 L 196.3052 175 A 28.0557 66.8312 -9.069 0 1 255.4045 150 ' + - 'L 314.5037 125 A 25.6458 97.482 6.9831 0 1 373.603 100 L 432.7022 75 L 414.5037 125 L 355.4045 150 ' + - 'A 20.861 29.9602 50.1571 1 1 296.3052 175 L 237.206 200 A 20.8982 59.8139 53.2248 1 1 178.1067 225 ' + - 'L 119.0074 250 A 21.0102 89.2423 43.6881 1 1 59.9082 275 L 0.8089 300 ' + - 'A 21.8464 114.4351 32.9028 1 1 -58.2903 325 L -117.3896 350 '; - t.equal(skewed, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing skewY transform, elliptical paths -test('skewYTransformEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'skewYTransformEllipticalPath'); - - const skewed = 'M 10 296.3603 L 60 253.1618 A 20.861 29.9602 39.8429 0 1 110 209.9633 L 160 166.7648 ' + - 'A 29.7657 41.9946 -61.4029 0 1 210 123.5663 L 260 80.3677 A 29.4429 63.6825 -34.2139 0 1 310 37.1692 ' + - 'L 360 -6.0293 A 27.3833 91.2964 -14.925 0 1 410 -49.2278 L 460 -92.4263 L 460 -42.4263 L 410 0.7722 ' + - 'A 20.861 29.9602 39.8429 1 1 360 43.9707 L 310 87.1692 A 20.8982 59.8139 36.7752 1 1 260 130.3677 ' + - 'L 210 173.5663 A 21.4899 87.2503 26.3947 1 1 160 216.7648 L 110 259.9633 ' + - 'A 22.8454 109.4312 14.6345 1 1 60 303.1618 L 10 346.3603 '; - t.equal(skewed, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -// Testing various transforms, elliptical paths -test('variousTransformsEllipticalPath', t => { - const svgString = - ` ` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window); - comparisonFileAppend(svgString, svgElement, 'variousTransformsEllipticalPath'); - - const transformed = 'M 24.9709 107.5355 L 51.9997 63.7469 A 22.8929 27.3011 -47.5192 0 1 79.0286 19.9583 ' + - 'L 106.0574 -23.8303 A 23.5927 52.9826 -69.05 0 1 133.0862 -67.6189 L 160.115 -111.4075 ' + - 'A 23.0486 81.3499 -57.6917 0 1 187.1438 -155.1961 L 214.1727 -198.9847 ' + - 'A 22.8991 109.1745 -45.4789 0 1 241.2015 -242.7734 L 268.2303 -286.562 L 297.3515 -241.2466 ' + - 'L 270.3227 -197.458 A 22.8929 27.3011 -47.5192 1 1 243.2939 -153.6694 L 216.2651 -109.8807 ' + - 'A 26.0319 48.0181 7.1283 1 1 189.2363 -66.0921 L 162.2074 -22.3035 ' + - 'A 24.9487 75.1544 -6.3334 1 1 135.1786 21.4851 L 108.1498 65.2737 ' + - 'A 23.9235 104.4996 -19.9344 1 1 81.121 109.0623 L 54.0922 152.8509 '; - t.equal(transformed, svgElement.getElementById('path').attributes.d.value); - t.end(); -}); - -test('linearGradientTransformSquareSkewY', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, {width: 100, height: 100, x: 0, y: 0}); - comparisonFileAppend(svgString, svgElement, 'linearGradientTransformSquareSkewY'); - t.equal('-50', svgElement.getElementById('grad_a-0.75,-0.2679491924311227,0,1,-50,50').attributes.x1.value); - t.equal('-81.6826', svgElement.getElementById('grad_a-0.75,-0.2679491924311227,0,1,-50,50').attributes.x2.value); - t.equal('50', svgElement.getElementById('grad_a-0.75,-0.2679491924311227,0,1,-50,50').attributes.y1.value); - t.equal('138.6809', svgElement.getElementById('grad_a-0.75,-0.2679491924311227,0,1,-50,50').attributes.y2.value); - - t.end(); -}); - -test('linearGradientTransformSquareSkewX', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, {width: 100, height: 100, x: 0, y: 0}); - comparisonFileAppend(svgString, svgElement, 'linearGradientTransformSquareSkewX'); - t.equal('-50', svgElement.getElementById('grad_b-0.75,0,0.20096189432334202,1,-50,50').attributes.x1.value); - t.equal('-50', svgElement.getElementById('grad_b-0.75,0,0.20096189432334202,1,-50,50').attributes.x2.value); - t.equal('50', svgElement.getElementById('grad_b-0.75,0,0.20096189432334202,1,-50,50').attributes.y1.value); - t.equal('150', svgElement.getElementById('grad_b-0.75,0,0.20096189432334202,1,-50,50').attributes.y2.value); - - t.end(); -}); - -test('linearGradientTransform', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'linearGradientTransform'); - t.equal('26.9399', svgElement.getElementById('grad_c-.75,0,-0.20096189432334202,0.75,0,0').attributes.x1.value); - t.equal('84.6436', svgElement.getElementById('grad_c-.75,0,-0.20096189432334202,0.75,0,0').attributes.x2.value); - t.equal('0.9571', svgElement.getElementById('grad_c-.75,0,-0.20096189432334202,0.75,0,0').attributes.y1.value); - t.equal('16.4187', svgElement.getElementById('grad_c-.75,0,-0.20096189432334202,0.75,0,0').attributes.y2.value); - - t.end(); -}); - -test('reusedLinearGradientTransform', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'reusedLinearGradientTransform'); - t.equal('26.9399', svgElement.getElementById('grad_1-.75,0,-0.20096189432334202,0.75,0,0').attributes.x1.value); - t.equal('84.6436', svgElement.getElementById('grad_1-.75,0,-0.20096189432334202,0.75,0,0').attributes.x2.value); - t.equal('0.9571', svgElement.getElementById('grad_1-.75,0,-0.20096189432334202,0.75,0,0').attributes.y1.value); - t.equal('16.4187', svgElement.getElementById('grad_1-.75,0,-0.20096189432334202,0.75,0,0').attributes.y2.value); - t.equal('113.7382', svgElement.getElementById('grad_1-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,150,150') - .attributes.x1.value); - t.equal('31.2761', svgElement.getElementById('grad_1-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,150,150') - .attributes.x2.value); - t.equal('148.7239', svgElement.getElementById('grad_1-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,150,150') - .attributes.y1.value); - t.equal('148.7239', svgElement.getElementById('grad_1-1,1.2246467991473532e-16,-1.2246467991473532e-16,-1,150,150') - .attributes.y2.value); - - t.end(); -}); - -test('nestedLinearGradientTransform', t => { - const svgString = - ` - - - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'nestedLinearGradientTransform'); - t.equal('26.9399', svgElement.getElementById('grad_2-.75,0,-0.20096189432334202,0.75,0,0').attributes.x1.value); - t.equal('26.9399', svgElement.getElementById('grad_2-.75,0,-0.20096189432334202,0.75,0,0').attributes.x2.value); - t.equal('0.9571', svgElement.getElementById('grad_2-.75,0,-0.20096189432334202,0.75,0,0').attributes.y1.value); - t.equal('62.8036', svgElement.getElementById('grad_2-.75,0,-0.20096189432334202,0.75,0,0').attributes.y2.value); - - t.end(); -}); - -test('percentLinearGradientTransform', t => { - const svgString = - ` - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'percentLinearGradientTransform'); - t.equal('26.9399', svgElement.getElementById('grad_3-.75,0,-0.20096189432334202,0.75,0,0').attributes.x1.value); - t.equal('50.6569', svgElement.getElementById('grad_3-.75,0,-0.20096189432334202,0.75,0,0').attributes.x2.value); - t.equal('0.9571', svgElement.getElementById('grad_3-.75,0,-0.20096189432334202,0.75,0,0').attributes.y1.value); - t.equal('31.029', svgElement.getElementById('grad_3-.75,0,-0.20096189432334202,0.75,0,0').attributes.y2.value); - - t.end(); -}); - -test('userSpaceLinearGradientTransform', t => { - const svgString = - ` - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'userSpaceLinearGradientTransform'); - t.equal('10.9808', svgElement.getElementById('grad_4-.75,0,-0.20096189432334202,0.75,0,0').attributes.x1.value); - t.equal('45.494', svgElement.getElementById('grad_4-.75,0,-0.20096189432334202,0.75,0,0').attributes.x2.value); - t.equal('15', svgElement.getElementById('grad_4-.75,0,-0.20096189432334202,0.75,0,0').attributes.y1.value); - t.equal('58.761', svgElement.getElementById('grad_4-.75,0,-0.20096189432334202,0.75,0,0').attributes.y2.value); - - t.end(); -}); - -test('degenerateLinearGradientTransform', t => { - const svgString = - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - ``; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'linearGradientTransform'); - - t.end(); -}); - -test('nestedRadialGradientTransform', t => { - const svgString = - ` - - - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, - 'nestedRadialGradientTransform. Note that radial gradients are not expected to match exactly.'); - t.equal('49.5773', svgElement.getElementById('grad_5-.75,0,-0.20096189432334202,0.75,0,0').attributes.cx.value); - t.equal('31.8804', svgElement.getElementById('grad_5-.75,0,-0.20096189432334202,0.75,0,0').attributes.cy.value); - t.equal('30.9233', svgElement.getElementById('grad_5-.75,0,-0.20096189432334202,0.75,0,0').attributes.r.value); - - t.end(); -}); - -test('focalRadialGradientTransform', t => { - const svgString = - ` - - - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'focalRadialGradientTransform'); - t.equal('49.5773', svgElement.getElementById('grad_6-.75,0,-0.20096189432334202,0.75,0,0').attributes.cx.value); - t.equal('31.8804', svgElement.getElementById('grad_6-.75,0,-0.20096189432334202,0.75,0,0').attributes.cy.value); - t.equal('30.9233', svgElement.getElementById('grad_6-.75,0,-0.20096189432334202,0.75,0,0').attributes.r.value); - t.equal('60.896', svgElement.getElementById('grad_6-.75,0,-0.20096189432334202,0.75,0,0').attributes.fx.value); - t.equal('47.342', svgElement.getElementById('grad_6-.75,0,-0.20096189432334202,0.75,0,0').attributes.fy.value); - - t.end(); -}); - -test('percentRadialGradientTransform', t => { - const svgString = - ` - - - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'percentRadialGradientTransform'); - t.equal('50.7905', svgElement.getElementById('grad_7-.75,0,-0.20096189432334202,0.75,0,0').attributes.cx.value); - t.equal('50.4343', svgElement.getElementById('grad_7-.75,0,-0.20096189432334202,0.75,0,0').attributes.cy.value); - t.equal('30.9233', svgElement.getElementById('grad_7-.75,0,-0.20096189432334202,0.75,0,0').attributes.r.value); - t.equal('59.2389', svgElement.getElementById('grad_7-.75,0,-0.20096189432334202,0.75,0,0').attributes.fx.value); - t.equal('53.5267', svgElement.getElementById('grad_7-.75,0,-0.20096189432334202,0.75,0,0').attributes.fy.value); - - t.end(); -}); - -test('userSpaceRadialGradientTransform', t => { - const svgString = - ` - - - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, trickyBoundsPathBounds); - comparisonFileAppend(svgString, svgElement, 'userSpaceRadialGradientTransform'); - t.equal('47.9423', svgElement.getElementById('grad_8-.75,0,-0.20096189432334202,0.75,0,0').attributes.cx.value); - t.equal('45', svgElement.getElementById('grad_8-.75,0,-0.20096189432334202,0.75,0,0').attributes.cy.value); - t.equal('7.5', svgElement.getElementById('grad_8-.75,0,-0.20096189432334202,0.75,0,0').attributes.r.value); - - t.end(); -}); - -test('blackFillsBugFix', t => { - const svgString = - ` - - - - - - `; - const svgElement = parser.parseFromString(svgString, 'text/xml').documentElement; - transformStrokeWidths(svgElement, window, - { - height: 12.5, - width: 24.020904541015625, - x: 0.9896308183670044, - y: 0.75 - }); - comparisonFileAppend(svgString, svgElement, 'blackFillsBugFix'); - t.equal('none', svgElement.getElementById('Shape').attributes.fill.value); - t.equal('5', svgElement.getElementById('Shape').attributes['stroke-width'].value); - - t.end(); -}); - -outputComparisonFile(); diff --git a/packages/svg-renderer/tsconfig.json b/packages/svg-renderer/tsconfig.json deleted file mode 100644 index 726e69b0c..000000000 --- a/packages/svg-renderer/tsconfig.json +++ /dev/null @@ -1,111 +0,0 @@ -{ - "include": [ - "./src/**/*" - ], - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "ES2018", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./src/", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist/types/", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/packages/svg-renderer/tsconfig.node.json b/packages/svg-renderer/tsconfig.node.json deleted file mode 100644 index 797356130..000000000 --- a/packages/svg-renderer/tsconfig.node.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig", - "compilerOptions": { - "outDir": "./dist/node/", - "declaration": false, - "sourceMap": false - } -} diff --git a/packages/svg-renderer/webpack.config.js b/packages/svg-renderer/webpack.config.js deleted file mode 100644 index 62beed858..000000000 --- a/packages/svg-renderer/webpack.config.js +++ /dev/null @@ -1,90 +0,0 @@ -const {IgnorePlugin} = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const TerserPlugin = require('terser-webpack-plugin'); -const defaultsDeep = require('lodash.defaultsdeep'); -const path = require('path'); - -const base = { - mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', - devServer: { - contentBase: false, - host: '0.0.0.0', - port: process.env.PORT || 8576 - }, - resolve: { - extensions: ['.ts', '.js'] - }, - devtool: 'cheap-module-source-map', - entry: { - 'scratch-svg-renderer': './src/index.ts' - }, - module: { - rules: [{ - include: [ - path.resolve('node_modules', 'scratch-render-fonts'), - path.resolve(__dirname, 'src') - ], - test: /\.[jt]s$/, - loader: 'babel-loader', - options: { - presets: [ - ['@babel/preset-env', { - targets: { - browsers: ['last 3 versions', 'Safari >= 8', 'iOS >= 8'] - } - }], - '@babel/preset-typescript' - ] - } - }] - }, - optimization: { - minimizer: [ - new TerserPlugin({ - include: /\.js$/ - }) - ] - }, - plugins: [ - new IgnorePlugin({ - resourceRegExp: /canvas/, - contextRegExp: /jsdom$/ - }) - ] -}; - -module.exports = [ - defaultsDeep({}, base, { - target: 'web', - output: { - library: { - name: 'ScratchSVGRenderer', - type: 'umd' - }, - path: path.resolve('playground'), - publicPath: '/', - filename: '[name].js' - }, - plugins: base.plugins.concat([ - new CopyWebpackPlugin({ - patterns: [{ - from: 'src/playground' - }] - }) - ]) - }), - defaultsDeep({}, base, { - target: 'web', - output: { - library: { - name: 'ScratchSVGRenderer', - type: 'umd' - }, - path: path.resolve('dist', 'web'), - filename: '[name].js' - }, - optimization: { - minimize: process.env.NODE_ENV === 'production' - } - }) -]; diff --git a/packages/vm/package.json b/packages/vm/package.json index 6cd7e701f..c0fa30a8b 100644 --- a/packages/vm/package.json +++ b/packages/vm/package.json @@ -34,11 +34,12 @@ }, "dependencies": { "@turbowarp/nanolog": "^1.0.1", - "@vernier/godirect": "1.5.0", + "@vernier/godirect": "1.8.3", "atob": "2.1.2", "btoa": "1.2.1", "canvas-toBlob": "1.0.0", "clipcc-parser": "workspace:~", + "clipcc-sb1-converter": "1.0.327", "decode-html": "2.0.0", "diff-match-patch": "1.0.4", "fastestsmallesttextencoderdecoder": "^1.0.22", @@ -46,11 +47,11 @@ "htmlparser2": "10.1.0", "immutable": "5.1.5", "jszip": "^3.10.1", - "scratch-sb1-converter": "1.0.324", + "node-polyfill-webpack-plugin": "^3.0.0", "scratch-translate-extension-languages": "1.0.7" }, "peerDependencies": { - "clipcc-svg-renderer": "^3.2.0" + "clipcc-svg-renderer": "2.5.49" }, "devDependencies": { "@babel/core": "7.29.0", @@ -69,8 +70,9 @@ "clipcc-block": "workspace:~", "clipcc-l10n": "workspace:~", "clipcc-render": "workspace:~", + "clipcc-render-fonts": "1.0.256", "clipcc-storage": "workspace:~", - "clipcc-svg-renderer": "workspace:~", + "clipcc-svg-renderer": "2.5.49", "codingclip-worker-loader": "^3.0.10", "copy-webpack-plugin": "^14.0.0", "eslint": "^9.39.2", @@ -84,8 +86,6 @@ "lodash.defaultsdeep": "4.6.1", "node-polyfill-webpack-plugin": "^3.0.0", "pngjs": "7.0.0", - "rule-inheritance-webpack-plugin": "^0.4.0", - "scratch-render-fonts": "1.0.252", "script-loader": "0.7.2", "stats.js": "0.17.0", "terser-webpack-plugin": "^5.3.17", diff --git a/packages/vm/src/extensions/scratch3_gdx_for/index.js b/packages/vm/src/extensions/scratch3_gdx_for/index.js index ec135a5aa..160e01d45 100644 --- a/packages/vm/src/extensions/scratch3_gdx_for/index.js +++ b/packages/vm/src/extensions/scratch3_gdx_for/index.js @@ -4,7 +4,7 @@ const log = require('../../util/log'); const formatMessage = require('format-message'); const MathUtil = require('../../util/math-util'); const BLE = require('../../io/ble'); -const godirect = require('@vernier/godirect/dist/godirect.min.umd.js'); +const godirect = require('@vernier/godirect'); const ScratchLinkDeviceAdapter = require('./scratch-link-device-adapter'); /** diff --git a/packages/vm/src/import/load-costume.js b/packages/vm/src/import/load-costume.js index af92b1a99..3ffcb2f27 100644 --- a/packages/vm/src/import/load-costume.js +++ b/packages/vm/src/import/load-costume.js @@ -10,7 +10,7 @@ const loadVector_ = function (costume, runtime, rotationCenter, optVersion) { // scratch-svg-renderer fixes syntax that causes loading issues, // and if optVersion is 2, fixes "quirks" associated with Scratch 2 SVGs, const fixedSvgString = serializeSvgToString(loadSvgString(svgString, true /* fromVersion2 */)); - + // If the string changed, put back into storage if (svgString !== fixedSvgString) { svgString = fixedSvgString; @@ -261,14 +261,14 @@ const handleCostumeLoadError = function (costume, runtime) { const AssetType = runtime.storage.AssetType; const isVector = costume.dataFormat === AssetType.ImageVector.runtimeFormat; - + // Use default asset if original fails to load costume.assetId = isVector ? runtime.storage.defaultAssetId.ImageVector : runtime.storage.defaultAssetId.ImageBitmap; costume.asset = runtime.storage.get(costume.assetId); costume.md5 = `${costume.assetId}.${costume.asset.dataFormat}`; - + const defaultCostumePromise = (isVector) ? loadVector_(costume, runtime) : loadBitmap_(costume, runtime); @@ -280,7 +280,7 @@ const handleCostumeLoadError = function (costume, runtime) { // Should be null if we got here because the costume was missing loadedCostume.broken.asset = oldAsset; loadedCostume.broken.dataFormat = oldDataFormat; - + loadedCostume.broken.rotationCenterX = oldRotationX; loadedCostume.broken.rotationCenterY = oldRotationY; loadedCostume.broken.bitmapResolution = oldBitmapResolution; @@ -322,7 +322,7 @@ const loadCostumeFromAsset = function (costume, runtime, optVersion) { .catch(error => { log.warn(`Error loading vector image: ${error}`); return handleCostumeLoadError(costume, runtime); - + }); } return loadBitmap_(costume, runtime, rotationCenter, optVersion) diff --git a/packages/vm/src/virtual-machine.js b/packages/vm/src/virtual-machine.js index 3e71ae2a1..83ad0e1fb 100644 --- a/packages/vm/src/virtual-machine.js +++ b/packages/vm/src/virtual-machine.js @@ -443,7 +443,7 @@ class VirtualMachine extends EventEmitter { }) .catch(error => { // eslint-disable-next-line global-require - const {SB1File, ValidationError} = require('scratch-sb1-converter'); + const {SB1File, ValidationError} = require('clipcc-sb1-converter'); try { const sb1 = new SB1File(input); diff --git a/packages/vm/webpack.config.js b/packages/vm/webpack.config.js index c5c9e2f89..50d4f7ead 100644 --- a/packages/vm/webpack.config.js +++ b/packages/vm/webpack.config.js @@ -14,6 +14,9 @@ const base = { filename: '[name].js' }, resolve: { + alias: { + 'text-encoding': 'fastestsmallesttextencoderdecoder' + }, extensions: ['.ts', '.js'] }, module: { @@ -50,12 +53,9 @@ const base = { ] }, plugins: [ - new RuleInheritancePlugin({ - packages: [ - path.resolve(__dirname, '../svg-renderer') - ] + new NodePolyfillPlugin({ + includeAliases: ['events', 'buffer'] }), - new NodePolyfillPlugin(), new webpack.DefinePlugin({ 'clipcc.VERSION': version, 'clipcc.BUILD_TIME': Date.now() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 937c97e90..849576256 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -176,7 +176,7 @@ importers: version: 5.105.4(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) webpack-dev-server: specifier: ^5.2.3 version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -217,23 +217,23 @@ importers: specifier: workspace:~ version: link:../storage clipcc-svg-renderer: - specifier: workspace:~ - version: link:../svg-renderer + specifier: 2.5.49 + version: 2.5.49(clipcc-render-fonts@1.0.256) clipcc-vm: specifier: workspace:~ version: link:../vm computed-style-to-inline-style: specifier: 3.0.0 version: 3.0.0 - core-js: - specifier: 2.5.7 - version: 2.5.7 + copy-webpack-plugin: + specifier: ^14.0.0 + version: 14.0.0(webpack@5.105.4) + css-loader: + specifier: 6.7.3 + version: 6.7.3(webpack@5.105.4) dapjs: specifier: 2.3.0 version: 2.3.0 - es6-object-assign: - specifier: 1.1.0 - version: 1.1.0 fastestsmallesttextencoderdecoder: specifier: ^1.0.22 version: 1.0.22 @@ -246,9 +246,6 @@ importers: immutable: specifier: 5.1.5 version: 5.1.5 - intl: - specifier: 1.2.5 - version: 1.2.5 js-base64: specifier: 2.4.9 version: 2.4.9 @@ -330,9 +327,6 @@ importers: redux-throttle: specifier: 0.1.1 version: 0.1.1 - scratch-render-fonts: - specifier: 1.0.252 - version: 1.0.252 startaudiocontext: specifier: 1.2.1 version: 1.2.1 @@ -355,15 +349,6 @@ importers: '@babel/eslint-parser': specifier: 7.28.6 version: 7.28.6(@babel/core@7.29.0)(eslint@9.39.2(jiti@2.6.1)) - '@babel/plugin-proposal-object-rest-spread': - specifier: 7.14.7 - version: 7.14.7(@babel/core@7.29.0) - '@babel/plugin-syntax-dynamic-import': - specifier: 7.2.0 - version: 7.2.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': - specifier: 7.14.5 - version: 7.14.5(@babel/core@7.29.0) '@babel/preset-env': specifier: 7.29.2 version: 7.29.2(@babel/core@7.29.0) @@ -427,15 +412,12 @@ importers: chromedriver: specifier: 146.0.1 version: 146.0.1 - copy-webpack-plugin: - specifier: ^14.0.0 - version: 14.0.0(webpack@5.105.4) cross-fetch: specifier: ^3.1.8 version: 3.2.0(encoding@0.1.13) - css-loader: - specifier: 6.7.3 - version: 6.7.3(webpack@5.105.4) + css-minimizer-webpack-plugin: + specifier: ^8.0.0 + version: 8.0.0(webpack@5.105.4) enzyme: specifier: 3.11.0 version: 3.11.0 @@ -466,6 +448,24 @@ importers: html-webpack-plugin: specifier: ^5.6.6 version: 5.6.6(webpack@5.105.4) + image-minimizer-webpack-plugin: + specifier: ^5.0.0 + version: 5.0.0(imagemin@9.0.1)(webpack@5.105.4) + imagemin: + specifier: ^9.0.1 + version: 9.0.1 + imagemin-gifsicle: + specifier: ^7.0.0 + version: 7.0.0 + imagemin-jpegtran: + specifier: ^8.0.0 + version: 8.0.0 + imagemin-optipng: + specifier: ^8.0.0 + version: 8.0.0 + imagemin-svgo: + specifier: ^12.0.0 + version: 12.0.0 jest: specifier: 'catalog:' version: 30.3.0(@types/node@25.5.2) @@ -502,9 +502,6 @@ importers: redux-mock-store: specifier: 1.5.3 version: 1.5.3 - regenerator-runtime: - specifier: 0.14.1 - version: 0.14.1 rimraf: specifier: 2.7.1 version: 2.7.1 @@ -526,9 +523,12 @@ importers: webpack: specifier: 'catalog:' version: 5.105.4(webpack-cli@6.0.1) + webpack-bundle-analyzer: + specifier: ^5.2.0 + version: 5.2.0 webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) webpack-dev-server: specifier: ^5.2.3 version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -550,15 +550,6 @@ importers: '@babel/node': specifier: 7.29.0 version: 7.29.0(@babel/core@7.29.0) - '@babel/plugin-proposal-object-rest-spread': - specifier: ^7.0.0 - version: 7.14.7(@babel/core@7.29.0) - '@babel/plugin-syntax-dynamic-import': - specifier: ^7.0.0 - version: 7.2.0(@babel/core@7.29.0) - '@babel/plugin-transform-async-to-generator': - specifier: ^7.1.0 - version: 7.14.5(@babel/core@7.29.0) '@babel/preset-env': specifier: ^7.29.2 version: 7.29.2(@babel/core@7.29.0) @@ -693,9 +684,6 @@ importers: '@babel/eslint-parser': specifier: 7.28.6 version: 7.28.6(@babel/core@7.29.0)(eslint@9.39.2(jiti@2.6.1)) - '@babel/plugin-proposal-object-rest-spread': - specifier: 7.14.7 - version: 7.14.7(@babel/core@7.29.0) '@babel/preset-env': specifier: 7.29.2 version: 7.29.2(@babel/core@7.29.0) @@ -723,6 +711,9 @@ importers: clipcc-l10n: specifier: workspace:~ version: link:../l10n + clipcc-render-fonts: + specifier: 1.0.256 + version: 1.0.256 css-loader: specifier: ^6.7.3 version: 6.7.3(webpack@5.105.4) @@ -816,15 +807,9 @@ importers: redux-throttle: specifier: 0.1.1 version: 0.1.1 - regenerator-runtime: - specifier: 0.14.1 - version: 0.14.1 rimraf: specifier: 2.7.1 version: 2.7.1 - scratch-render-fonts: - specifier: 1.0.252 - version: 1.0.252 style-loader: specifier: ^4.0.0 version: 4.0.0(webpack@5.105.4) @@ -836,7 +821,7 @@ importers: version: 5.105.4(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) webpack-dev-server: specifier: ^5.2.3 version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -881,8 +866,8 @@ importers: specifier: workspace:~ version: link:../storage clipcc-svg-renderer: - specifier: workspace:~ - version: link:../svg-renderer + specifier: 2.5.49 + version: 2.5.49(clipcc-render-fonts@1.0.256) grapheme-breaker: specifier: 0.3.2 version: 0.3.2 @@ -920,6 +905,9 @@ importers: babel-loader: specifier: ^10.1.1 version: 10.1.1(@babel/core@7.29.0)(webpack@5.105.4) + clipcc-render-fonts: + specifier: 1.0.256 + version: 1.0.256 copy-webpack-plugin: specifier: ^14.0.0 version: 14.0.0(webpack@5.105.4) @@ -941,21 +929,12 @@ importers: playwright-chromium: specifier: 1.13.0 version: 1.13.0 - rule-inheritance-webpack-plugin: - specifier: ^0.4.0 - version: 0.4.0(webpack@5.105.4) - scratch-render-fonts: - specifier: 1.0.252 - version: 1.0.252 tap: specifier: 21.0.1 version: 21.0.1(@types/node@25.5.2)(react-dom@16.4.0(react@18.3.1))(react@18.3.1)(typescript@5.9.3) terser-webpack-plugin: specifier: ^5.3.17 version: 5.3.17(webpack@5.105.4) - travis-after-all: - specifier: 1.4.5 - version: 1.4.5 typescript: specifier: 'catalog:' version: 5.9.3 @@ -964,7 +943,7 @@ importers: version: 5.105.4(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) webpack-dev-server: specifier: ^5.2.3 version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -993,9 +972,6 @@ importers: '@babel/core': specifier: 7.29.0 version: 7.29.0 - '@babel/plugin-transform-runtime': - specifier: 7.29.0 - version: 7.29.0(@babel/core@7.29.0) '@babel/polyfill': specifier: 7.12.1 version: 7.12.1 @@ -1044,6 +1020,9 @@ importers: rimraf: specifier: 6.0.1 version: 6.0.1 + terser-webpack-plugin: + specifier: ^5.3.17 + version: 5.3.17(webpack@5.105.4) ts-jest: specifier: ^29.4.5 version: 29.4.6(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.2))(typescript@5.9.3) @@ -1060,117 +1039,14 @@ importers: specifier: 6.0.1 version: 6.0.1(webpack@5.105.4) - packages/svg-renderer: - dependencies: - '@turbowarp/nanolog': - specifier: ^1.0.1 - version: 1.0.1 - base64-js: - specifier: ^1.5.1 - version: 1.5.1 - css-tree: - specifier: ^1.1.3 - version: 1.1.3 - fastestsmallesttextencoderdecoder: - specifier: ^1.0.22 - version: 1.0.22 - isomorphic-dompurify: - specifier: ^2.14.0 - version: 2.36.0 - transformation-matrix: - specifier: ^2.16.1 - version: 2.16.1 - devDependencies: - '@babel/cli': - specifier: 7.28.6 - version: 7.28.6(@babel/core@7.29.0) - '@babel/core': - specifier: 7.29.0 - version: 7.29.0 - '@babel/eslint-parser': - specifier: 7.28.6 - version: 7.28.6(@babel/core@7.29.0)(eslint@9.39.2(jiti@2.6.1)) - '@babel/preset-env': - specifier: 7.29.2 - version: 7.29.2(@babel/core@7.29.0) - '@babel/preset-typescript': - specifier: ^7.28.5 - version: 7.28.5(@babel/core@7.29.0) - '@types/css-tree': - specifier: ^2.3.8 - version: 2.3.11 - '@types/jsdom': - specifier: ^28.0.0 - version: 28.0.0 - '@xmldom/xmldom': - specifier: 0.8.11 - version: 0.8.11 - babel-core: - specifier: 7.0.0-bridge.0 - version: 7.0.0-bridge.0(@babel/core@7.29.0) - babel-loader: - specifier: ^10.1.1 - version: 10.1.1(@babel/core@7.29.0)(webpack@5.105.4) - base64-loader: - specifier: ^1.0.0 - version: 1.0.0 - copy-webpack-plugin: - specifier: ^14.0.0 - version: 14.0.0(webpack@5.105.4) - eslint: - specifier: ^9.39.2 - version: 9.39.2(jiti@2.6.1) - eslint-config-clipcc: - specifier: workspace:* - version: link:../lint-config - eslint-plugin-import: - specifier: 2.29.1 - version: 2.29.1(eslint@9.39.2(jiti@2.6.1)) - globals: - specifier: ^16.5.0 - version: 16.5.0 - jsdom: - specifier: 28.1.0 - version: 28.1.0 - json: - specifier: 9.0.6 - version: 9.0.6 - mkdirp: - specifier: 3.0.1 - version: 3.0.1 - rimraf: - specifier: 3.0.2 - version: 3.0.2 - scratch-render-fonts: - specifier: 1.0.252 - version: 1.0.252 - tap: - specifier: 21.0.1 - version: 21.0.1(@types/node@25.5.2)(react-dom@16.4.0(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - terser-webpack-plugin: - specifier: ^5.3.17 - version: 5.3.17(webpack@5.105.4) - typescript: - specifier: 'catalog:' - version: 5.9.3 - webpack: - specifier: 'catalog:' - version: 5.105.4(webpack-cli@6.0.1) - webpack-cli: - specifier: 6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) - webpack-dev-server: - specifier: 5.2.3 - version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) - packages/vm: dependencies: '@turbowarp/nanolog': specifier: ^1.0.1 version: 1.0.1 '@vernier/godirect': - specifier: 1.5.0 - version: 1.5.0 + specifier: 1.8.3 + version: 1.8.3 atob: specifier: 2.1.2 version: 2.1.2 @@ -1183,6 +1059,9 @@ importers: clipcc-parser: specifier: workspace:~ version: link:../parser + clipcc-sb1-converter: + specifier: 1.0.327 + version: 1.0.327 decode-html: specifier: 2.0.0 version: 2.0.0 @@ -1204,9 +1083,9 @@ importers: jszip: specifier: ^3.10.1 version: 3.10.1 - scratch-sb1-converter: - specifier: 1.0.324 - version: 1.0.324 + node-polyfill-webpack-plugin: + specifier: ^3.0.0 + version: 3.0.0(webpack@5.105.4) scratch-translate-extension-languages: specifier: 1.0.7 version: 1.0.7 @@ -1259,12 +1138,15 @@ importers: clipcc-render: specifier: workspace:~ version: link:../render + clipcc-render-fonts: + specifier: 1.0.256 + version: 1.0.256 clipcc-storage: specifier: workspace:~ version: link:../storage clipcc-svg-renderer: - specifier: workspace:~ - version: link:../svg-renderer + specifier: 2.5.49 + version: 2.5.49(clipcc-render-fonts@1.0.256) codingclip-worker-loader: specifier: ^3.0.10 version: 3.0.10(webpack@5.105.4) @@ -1298,18 +1180,9 @@ importers: lodash.defaultsdeep: specifier: 4.6.1 version: 4.6.1 - node-polyfill-webpack-plugin: - specifier: ^3.0.0 - version: 3.0.0(webpack@5.105.4) pngjs: specifier: 7.0.0 version: 7.0.0 - rule-inheritance-webpack-plugin: - specifier: ^0.4.0 - version: 0.4.0(webpack@5.105.4) - scratch-render-fonts: - specifier: 1.0.252 - version: 1.0.252 script-loader: specifier: 0.7.2 version: 0.7.2 @@ -1330,7 +1203,7 @@ importers: version: 5.105.4(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) webpack-dev-server: specifier: ^5.2.3 version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -1407,11 +1280,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.7': - resolution: {integrity: sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-define-polyfill-provider@0.6.8': resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} peerDependencies: @@ -1521,13 +1389,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-proposal-object-rest-spread@7.14.7': - resolution: {integrity: sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -1555,11 +1416,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-dynamic-import@7.2.0': - resolution: {integrity: sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.28.6': resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} @@ -1654,12 +1510,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.14.5': - resolution: {integrity: sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.28.6': resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} engines: {node: '>=6.9.0'} @@ -1924,12 +1774,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-runtime@7.29.0': - resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} @@ -2049,6 +1893,9 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@bramus/specificity@2.4.2': resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true @@ -2256,6 +2103,10 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + '@discoveryjs/json-ext@0.6.3': resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} engines: {node: '>=14.17.0'} @@ -2335,6 +2186,9 @@ packages: '@noble/hashes': optional: true + '@file-type/xml@0.4.4': + resolution: {integrity: sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==} + '@formatjs/ecma402-abstract@1.5.0': resolution: {integrity: sha512-wXv36yo+mfWllweN0Fq7sUs7PUiNopn7I0JpLTe3hGu6ZMR4CV7LqK1llhB18pndwpKoafQKb1et2DCJAOW20Q==} @@ -2783,6 +2637,9 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2790,6 +2647,9 @@ packages: resolution: {integrity: sha512-I3BZNrHeaQJt2H6TD7HGsuBKJPDDF/BIDOaRvnN7Gj/QBRvpSaRK8JAmzcrRHZ+AqNtKrG50eOkS/acMjTw3rw==} engines: {node: '>=8.0.0'} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sigstore/bundle@2.3.2': resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -2832,6 +2692,22 @@ packages: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} + '@sindresorhus/is@0.7.0': + resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} + engines: {node: '>=4'} + + '@sindresorhus/is@6.3.1': + resolution: {integrity: sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==} + engines: {node: '>=16'} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -2980,6 +2856,9 @@ packages: '@testim/chrome-version@1.1.4': resolution: {integrity: sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==} + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -3033,9 +2912,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/css-tree@2.3.11': - resolution: {integrity: sha512-aEokibJOI77uIlqoBOkVbaQGC9zII0A+JH1kcTNKW2CwyYWD8KM6qdo+4c77wD3wZOQfJuNWAr9M4hdk+YhDIg==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -3084,9 +2960,6 @@ packages: '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - '@types/jsdom@28.0.0': - resolution: {integrity: sha512-A8TBQQC/xAOojy9kM8E46cqT00sF0h7dWjV8t8BJhUi2rG6JRh7XXQo/oLoENuZIQEpXsxLccLCnknyQd7qssQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3096,6 +2969,9 @@ packages: '@types/keymirror@0.1.4': resolution: {integrity: sha512-EPlgLrh8Z9OLtGmJRqRIar19Apg7a7xLckaOs16WGraEUuEM4sVdoKBA9MOIQsSbrW+yH1F4QD7WpIlCIy0V0A==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/lodash.bindall@4.4.9': resolution: {integrity: sha512-sG6V5+T3JcB39nXfORM+kHRH6DiCB+95DfGrH2YpPMXRpt6q3rn7VrW3dItiOLasJYeHq1jxc+tOW1ijT+d1wg==} @@ -3144,6 +3020,9 @@ packages: '@types/react@16.1.0': resolution: {integrity: sha512-gXrB20mWBLrYGtkdf5fA6wL3FEXpY2Nz8OOgVn1qonp66JE4mqFXUigKD8CVDofQu+EsSy8G4UFRJAshFWMOvA==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} @@ -3384,6 +3263,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -3480,8 +3360,8 @@ packages: cpu: [x64] os: [win32] - '@vernier/godirect@1.5.0': - resolution: {integrity: sha512-vMS0fQubI3WSSLg1Ry3aey/qWCl9XoCsFzgwOWYkeJs45YxjPel+42pLh5pO7uP6oF47sjZUKx8kGOoTiiiirA==} + '@vernier/godirect@1.8.3': + resolution: {integrity: sha512-poS0LZ3jAjH36gIAI0aNBBdsGGbmt11VFbLO+eGDJ/JDSPtMu1iUStvOi0UM/ZH6Jyh34SjVd8Cnxu/Wmcb8iQ==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -3553,11 +3433,6 @@ packages: webpack-dev-server: optional: true - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} - engines: {node: '>=10.0.0'} - deprecated: this version has critical issues, please update to the latest version - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -3711,6 +3586,13 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + archive-type@4.0.0: + resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==} + engines: {node: '>=4'} + are-docs-informative@0.0.2: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} @@ -3932,31 +3814,16 @@ packages: resolution: {integrity: sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - babel-plugin-polyfill-corejs2@0.4.16: - resolution: {integrity: sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.14.2: resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.7: - resolution: {integrity: sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.8: resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} peerDependencies: @@ -4057,6 +3924,26 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + bin-build@3.0.0: + resolution: {integrity: sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==} + engines: {node: '>=4'} + + bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + + bin-version-check@4.0.0: + resolution: {integrity: sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==} + engines: {node: '>=6'} + + bin-version@3.1.0: + resolution: {integrity: sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==} + engines: {node: '>=6'} + + bin-wrapper@4.1.0: + resolution: {integrity: sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==} + engines: {node: '>=6'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -4149,6 +4036,12 @@ packages: engines: {node: '>= 0.4.0'} hasBin: true + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -4156,12 +4049,18 @@ packages: resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} engines: {node: '>=0.4.0'} + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4194,6 +4093,9 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacheable-request@2.1.4: + resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4213,6 +4115,10 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + callsites@4.2.0: + resolution: {integrity: sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==} + engines: {node: '>=12.20'} + camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} @@ -4224,12 +4130,19 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + caniuse-lite@1.0.30001777: resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} canvas-toBlob@1.0.0: resolution: {integrity: sha512-oU5bawygt/Nef9F+C49eTFmzXzz6yKdGqn6J1wn/LZQF5ulnnZVm0KIZzik85I6tjCbZFH6aa47j4bU2tkHxRw==} + caw@2.0.1: + resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} + engines: {node: '>=4'} + chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -4246,6 +4159,10 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-file-extension@0.1.1: + resolution: {integrity: sha512-lB0j9teu8JtDPDHRfU8pNH33w4wMu5bOaKoT4PxH+AKugBrIfpiJMTTKIm0TErNeJPkeQEgvH31YpccTwOKPRg==} + engines: {node: '>=18'} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4338,6 +4255,17 @@ packages: resolution: {integrity: sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==} engines: {node: '>=0.2.5'} + clipcc-render-fonts@1.0.256: + resolution: {integrity: sha512-BUkYYtOs7Qo5biLgsFugxr0rzhDquC4q2wuraGCp7vl/6m6Vx9fg9gY5raKJz/+XSeBgj3Q7czV5FsrF8Z3mGg==} + + clipcc-sb1-converter@1.0.327: + resolution: {integrity: sha512-OnmnpRWKImSKTA28gfxkdFVkZnGECFxGOJIFS0u3GJngG+QWTGYajA8J9eeRie9uXghj7QjRRdW818pNczofmg==} + + clipcc-svg-renderer@2.5.49: + resolution: {integrity: sha512-O9tBPOcuk3B6Srgrpr0G2UmHNhexxtLlprDC1DmT1542kqtZvLYJDNtf3HrTR2OwmaiWo/t3qCvYlJXrGiVvtg==} + peerDependencies: + clipcc-render-fonts: ^1.0.256 + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4346,6 +4274,9 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} + clone-response@1.0.2: + resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -4379,6 +4310,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -4394,6 +4328,10 @@ packages: resolution: {integrity: sha512-T6PB6vdFrwnHXg/I0kivM3DqaCGZLjjYSOe0a5WgFKcz1sOnmOeIjnhQPXVXX3QjVbLyTJ85lJkX6lUpukTzaA==} engines: {node: '>=6'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -4409,6 +4347,10 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -4450,6 +4392,9 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} @@ -4480,6 +4425,10 @@ packages: engines: {node: '>=18'} hasBin: true + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -4510,16 +4459,12 @@ packages: resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@2.5.7: - resolution: {integrity: sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@3.48.0: - resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} + core-js@3.49.0: + resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4570,6 +4515,9 @@ packages: cross-fetch@4.1.0: resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -4582,6 +4530,12 @@ packages: resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} engines: {node: '>= 0.10'} + css-declaration-sorter@7.3.1: + resolution: {integrity: sha512-gz6x+KkgNCjxq3Var03pRYLhyNfwhkKF1g/yoLgDNtFvVu0/fOLV9C8fFEZRjACp/XQLumjAYo7JVjzH3wLbxA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + css-loader@6.7.3: resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} @@ -4591,6 +4545,31 @@ packages: css-mediaquery@0.1.2: resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==} + css-minimizer-webpack-plugin@8.0.0: + resolution: {integrity: sha512-9bEpzHs8gEq6/cbEj418jXL/YWjBUD2YTLLk905Npt2JODqnRITin0+So5Vx4Dp5vyi2Lpt9pp2QHzQ7fdxNrw==} + engines: {node: '>= 20.9.0'} + peerDependencies: + '@parcel/css': '*' + '@swc/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + lightningcss: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + '@swc/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + lightningcss: + optional: true + css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -4601,6 +4580,10 @@ packages: resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} engines: {node: '>=8.0.0'} + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -4620,6 +4603,28 @@ packages: cssfontparser@1.2.1: resolution: {integrity: sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==} + cssnano-preset-default@7.0.11: + resolution: {integrity: sha512-waWlAMuCakP7//UCY+JPrQS1z0OSLeOXk2sKWJximKWGupVxre50bzPlvpbUwZIDylhf/ptf0Pk+Yf7C+hoa3g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + cssnano@7.1.3: + resolution: {integrity: sha512-mLFHQAzyapMVFLiJIn7Ef4C2UCEvtlTlbyILR6B5ZsUAV3D/Pa761R5uC1YPhyBkRd3eqaDm2ncaNrD7R4mTRg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@4.6.0: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} @@ -4663,6 +4668,9 @@ packages: date-now@0.1.4: resolution: {integrity: sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==} + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4707,6 +4715,30 @@ packages: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -4882,6 +4914,18 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dot-prop@8.0.2: + resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} + engines: {node: '>=16'} + + download@6.2.5: + resolution: {integrity: sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==} + engines: {node: '>=4'} + + download@7.1.0: + resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==} + engines: {node: '>=6'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4889,6 +4933,9 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5049,9 +5096,6 @@ packages: es-toolkit@1.45.1: resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} - es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5133,22 +5177,12 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true @@ -5314,10 +5348,30 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + exec-buffer@3.2.0: + resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==} + engines: {node: '>=4'} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + + execa@1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + exenv@1.2.2: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} @@ -5352,6 +5406,14 @@ packages: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -5378,6 +5440,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-equals@5.4.0: + resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} + engines: {node: '>=6.0.0'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -5431,6 +5497,10 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@5.0.1: resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} engines: {node: '>=4'} @@ -5439,10 +5509,46 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-type@10.11.0: + resolution: {integrity: sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==} + engines: {node: '>=6'} + + file-type@19.6.0: + resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} + engines: {node: '>=18'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@4.4.0: + resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==} + engines: {node: '>=4'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + file-type@8.1.0: + resolution: {integrity: sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==} + engines: {node: '>=6'} + filename-regex@2.0.1: resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} engines: {node: '>=0.10.0'} + filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + filenamify@2.1.0: + resolution: {integrity: sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==} + engines: {node: '>=4'} + fill-range@2.2.4: resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} engines: {node: '>=0.10.0'} @@ -5482,6 +5588,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-versions@3.2.0: + resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==} + engines: {node: '>=6'} + findup@0.1.5: resolution: {integrity: sha512-Udxo3C9A6alt2GZ2MNsgnIvX7De0V3VGxeP/x98NSVgSlizcDHdmJza61LI7zJy4OEtSiJyE72s0/+tBl5/ZxA==} engines: {node: '>=0.6'} @@ -5590,6 +5700,9 @@ packages: fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -5623,6 +5736,10 @@ packages: function-loop@4.0.0: resolution: {integrity: sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -5664,6 +5781,22 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-proxy@2.1.0: + resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==} + engines: {node: '>=4'} + + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + + get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -5672,6 +5805,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5683,6 +5820,11 @@ packages: get-user-media-promise@1.1.4: resolution: {integrity: sha512-k49YuV2z0d3gKHLPTFKYfzEA9kduuQk7YBf8ev2dxrKk+DhMyuzfQnK9ZSxkEhE/jv3BZY62M0eICWa7lak9nw==} + gifsicle@5.3.0: + resolution: {integrity: sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==} + engines: {node: '>=10'} + hasBin: true + git-raw-commits@5.0.1: resolution: {integrity: sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==} engines: {node: '>=18'} @@ -5769,10 +5911,22 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@7.1.0: + resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==} + engines: {node: '>=4'} + + got@8.3.2: + resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} + engines: {node: '>=4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5813,10 +5967,16 @@ packages: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} + has-symbol-support-x@1.4.2: + resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} + has-to-string-tag-x@1.4.1: + resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==} + has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} @@ -5917,6 +6077,9 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + http-cache-semantics@3.8.1: + resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -5974,6 +6137,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} @@ -6004,6 +6171,10 @@ packages: peerDependencies: postcss: ^8.1.0 + identifier-regex@1.0.1: + resolution: {integrity: sha512-ZrYyM0sozNPZlvBvE7Oq9Bn44n0qKGrYu5sQ0JzMUnjIhpgWYE2JB6aBoFwEYdPjqj7jPyxXTMJiHDOxDfd8yw==} + engines: {node: '>=18'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -6026,6 +6197,50 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + image-dimensions@2.5.0: + resolution: {integrity: sha512-CKZPHjAEtSg9lBV9eER0bhNn/yrY7cFEQEhkwjLhqLY+Na8lcP1pEyWsaGMGc8t2qbKWA/tuqbhFQpOKGN72Yw==} + engines: {node: '>=18'} + hasBin: true + + image-minimizer-webpack-plugin@5.0.0: + resolution: {integrity: sha512-TSeES2mTBY1smDnQRIaTGR9EdS1xGvWsaMu+XJRlh6z7VAWHmyYR6P5AynvVHMcmK4NdvmSlRJTNWgvpeNSPuA==} + engines: {node: '>= 20.9.0'} + peerDependencies: + '@squoosh/lib': '*' + imagemin: '*' + sharp: '*' + svgo: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@squoosh/lib': + optional: true + imagemin: + optional: true + sharp: + optional: true + svgo: + optional: true + + imagemin-gifsicle@7.0.0: + resolution: {integrity: sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==} + engines: {node: '>=10'} + + imagemin-jpegtran@8.0.0: + resolution: {integrity: sha512-iGaaImltX4oJ1lmS9jb7Qw3NRusQnVBr7hYJuhyL0CHRV42pDMkIGBVCHKA9j9mcWHnO5Ryu3LV7t4fU4sC4xg==} + engines: {node: '>=18'} + + imagemin-optipng@8.0.0: + resolution: {integrity: sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==} + engines: {node: '>=10'} + + imagemin-svgo@12.0.0: + resolution: {integrity: sha512-6f2bS/QTBsGafHCvG3FPxe3efHWq7EryznpDPg1PnfhnD4JO90sKrzW4W4AcN2HoWBsZl4yqiBWw/qxIWiPHJA==} + engines: {node: '>=20'} + + imagemin@9.0.1: + resolution: {integrity: sha512-UoHOfynN8QeqRoUGunn6ilMnLpJ+utbmleP2ufcFqaGal8mY/PeOpV43N31uqtb+CBMFqQ7hxgKzIaAAnmcrdA==} + engines: {node: '>=18'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -6036,6 +6251,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-lazy@3.1.0: + resolution: {integrity: sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==} + engines: {node: '>=6'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -6067,6 +6286,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6126,8 +6348,9 @@ packages: resolution: {integrity: sha512-4bV/7kSKaPEmu6ArxXf9xjv1ny74Zkwuey8Pm01NH4zggPP7JHwg2STk8Y3JdspCKRDriwIyLRfEXnj2ZLr4Bw==} deprecated: This package has been deprecated, please see migration guide at 'https://github.com/formatjs/formatjs/tree/master/packages/intl-relativeformat#migration-guide' - intl@1.2.5: - resolution: {integrity: sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==} + into-stream@3.1.0: + resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==} + engines: {node: '>=4'} invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -6257,6 +6480,10 @@ packages: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} + is-gif@3.0.0: + resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==} + engines: {node: '>=6'} + is-glob@2.0.1: resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} engines: {node: '>=0.10.0'} @@ -6265,6 +6492,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-identifier@1.0.1: + resolution: {integrity: sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==} + engines: {node: '>=18'} + is-in-browser@1.1.3: resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} @@ -6289,6 +6520,9 @@ packages: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -6317,6 +6551,13 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-object@1.0.2: + resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -6333,6 +6574,10 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-png@2.0.0: + resolution: {integrity: sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==} + engines: {node: '>=8'} + is-posix-bracket@0.1.1: resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} engines: {node: '>=0.10.0'} @@ -6348,6 +6593,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -6364,6 +6613,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -6375,6 +6628,10 @@ packages: is-subset@0.1.1: resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + is-svg@6.1.0: + resolution: {integrity: sha512-i7YPdvYuSCYcaLQrKwt8cvKTlwHcdA6Hp8N9SO3Q5jIzo8x6kH3N47W0BvPP7NdxVBmIHx7X9DK36czYYW7lHg==} + engines: {node: '>=20'} + is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} @@ -6383,6 +6640,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -6470,6 +6731,10 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} + isurl@1.0.0: + resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} + engines: {node: '>= 4'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -6675,6 +6940,11 @@ packages: jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + jpegtran-bin@7.0.0: + resolution: {integrity: sha512-8ecI4vXIV7eI2+nzRQsHAVaQVBGDotUY76CJZhlYaBAljBnK/509+sGGCs8eJyiS5N4tOcYZS+8Q4KgzorqlBA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + js-base64@2.4.9: resolution: {integrity: sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==} @@ -6737,6 +7007,9 @@ packages: resolution: {integrity: sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==} hasBin: true + json-buffer@3.0.0: + resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -6790,9 +7063,16 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + junk@4.0.1: + resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} + engines: {node: '>=12.20'} + keymirror@0.1.1: resolution: {integrity: sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg==} + keyv@3.0.0: + resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -6826,6 +7106,10 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + linebreak@0.3.0: resolution: {integrity: sha512-zt8pzlM3oq4moDN8U5mP1SbZ44yKV6dXCu44Ez6iTXmxUl8/jRFWeho2SDqL5YDBv0TBKPgU/XGovZwnXAKlOQ==} @@ -6929,6 +7213,9 @@ packages: lodash.unescape@4.0.1: resolution: {integrity: sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==} + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} @@ -6945,6 +7232,14 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lowercase-keys@1.0.0: + resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==} + engines: {node: '>=0.10.0'} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -6952,6 +7247,9 @@ packages: resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6965,6 +7263,14 @@ packages: magic-string@0.22.5: resolution: {integrity: sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -7002,6 +7308,9 @@ packages: mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} @@ -7038,9 +7347,6 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - microee@0.0.6: - resolution: {integrity: sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==} - micromatch@2.3.11: resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} engines: {node: '>=0.10.0'} @@ -7083,12 +7389,13 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + min-document@2.19.2: resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} - minilog@3.1.0: - resolution: {integrity: sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -7176,6 +7483,10 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -7305,10 +7616,18 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + normalize-url@2.0.1: + resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} + engines: {node: '>=4'} + npm-bundled@3.0.1: resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-conf@1.1.3: + resolution: {integrity: sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==} + engines: {node: '>=4'} + npm-install-checks@6.3.0: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7336,10 +7655,18 @@ packages: resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -7439,9 +7766,18 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + optipng-bin@7.0.1: + resolution: {integrity: sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==} + engines: {node: '>=10'} + hasBin: true + os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -7449,14 +7785,46 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + ow@2.0.0: + resolution: {integrity: sha512-ESUigmGrdhUZ2nQSFNkeKSl6ZRPupXzprMs3yF9DYlNVpJ8XAjM/fI9RUZxA7PI1K9HQDCCvBo1jr/GEIo9joQ==} + engines: {node: '>=18'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-cancelable@0.3.0: + resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==} + engines: {node: '>=4'} + + p-cancelable@0.4.1: + resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==} + engines: {node: '>=4'} + + p-event@1.3.0: + resolution: {integrity: sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==} + engines: {node: '>=4'} + + p-event@2.3.1: + resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} + engines: {node: '>=6'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-is-promise@1.1.0: + resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==} + engines: {node: '>=4'} + p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} @@ -7489,6 +7857,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map-series@1.0.0: + resolution: {integrity: sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==} + engines: {node: '>=4'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -7497,14 +7869,34 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-pipe@4.0.0: + resolution: {integrity: sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w==} + engines: {node: '>=12'} + p-queue@3.0.0: resolution: {integrity: sha512-2tv/MRmPXfmfnjLLJAHl+DdU8p2DhZafAnlpm/C/T5BpF5L9wKz5tMin4A4N2zVpJL2YMhPlRmtO7s5EtNrjfA==} engines: {node: '>=6'} + p-reduce@1.0.0: + resolution: {integrity: sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==} + engines: {node: '>=4'} + p-retry@6.2.1: resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} engines: {node: '>=16.17'} + p-timeout@1.2.1: + resolution: {integrity: sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==} + engines: {node: '>=4'} + + p-timeout@2.0.1: + resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==} + engines: {node: '>=4'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -7573,6 +7965,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-passwd@1.0.0: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} @@ -7627,6 +8023,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -7649,10 +8049,18 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + pbkdf2@3.1.5: resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} engines: {node: '>= 0.10'} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} + engines: {node: '>=14.16'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -7677,6 +8085,10 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -7729,6 +8141,48 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + + postcss-colormin@7.0.6: + resolution: {integrity: sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-convert-values@7.0.9: + resolution: {integrity: sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-comments@7.0.6: + resolution: {integrity: sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-import@12.0.1: resolution: {integrity: sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==} engines: {node: '>=6.0.0'} @@ -7740,6 +8194,42 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-merge-rules@7.0.8: + resolution: {integrity: sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-gradients@7.0.1: + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-params@7.0.6: + resolution: {integrity: sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-minify-selectors@7.0.6: + resolution: {integrity: sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -7764,10 +8254,94 @@ packages: peerDependencies: postcss: ^8.1.0 + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-unicode@7.0.6: + resolution: {integrity: sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-initial@7.0.6: + resolution: {integrity: sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} + postcss-svgo@7.1.1: + resolution: {integrity: sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} + peerDependencies: + postcss: ^8.4.32 + + postcss-unique-selectors@7.0.5: + resolution: {integrity: sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + postcss-value-parser@3.3.1: resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} @@ -7790,6 +8364,14 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + + prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + preserve@0.2.0: resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} engines: {node: '>=0.10.0'} @@ -7814,6 +8396,10 @@ packages: resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + prismjs-terminal@1.2.4: resolution: {integrity: sha512-S2nsjy6s2x2jF4uTW8ulX19rvmRfe9R1wmnNwI5wmBgQEErB0vuKueVPMzN6KsFRCCJ2IQrWUS0BqhcNsrR9xg==} engines: {node: '>=16'} @@ -7870,6 +8456,9 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7884,6 +8473,9 @@ packages: proxy-from-env@2.0.0: resolution: {integrity: sha512-h2lD3OfRraP3R51rNFKIE8nX+qoLr1mE74X91YhVxtDbt+OD6ntoNZv56+JgI4RCdtwQ5eexsOk1KdOQDfvPCQ==} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} @@ -8275,6 +8867,9 @@ packages: engines: {node: '>= 0.4'} hasBin: true + responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -8400,18 +8995,16 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} - scratch-render-fonts@1.0.252: - resolution: {integrity: sha512-leYCgtHMIqy36KqjraAiwaPYc9Bjy2L8J+vZ/CEnUE2PVP3z0dDoA4akz42/hk44kpVDzD574Th3SANt+PlLVA==} - - scratch-sb1-converter@1.0.324: - resolution: {integrity: sha512-ZHIf2KCmYKchayLQFknni7QfXhOCI+w4Wq1wIQuN5D6xZwUyIe51/B4YO+pofOGr3tz4nnwQIjgs3AowdNKWDQ==} - scratch-translate-extension-languages@1.0.7: resolution: {integrity: sha512-6+bQU9iVYv23T8J0SjpV6MTugm0y8myh/4DPgu1BGfccysdkaWzu3MkNGQyQRUlbqAiW9wM7ctfv3USPEkzTgg==} script-loader@0.7.2: resolution: {integrity: sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==} + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -8423,6 +9016,14 @@ packages: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} + semver-regex@2.0.0: + resolution: {integrity: sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==} + engines: {node: '>=6'} + + semver-truncate@1.1.2: + resolution: {integrity: sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==} + engines: {node: '>=0.10.0'} + semver@5.5.0: resolution: {integrity: sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==} hasBin: true @@ -8542,6 +9143,10 @@ packages: resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} engines: {node: ^16.14.0 || >=18.0.0} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + slash@2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} @@ -8550,6 +9155,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + slice-ansi@2.1.0: resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} engines: {node: '>=6'} @@ -8577,6 +9186,18 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + + sort-keys@2.0.0: + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -8759,10 +9380,21 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@1.0.4: resolution: {integrity: sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==} engines: {node: '>=0.8.0'} @@ -8772,12 +9404,34 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + strtok3@9.1.1: + resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} + engines: {node: '>=16'} + style-loader@4.0.0: resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.27.0 + stylehacks@7.0.8: + resolution: {integrity: sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} + peerDependencies: + postcss: ^8.4.32 + + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -8798,6 +9452,11 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + symbol-observable@1.2.0: resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} engines: {node: '>=0.10.0'} @@ -8840,6 +9499,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -8856,6 +9519,14 @@ packages: tcp-port-used@1.0.2: resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} + temp-dir@1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + + tempfile@2.0.0: + resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} + engines: {node: '>=4'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -8892,10 +9563,6 @@ packages: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} - text-encoding@0.7.0: - resolution: {integrity: sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==} - deprecated: no longer maintained - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -8914,6 +9581,14 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + timers-browserify@2.0.12: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} @@ -8980,6 +9655,14 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@5.1.2: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} @@ -8999,13 +9682,8 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} - transformation-matrix@2.16.1: - resolution: {integrity: sha512-tdtC3wxVEuzU7X/ydL131Q3JU5cPMEn37oqVLITjRDSDsnSHVFzW2JiCLfZLIQEgWzZHdSy3J6bZzvKEN24jGA==} - - travis-after-all@1.4.5: - resolution: {integrity: sha512-4DztMw/2e+96IdRAa3+gRJvyuZwN0Sn4CMiVAkZ9zsP9fVSxb/oJ949UR2q8POL23qd5tDD+rMOlydJ9OKfHeQ==} - deprecated: 'The functionality this package provided is now supported natively by Travis CI via Build Stages (see: https://blog.travis-ci.com/2017-05-11-introducing-build-stages).' - hasBin: true + transformation-matrix@1.15.3: + resolution: {integrity: sha512-ThJH58GNFKhCw3gIoOtwf3tNwuYjbyEeiGdeq4mNMYWdJctnI896KUqn6PVt7jmNVepqa1bcKQtnMB1HtjsDMA==} tree-dump@1.1.0: resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} @@ -9013,6 +9691,10 @@ packages: peerDependencies: tslib: '2' + trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + trim-right@1.0.1: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} engines: {node: '>=0.10.0'} @@ -9103,6 +9785,9 @@ packages: resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} engines: {node: ^16.14.0 || >=18.0.0} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + twgl.js@4.24.0: resolution: {integrity: sha512-JGVTxuV9dqaBmajXyvuZIlhCHrTbIaoNjQvtdoLHyK74OtbmNwZUj6rfdp+pz9htitI/tVxiVQ2nuw+KmD29vg==} @@ -9126,6 +9811,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -9184,16 +9873,20 @@ packages: engines: {node: '>=0.8.0'} hasBin: true + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - undici-types@7.22.0: - resolution: {integrity: sha512-RKZvifiL60xdsIuC80UY0dq8Z7DbJUV8/l2hOVbyZAxBzEeQU4Z58+4ZzJ6WN2Lidi9KzT5EbiGX+PI/UGYuRw==} - undici@7.22.0: resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} engines: {node: '>=20.18.1'} @@ -9217,6 +9910,10 @@ packages: unicode-trie@0.3.1: resolution: {integrity: sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9245,6 +9942,18 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + + url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + + url-to-options@1.0.1: + resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==} + engines: {node: '>= 4'} + url@0.11.4: resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} engines: {node: '>= 0.4'} @@ -9262,6 +9971,11 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -9328,6 +10042,9 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -9339,6 +10056,11 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} + webpack-bundle-analyzer@5.2.0: + resolution: {integrity: sha512-Etrauj1wYO/xjiz/Vfd6bW1lG9fEhrJpNmu10tv0X9kv+gyY3qiE09uYepqg1Xd0PxOvllRXwWYWjtQYoO/glQ==} + engines: {node: '>= 20.9.0'} + hasBin: true + webpack-cli@6.0.1: resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} engines: {node: '>=18.12.0'} @@ -9552,6 +10274,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -9599,6 +10324,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} @@ -9727,17 +10456,6 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.7(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -9829,7 +10547,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/register': 7.28.6(@babel/core@7.29.0) commander: 6.2.1 - core-js: 3.48.0 + core-js: 3.49.0 node-environment-flags: 1.0.6 regenerator-runtime: 0.14.1 v8flags: 3.2.0 @@ -9873,15 +10591,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-object-rest-spread@7.14.7(@babel/core@7.29.0)': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -9906,11 +10615,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-dynamic-import@7.2.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -10001,15 +10705,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.14.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -10307,18 +11002,6 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.16(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.7(@babel/core@7.29.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -10532,6 +11215,8 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@borewit/text-codec@0.2.2': {} + '@bramus/specificity@2.4.2': dependencies: css-tree: 3.2.1 @@ -10856,6 +11541,8 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} + '@discoveryjs/json-ext@0.5.7': {} + '@discoveryjs/json-ext@0.6.3': {} '@emnapi/core@1.8.1': @@ -10944,6 +11631,11 @@ snapshots: '@exodus/bytes@1.15.0': {} + '@file-type/xml@0.4.4': + dependencies: + sax: 1.5.0 + strtok3: 10.3.4 + '@formatjs/ecma402-abstract@1.5.0': dependencies: tslib: 2.8.1 @@ -11628,10 +12320,14 @@ snapshots: '@pkgr/core@0.2.9': {} + '@polka/url@1.0.0-next.29': {} + '@rtsao/scc@1.1.0': {} '@scratch/paper@0.11.20221201200345': {} + '@sec-ant/readable-stream@0.4.1': {} + '@sigstore/bundle@2.3.2': dependencies: '@sigstore/protobuf-specs': 0.3.3 @@ -11676,6 +12372,14 @@ snapshots: '@sindresorhus/base62@1.0.0': {} + '@sindresorhus/is@0.7.0': {} + + '@sindresorhus/is@6.3.1': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -11945,6 +12649,8 @@ snapshots: '@testim/chrome-version@1.1.4': {} + '@tokenizer/token@0.3.0': {} + '@tootallnate/quickjs-emscripten@0.23.0': {} '@tsconfig/node14@14.1.8': {} @@ -12008,8 +12714,6 @@ snapshots: dependencies: '@types/node': 25.5.2 - '@types/css-tree@2.3.11': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -12074,19 +12778,16 @@ snapshots: '@types/tough-cookie': 4.0.5 parse5: 7.3.0 - '@types/jsdom@28.0.0': - dependencies: - '@types/node': 12.20.55 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - undici-types: 7.22.0 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} '@types/keymirror@0.1.4': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 25.5.2 + '@types/lodash.bindall@4.4.9': dependencies: '@types/lodash': 4.17.24 @@ -12136,6 +12837,10 @@ snapshots: '@types/react@16.1.0': {} + '@types/responselike@1.0.3': + dependencies: + '@types/node': 25.5.2 + '@types/retry@0.12.2': {} '@types/schema-utils@2.4.0': @@ -12503,7 +13208,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vernier/godirect@1.5.0': {} + '@vernier/godirect@1.8.3': {} '@webassemblyjs/ast@1.14.1': dependencies: @@ -12594,7 +13299,7 @@ snapshots: '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.4)': dependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) optionalDependencies: webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) @@ -12603,8 +13308,6 @@ snapshots: webpack: 5.105.4(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack@5.105.4) - '@xmldom/xmldom@0.8.11': {} - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -12742,6 +13445,12 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arch@2.2.0: {} + + archive-type@4.0.0: + dependencies: + file-type: 4.4.0 + are-docs-informative@0.0.2: {} arg@4.1.3: {} @@ -13051,15 +13760,6 @@ snapshots: dependencies: '@types/babel__core': 7.20.5 - babel-plugin-polyfill-corejs2@0.4.16(@babel/core@7.29.0): - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 @@ -13069,14 +13769,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) - core-js-compat: 3.49.0 - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -13085,13 +13777,6 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.7(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.7(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 @@ -13168,7 +13853,7 @@ snapshots: babel-runtime@6.26.0: dependencies: - core-js: 2.5.7 + core-js: 2.6.12 regenerator-runtime: 0.11.1 babel-template@6.26.0: @@ -13239,6 +13924,39 @@ snapshots: big.js@5.2.2: {} + bin-build@3.0.0: + dependencies: + decompress: 4.2.1 + download: 6.2.5 + execa: 0.7.0 + p-map-series: 1.0.0 + tempfile: 2.0.0 + + bin-check@4.1.0: + dependencies: + execa: 0.7.0 + executable: 4.1.1 + + bin-version-check@4.0.0: + dependencies: + bin-version: 3.1.0 + semver: 5.7.2 + semver-truncate: 1.1.2 + + bin-version@3.1.0: + dependencies: + execa: 1.0.0 + find-versions: 3.2.0 + + bin-wrapper@4.1.0: + dependencies: + bin-check: 4.1.0 + bin-version-check: 4.0.0 + download: 7.1.0 + import-lazy: 3.1.0 + os-filter-obj: 2.0.0 + pify: 4.0.1 + binary-extensions@2.3.0: {} bl@1.2.3: @@ -13379,14 +14097,28 @@ snapshots: btoa@1.2.1: {} + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + buffer-crc32@0.2.13: {} buffer-equal@0.0.1: {} + buffer-fill@1.0.0: {} + buffer-from@1.1.2: {} buffer-xor@1.0.3: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -13431,6 +14163,16 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + cacheable-request@2.1.4: + dependencies: + clone-response: 1.0.2 + get-stream: 3.0.0 + http-cache-semantics: 3.8.1 + keyv: 3.0.0 + lowercase-keys: 1.0.0 + normalize-url: 2.0.1 + responselike: 1.0.2 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13452,6 +14194,8 @@ snapshots: callsites@3.1.0: {} + callsites@4.2.0: {} + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 @@ -13461,10 +14205,24 @@ snapshots: camelcase@6.3.0: {} + caniuse-api@3.0.0: + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001777 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + caniuse-lite@1.0.30001777: {} canvas-toBlob@1.0.0: {} + caw@2.0.1: + dependencies: + get-proxy: 2.1.0 + isurl: 1.0.0 + tunnel-agent: 0.6.0 + url-to-options: 1.0.1 + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 @@ -13486,6 +14244,8 @@ snapshots: chalk@5.6.2: {} + change-file-extension@0.1.1: {} + char-regex@1.0.2: {} chardet@0.7.0: {} @@ -13588,6 +14348,31 @@ snapshots: exit: 0.1.2 glob: 7.2.3 + clipcc-render-fonts@1.0.256: + dependencies: + base64-loader: 1.0.0 + + clipcc-sb1-converter@1.0.327: + dependencies: + '@turbowarp/nanolog': 1.0.1 + fastestsmallesttextencoderdecoder: 1.0.22 + js-md5: 0.8.3 + + clipcc-svg-renderer@2.5.49(clipcc-render-fonts@1.0.256): + dependencies: + '@turbowarp/nanolog': 1.0.1 + base64-js: 1.5.1 + base64-loader: 1.0.0 + clipcc-render-fonts: 1.0.256 + css-tree: 1.1.3 + fastestsmallesttextencoderdecoder: 1.0.22 + isomorphic-dompurify: 2.36.0 + transformation-matrix: 1.15.3 + transitivePeerDependencies: + - '@noble/hashes' + - canvas + - supports-color + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -13600,6 +14385,10 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 + clone-response@1.0.2: + dependencies: + mimic-response: 1.0.1 + co@4.6.0: {} code-excerpt@4.0.0: @@ -13628,6 +14417,8 @@ snapshots: color-name@1.1.4: {} + colord@2.9.3: {} + colorette@2.0.20: {} colors@0.6.2: {} @@ -13638,6 +14429,8 @@ snapshots: command-exists-promise@2.0.2: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@2.1.0: {} @@ -13646,6 +14439,8 @@ snapshots: commander@6.2.1: {} + commander@7.2.0: {} + commander@8.3.0: {} comment-parser@1.4.1: {} @@ -13699,6 +14494,11 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + connect-history-api-fallback@2.0.0: {} console-browserify@1.1.0: @@ -13724,6 +14524,8 @@ snapshots: '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 + convert-hrtime@5.0.0: {} + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} @@ -13749,11 +14551,9 @@ snapshots: core-js@1.2.7: {} - core-js@2.5.7: {} - core-js@2.6.12: {} - core-js@3.48.0: {} + core-js@3.49.0: {} core-util-is@1.0.3: {} @@ -13822,6 +14622,12 @@ snapshots: transitivePeerDependencies: - encoding + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -13851,6 +14657,10 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 + css-declaration-sorter@7.3.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + css-loader@6.7.3(webpack@5.105.4): dependencies: icss-utils: 5.1.0(postcss@8.5.8) @@ -13865,6 +14675,16 @@ snapshots: css-mediaquery@0.1.2: {} + css-minimizer-webpack-plugin@8.0.0(webpack@5.105.4): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + cssnano: 7.1.3(postcss@8.5.8) + jest-worker: 30.3.0 + postcss: 8.5.8 + schema-utils: 4.3.3 + serialize-javascript: 7.0.4 + webpack: 5.105.4(webpack-cli@6.0.1) + css-select@4.3.0: dependencies: boolbase: 1.0.0 @@ -13886,6 +14706,11 @@ snapshots: mdn-data: 2.0.14 source-map: 0.6.1 + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 @@ -13901,6 +14726,54 @@ snapshots: cssfontparser@1.2.1: {} + cssnano-preset-default@7.0.11(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + css-declaration-sorter: 7.3.1(postcss@8.5.8) + cssnano-utils: 5.0.1(postcss@8.5.8) + postcss: 8.5.8 + postcss-calc: 10.1.1(postcss@8.5.8) + postcss-colormin: 7.0.6(postcss@8.5.8) + postcss-convert-values: 7.0.9(postcss@8.5.8) + postcss-discard-comments: 7.0.6(postcss@8.5.8) + postcss-discard-duplicates: 7.0.2(postcss@8.5.8) + postcss-discard-empty: 7.0.1(postcss@8.5.8) + postcss-discard-overridden: 7.0.1(postcss@8.5.8) + postcss-merge-longhand: 7.0.5(postcss@8.5.8) + postcss-merge-rules: 7.0.8(postcss@8.5.8) + postcss-minify-font-values: 7.0.1(postcss@8.5.8) + postcss-minify-gradients: 7.0.1(postcss@8.5.8) + postcss-minify-params: 7.0.6(postcss@8.5.8) + postcss-minify-selectors: 7.0.6(postcss@8.5.8) + postcss-normalize-charset: 7.0.1(postcss@8.5.8) + postcss-normalize-display-values: 7.0.1(postcss@8.5.8) + postcss-normalize-positions: 7.0.1(postcss@8.5.8) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.8) + postcss-normalize-string: 7.0.1(postcss@8.5.8) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.8) + postcss-normalize-unicode: 7.0.6(postcss@8.5.8) + postcss-normalize-url: 7.0.1(postcss@8.5.8) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.8) + postcss-ordered-values: 7.0.2(postcss@8.5.8) + postcss-reduce-initial: 7.0.6(postcss@8.5.8) + postcss-reduce-transforms: 7.0.1(postcss@8.5.8) + postcss-svgo: 7.1.1(postcss@8.5.8) + postcss-unique-selectors: 7.0.5(postcss@8.5.8) + + cssnano-utils@5.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + cssnano@7.1.3(postcss@8.5.8): + dependencies: + cssnano-preset-default: 7.0.11(postcss@8.5.8) + lilconfig: 3.1.3 + postcss: 8.5.8 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + cssstyle@4.6.0: dependencies: '@asamuzakjp/css-color': 3.2.0 @@ -13955,6 +14828,8 @@ snapshots: date-now@0.1.4: {} + debounce@1.2.1: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -13977,11 +14852,53 @@ snapshots: decode-uri-component@0.2.2: {} - dedent@1.7.2: {} + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 - deep-is@0.1.4: {} + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 - deepmerge@4.3.1: {} + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + + dedent@1.7.2: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} default-browser-id@5.0.1: {} @@ -14149,6 +15066,39 @@ snapshots: dependencies: is-obj: 2.0.0 + dot-prop@8.0.2: + dependencies: + type-fest: 3.13.1 + + download@6.2.5: + dependencies: + caw: 2.0.1 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 5.2.0 + filenamify: 2.1.0 + get-stream: 3.0.0 + got: 7.1.0 + make-dir: 1.3.0 + p-event: 1.3.0 + pify: 3.0.0 + + download@7.1.0: + dependencies: + archive-type: 4.0.0 + caw: 2.0.1 + content-disposition: 0.5.4 + decompress: 4.2.1 + ext-name: 5.0.0 + file-type: 8.1.0 + filenamify: 2.1.0 + get-stream: 3.0.0 + got: 8.3.2 + make-dir: 1.3.0 + p-event: 2.3.1 + pify: 3.0.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14159,6 +15109,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + duplexer3@0.1.5: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -14415,8 +15367,6 @@ snapshots: es-toolkit@1.45.1: {} - es6-object-assign@1.1.0: {} - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -14513,31 +15463,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(eslint@9.39.2(jiti@2.6.1)): - dependencies: - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 9.39.2(jiti@2.6.1) - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.2(jiti@2.6.1)) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 @@ -14809,6 +15734,34 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 + exec-buffer@3.2.0: + dependencies: + execa: 0.7.0 + p-finally: 1.0.0 + pify: 3.0.0 + rimraf: 2.7.1 + tempfile: 2.0.0 + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + + execa@1.0.0: + dependencies: + cross-spawn: 6.0.6 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -14821,6 +15774,25 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + executable@4.1.1: + dependencies: + pify: 2.3.0 + exenv@1.2.2: {} exit-x@0.2.2: {} @@ -14890,6 +15862,15 @@ snapshots: transitivePeerDependencies: - supports-color + ext-list@2.2.2: + dependencies: + mime-db: 1.54.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -14921,6 +15902,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@5.4.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14978,6 +15961,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@5.0.1: dependencies: flat-cache: 2.0.1 @@ -14986,8 +15973,35 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-type@10.11.0: {} + + file-type@19.6.0: + dependencies: + get-stream: 9.0.1 + strtok3: 9.1.1 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + + file-type@3.9.0: {} + + file-type@4.4.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + + file-type@8.1.0: {} + filename-regex@2.0.1: {} + filename-reserved-regex@2.0.0: {} + + filenamify@2.1.0: + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + fill-range@2.2.4: dependencies: is-number: 2.1.0 @@ -15043,6 +16057,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-versions@3.2.0: + dependencies: + semver-regex: 2.0.0 + findup@0.1.5: dependencies: colors: 0.6.2 @@ -15164,6 +16182,8 @@ snapshots: fromentries@1.3.2: {} + fs-constants@1.0.0: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -15195,6 +16215,8 @@ snapshots: function-loop@4.0.0: {} + function-timeout@1.0.2: {} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -15238,12 +16260,32 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-proxy@2.1.0: + dependencies: + npm-conf: 1.1.3 + + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@3.0.0: {} + + get-stream@4.1.0: + dependencies: + pump: 3.0.4 + get-stream@5.2.0: dependencies: pump: 3.0.4 get-stream@6.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -15260,6 +16302,12 @@ snapshots: get-user-media-promise@1.1.4: {} + gifsicle@5.3.0: + dependencies: + bin-build: 3.0.0 + bin-wrapper: 4.1.0 + execa: 5.1.1 + git-raw-commits@5.0.1(conventional-commits-parser@6.3.0): dependencies: '@conventional-changelog/git-client': 2.6.0(conventional-commits-parser@6.3.0) @@ -15367,8 +16415,58 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + gopd@1.2.0: {} + got@7.1.0: + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-plain-obj: 1.1.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + p-cancelable: 0.3.0 + p-timeout: 1.2.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 1.0.0 + url-to-options: 1.0.1 + + got@8.3.2: + dependencies: + '@sindresorhus/is': 0.7.0 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 2.1.4 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 3.0.0 + into-stream: 3.1.0 + is-retry-allowed: 1.2.0 + isurl: 1.0.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 0.4.1 + p-timeout: 2.0.1 + pify: 3.0.0 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + url-parse-lax: 3.0.0 + url-to-options: 1.0.1 + graceful-fs@4.2.11: {} grapheme-breaker@0.3.2: @@ -15407,8 +16505,14 @@ snapshots: dependencies: dunder-proto: 1.0.1 + has-symbol-support-x@1.4.2: {} + has-symbols@1.1.0: {} + has-to-string-tag-x@1.4.1: + dependencies: + has-symbol-support-x: 1.4.2 + has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 @@ -15544,6 +16648,8 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@3.8.1: {} + http-cache-semantics@4.2.0: {} http-deceiver@1.2.7: {} @@ -15615,6 +16721,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@8.0.1: {} + husky@9.1.7: {} hyperdyperid@1.2.0: {} @@ -15637,6 +16745,10 @@ snapshots: dependencies: postcss: 8.5.8 + identifier-regex@1.0.1: + dependencies: + reserved-identifiers: 1.2.0 + ieee754@1.2.1: {} ify-loader@1.1.0: @@ -15659,6 +16771,54 @@ snapshots: ignore@7.0.5: {} + image-dimensions@2.5.0: {} + + image-minimizer-webpack-plugin@5.0.0(imagemin@9.0.1)(webpack@5.105.4): + dependencies: + schema-utils: 4.3.3 + serialize-javascript: 7.0.4 + webpack: 5.105.4(webpack-cli@6.0.1) + optionalDependencies: + imagemin: 9.0.1 + + imagemin-gifsicle@7.0.0: + dependencies: + execa: 1.0.0 + gifsicle: 5.3.0 + is-gif: 3.0.0 + + imagemin-jpegtran@8.0.0: + dependencies: + execa: 9.6.1 + file-type: 19.6.0 + image-dimensions: 2.5.0 + jpegtran-bin: 7.0.0 + uint8array-extras: 1.5.0 + + imagemin-optipng@8.0.0: + dependencies: + exec-buffer: 3.2.0 + is-png: 2.0.0 + optipng-bin: 7.0.1 + + imagemin-svgo@12.0.0: + dependencies: + is-svg: 6.1.0 + svgo: 4.0.1 + + imagemin@9.0.1: + dependencies: + change-file-extension: 0.1.1 + environment: 1.1.0 + file-type: 19.6.0 + globby: 14.1.0 + image-dimensions: 2.5.0 + junk: 4.0.1 + ow: 2.0.0 + p-pipe: 4.0.0 + slash: 5.1.0 + uint8array-extras: 1.5.0 + immediate@3.0.6: {} immutable@5.1.5: {} @@ -15668,6 +16828,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@3.1.0: {} + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -15690,6 +16852,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + ini@4.1.1: {} ini@4.1.3: {} @@ -15770,7 +16934,10 @@ snapshots: dependencies: intl-messageformat: 2.2.0 - intl@1.2.5: {} + into-stream@3.1.0: + dependencies: + from2: 2.3.0 + p-is-promise: 1.1.0 invariant@2.2.4: dependencies: @@ -15881,6 +17048,10 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + is-gif@3.0.0: + dependencies: + file-type: 10.11.0 + is-glob@2.0.1: dependencies: is-extglob: 1.0.0 @@ -15889,6 +17060,11 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-identifier@1.0.1: + dependencies: + identifier-regex: 1.0.1 + super-regex: 1.1.0 + is-in-browser@1.1.3: {} is-in-ci@1.0.0: {} @@ -15906,6 +17082,8 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 + is-natural-number@4.0.1: {} + is-negative-zero@2.0.3: {} is-network-error@1.3.1: {} @@ -15925,6 +17103,10 @@ snapshots: is-obj@2.0.0: {} + is-object@1.0.2: {} + + is-plain-obj@1.1.0: {} + is-plain-obj@3.0.0: {} is-plain-obj@4.1.0: {} @@ -15935,6 +17117,8 @@ snapshots: is-plain-object@5.0.0: {} + is-png@2.0.0: {} + is-posix-bracket@0.1.1: {} is-potential-custom-element-name@1.0.1: {} @@ -15948,6 +17132,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@1.2.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -15958,6 +17144,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -15969,6 +17157,10 @@ snapshots: is-subset@0.1.1: {} + is-svg@6.1.0: + dependencies: + '@file-type/xml': 0.4.4 + is-symbol@1.1.1: dependencies: call-bound: 1.0.4 @@ -15979,6 +17171,8 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-unicode-supported@2.1.0: {} + is-url@1.2.4: {} is-utf8@0.2.1: {} @@ -16081,6 +17275,11 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + isurl@1.0.0: + dependencies: + has-to-string-tag-x: 1.4.1 + is-object: 1.0.2 + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -16567,6 +17766,11 @@ snapshots: jpeg-js@0.4.4: {} + jpegtran-bin@7.0.0: + dependencies: + bin-build: 3.0.0 + bin-wrapper: 4.1.0 + js-base64@2.4.9: {} js-md5@0.7.3: {} @@ -16659,6 +17863,8 @@ snapshots: shelljs: 0.3.0 strip-json-comments: 1.0.4 + json-buffer@3.0.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -16705,8 +17911,14 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 + junk@4.0.1: {} + keymirror@0.1.1: {} + keyv@3.0.0: + dependencies: + json-buffer: 3.0.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -16740,6 +17952,8 @@ snapshots: dependencies: immediate: 3.0.6 + lilconfig@3.1.3: {} + linebreak@0.3.0: dependencies: base64-js: 0.0.8 @@ -16836,6 +18050,8 @@ snapshots: lodash.unescape@4.0.1: {} + lodash.uniq@4.5.0: {} + lodash.upperfirst@4.3.1: {} lodash@4.17.23: {} @@ -16850,10 +18066,19 @@ snapshots: dependencies: tslib: 2.8.1 + lowercase-keys@1.0.0: {} + + lowercase-keys@1.0.1: {} + lru-cache@10.4.3: {} lru-cache@11.2.6: {} + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -16866,6 +18091,16 @@ snapshots: dependencies: vlq: 0.2.3 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -16918,6 +18153,8 @@ snapshots: mdn-data@2.0.14: {} + mdn-data@2.0.28: {} + mdn-data@2.27.1: {} media-typer@0.3.0: {} @@ -16955,8 +18192,6 @@ snapshots: methods@1.1.2: {} - microee@0.0.6: {} - micromatch@2.3.11: dependencies: arr-diff: 2.0.0 @@ -17001,14 +18236,12 @@ snapshots: mimic-fn@2.1.0: {} + mimic-response@1.0.1: {} + min-document@2.19.2: dependencies: dom-walk: 0.1.2 - minilog@3.1.0: - dependencies: - microee: 0.0.6 - minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -17088,6 +18321,8 @@ snapshots: mri@1.2.0: {} + mrmime@2.0.1: {} + ms@2.0.0: {} ms@2.1.2: {} @@ -17238,10 +18473,21 @@ snapshots: normalize-range@0.1.2: {} + normalize-url@2.0.1: + dependencies: + prepend-http: 2.0.0 + query-string: 5.1.1 + sort-keys: 2.0.0 + npm-bundled@3.0.1: dependencies: npm-normalize-package-bin: 3.0.1 + npm-conf@1.1.3: + dependencies: + config-chain: 1.1.13 + pify: 3.0.0 + npm-install-checks@6.3.0: dependencies: semver: 7.7.4 @@ -17281,10 +18527,19 @@ snapshots: transitivePeerDependencies: - supports-color + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -17408,22 +18663,60 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + optipng-bin@7.0.1: + dependencies: + bin-build: 3.0.0 + bin-wrapper: 4.1.0 + os-browserify@0.3.0: {} + os-filter-obj@2.0.0: + dependencies: + arch: 2.2.0 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} + ow@2.0.0: + dependencies: + '@sindresorhus/is': 6.3.1 + callsites: 4.2.0 + dot-prop: 8.0.2 + environment: 1.1.0 + fast-equals: 5.4.0 + is-identifier: 1.0.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-cancelable@0.3.0: {} + + p-cancelable@0.4.1: {} + + p-event@1.3.0: + dependencies: + p-timeout: 1.2.1 + + p-event@2.3.1: + dependencies: + p-timeout: 2.0.1 + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-filter@2.1.0: dependencies: p-map: 2.1.0 + p-finally@1.0.0: {} + + p-is-promise@1.1.0: {} + p-limit@1.3.0: dependencies: p-try: 1.0.0 @@ -17456,20 +18749,38 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map-series@1.0.0: + dependencies: + p-reduce: 1.0.0 + p-map@2.1.0: {} p-map@4.0.0: dependencies: aggregate-error: 3.1.0 + p-pipe@4.0.0: {} + p-queue@3.0.0: {} + p-reduce@1.0.0: {} + p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 is-network-error: 1.3.1 retry: 0.13.1 + p-timeout@1.2.1: + dependencies: + p-finally: 1.0.0 + + p-timeout@2.0.1: + dependencies: + p-finally: 1.0.0 + + p-timeout@6.1.4: {} + p-try@1.0.0: {} p-try@2.2.0: {} @@ -17572,6 +18883,8 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-ms@4.0.0: {} + parse-passwd@1.0.0: {} parse-statements@1.0.11: {} @@ -17614,6 +18927,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -17636,6 +18951,8 @@ snapshots: path-type@4.0.0: {} + path-type@6.0.0: {} + pbkdf2@3.1.5: dependencies: create-hash: 1.2.0 @@ -17645,6 +18962,8 @@ snapshots: sha.js: 2.4.12 to-buffer: 1.2.2 + peek-readable@5.4.2: {} + pend@1.2.0: {} performance-now@2.1.0: {} @@ -17659,6 +18978,8 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + pify@4.0.1: {} pinkie-promise@2.0.1: @@ -17717,6 +19038,43 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-calc@10.1.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.6(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.9(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-discard-comments@7.0.6(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + + postcss-discard-duplicates@7.0.2(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-empty@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-discard-overridden@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-import@12.0.1: dependencies: postcss: 7.0.39 @@ -17732,6 +19090,45 @@ snapshots: semver: 7.7.4 webpack: 5.105.4(webpack-cli@6.0.1) + postcss-merge-longhand@7.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.8(postcss@8.5.8) + + postcss-merge-rules@7.0.8(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.1(postcss@8.5.8) + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + + postcss-minify-font-values@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.1(postcss@8.5.8): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.1(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.6(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 5.0.1(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.6(postcss@8.5.8): + dependencies: + cssesc: 3.0.0 + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + postcss-modules-extract-imports@3.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -17753,11 +19150,84 @@ snapshots: icss-utils: 5.1.0(postcss@8.5.8) postcss: 8.5.8 + postcss-normalize-charset@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + + postcss-normalize-display-values@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.6(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-ordered-values@7.0.2(postcss@8.5.8): + dependencies: + cssnano-utils: 5.0.1(postcss@8.5.8) + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + postcss-reduce-initial@7.0.6(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.8 + + postcss-reduce-transforms@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-svgo@7.1.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + svgo: 4.0.1 + + postcss-unique-selectors@7.0.5(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + postcss-value-parser@3.3.1: {} postcss-value-parser@4.2.0: {} @@ -17777,6 +19247,10 @@ snapshots: prelude-ls@1.2.1: {} + prepend-http@1.0.4: {} + + prepend-http@2.0.0: {} + preserve@0.2.0: {} prettier@2.8.8: {} @@ -17805,6 +19279,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + prismjs-terminal@1.2.4: dependencies: chalk: 5.6.2 @@ -17859,6 +19337,8 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + proto-list@1.2.4: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -17881,6 +19361,8 @@ snapshots: proxy-from-env@2.0.0: {} + pseudomap@1.0.2: {} + public-encrypt@4.0.3: dependencies: bn.js: 4.12.3 @@ -18368,6 +19850,10 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@1.0.2: + dependencies: + lowercase-keys: 1.0.1 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -18494,22 +19980,16 @@ snapshots: ajv-formats: 2.1.1(ajv@8.18.0) ajv-keywords: 5.1.0(ajv@8.18.0) - scratch-render-fonts@1.0.252: - dependencies: - base64-loader: 1.0.0 - - scratch-sb1-converter@1.0.324: - dependencies: - js-md5: 0.7.3 - minilog: 3.1.0 - text-encoding: 0.7.0 - scratch-translate-extension-languages@1.0.7: {} script-loader@0.7.2: dependencies: raw-loader: 0.5.1 + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + select-hose@2.0.0: {} selenium-webdriver@3.6.0: @@ -18524,6 +20004,12 @@ snapshots: '@peculiar/x509': 1.14.3 pkijs: 3.3.3 + semver-regex@2.0.0: {} + + semver-truncate@1.1.2: + dependencies: + semver: 5.7.2 + semver@5.5.0: {} semver@5.7.2: {} @@ -18675,10 +20161,18 @@ snapshots: transitivePeerDependencies: - supports-color + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + slash@2.0.0: {} slash@3.0.0: {} + slash@5.1.0: {} + slice-ansi@2.1.0: dependencies: ansi-styles: 3.2.1 @@ -18716,6 +20210,18 @@ snapshots: ip-address: 10.1.0 smart-buffer: 4.2.0 + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + + sort-keys@2.0.0: + dependencies: + is-plain-obj: 1.1.0 + source-map-js@1.2.1: {} source-map-loader@5.0.0(webpack@5.105.4): @@ -18958,16 +20464,49 @@ snapshots: strip-bom@4.0.0: {} + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + + strip-eof@1.0.0: {} + strip-final-newline@2.0.0: {} + strip-final-newline@4.0.0: {} + strip-json-comments@1.0.4: {} strip-json-comments@3.1.1: {} + strip-outer@1.0.1: + dependencies: + escape-string-regexp: 1.0.5 + + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + + strtok3@9.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.4.2 + style-loader@4.0.0(webpack@5.105.4): dependencies: webpack: 5.105.4(webpack-cli@6.0.1) + stylehacks@7.0.8(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.8 + postcss-selector-parser: 7.1.1 + + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@2.0.0: {} supports-color@5.5.0: @@ -18984,6 +20523,16 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.5.0 + symbol-observable@1.2.0: {} symbol-tree@3.2.4: {} @@ -19057,6 +20606,16 @@ snapshots: tapable@2.3.0: {} + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.2.2 + xtend: 4.0.2 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -19089,6 +20648,13 @@ snapshots: transitivePeerDependencies: - supports-color + temp-dir@1.0.0: {} + + tempfile@2.0.0: + dependencies: + temp-dir: 1.0.0 + uuid: 3.4.0 + term-size@2.2.1: {} terser-webpack-plugin@5.3.17(webpack@5.105.4): @@ -19126,8 +20692,6 @@ snapshots: glob: 10.5.0 minimatch: 10.2.4 - text-encoding@0.7.0: {} - text-table@0.2.0: {} thingies@2.5.0(tslib@2.8.1): @@ -19143,6 +20707,12 @@ snapshots: thunky@1.1.0: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + timed-out@4.0.1: {} + timers-browserify@2.0.12: dependencies: setimmediate: 1.0.5 @@ -19203,6 +20773,14 @@ snapshots: toidentifier@1.0.1: {} + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + totalist@3.0.1: {} + tough-cookie@5.1.2: dependencies: tldts: 6.1.86 @@ -19221,14 +20799,16 @@ snapshots: dependencies: punycode: 2.3.1 - transformation-matrix@2.16.1: {} - - travis-after-all@1.4.5: {} + transformation-matrix@1.15.3: {} tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 + trim-repeated@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + trim-right@1.0.1: {} trivial-deferred@2.0.0: {} @@ -19341,6 +20921,10 @@ snapshots: transitivePeerDependencies: - supports-color + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + twgl.js@4.24.0: {} type-check@0.3.2: @@ -19357,6 +20941,8 @@ snapshots: type-fest@0.8.1: {} + type-fest@3.13.1: {} + type-fest@4.41.0: {} type-is@1.6.18: @@ -19421,6 +21007,8 @@ snapshots: uglify-js@3.19.3: optional: true + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -19428,9 +21016,12 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@7.18.2: {} + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 - undici-types@7.22.0: {} + undici-types@7.18.2: {} undici@7.22.0: {} @@ -19450,6 +21041,8 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 + unicorn-magic@0.3.0: {} + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -19496,6 +21089,16 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse-lax@1.0.0: + dependencies: + prepend-http: 1.0.4 + + url-parse-lax@3.0.0: + dependencies: + prepend-http: 2.0.0 + + url-to-options@1.0.1: {} + url@0.11.4: dependencies: punycode: 1.4.1 @@ -19515,6 +21118,8 @@ snapshots: utils-merge@1.0.1: {} + uuid@3.4.0: {} + uuid@8.3.2: {} v8-compile-cache-lib@3.0.1: {} @@ -19573,13 +21178,32 @@ snapshots: web-streams-polyfill@3.3.3: {} + web-worker@1.5.0: {} + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} webidl-conversions@8.0.1: {} - webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4): + webpack-bundle-analyzer@5.2.0: + dependencies: + '@discoveryjs/json-ext': 0.5.7 + acorn: 8.16.0 + acorn-walk: 8.3.5 + commander: 7.2.0 + debounce: 1.2.1 + escape-string-regexp: 4.0.0 + html-escaper: 2.0.2 + opener: 1.5.2 + picocolors: 1.1.1 + sirv: 3.0.2 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4): dependencies: '@discoveryjs/json-ext': 0.6.3 '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.4) @@ -19596,6 +21220,7 @@ snapshots: webpack: 5.105.4(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: + webpack-bundle-analyzer: 5.2.0 webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.4) webpack-cli@6.0.1(webpack@5.105.4): @@ -19660,7 +21285,7 @@ snapshots: ws: 8.19.0 optionalDependencies: webpack: 5.105.4(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.105.4) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.4) transitivePeerDependencies: - bufferutil - debug @@ -19870,6 +21495,8 @@ snapshots: y18n@5.0.8: {} + yallist@2.1.2: {} + yallist@3.1.1: {} yallist@4.0.0: {} @@ -19912,4 +21539,6 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors@2.1.2: {} + yoga-layout@3.2.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0d0546ca0..6891e94a1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,9 @@ catalog: onlyBuiltDependencies: - chromedriver - core-js + - gifsicle + - jpegtran-bin + - optipng-bin - playwright-chromium - unrs-resolver