diff --git a/.prettierrc.js b/.prettierrc.js index ed5d64c0246..74f27bdc431 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -26,10 +26,7 @@ module.exports = { }, }, { - files: [ - 'packages/plugins/theme-*/**/*', - 'packages/plugins/dev-tools/**/*' - ], + files: 'packages/plugins/**/*', options: { // Some properties must be quoted to preserve closure compiler behavior. // If at least one property in an object requires quotes, quote all diff --git a/eslint.config.mjs b/eslint.config.mjs index b8ecfb1177e..f04f1b15714 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -327,10 +327,7 @@ export default defineConfig( }, }, { - files: [ - 'packages/plugins/theme-*/**', - 'packages/plugins/dev-tools/**' - ], + files: ['packages/plugins/**'], languageOptions: { globals: { ...globals.browser, diff --git a/package-lock.json b/package-lock.json index c93dbef27ab..508878e2a43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,15 @@ "license": "Apache-2.0", "workspaces": [ "packages/blockly", + "packages/plugins/block-test", + "packages/plugins/dev-scripts", "packages/plugins/theme-dark", "packages/plugins/theme-deuteranopia", "packages/plugins/theme-hackermode", "packages/plugins/theme-highcontrast", "packages/plugins/theme-modern", "packages/plugins/theme-tritanopia", - "packages/dev-tools", + "packages/plugins/dev-tools", "packages/docs" ], "devDependencies": { @@ -302,121 +304,6 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/css-color/node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", - "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, "node_modules/@asamuzakjp/dom-selector": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz", @@ -434,27 +321,6 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@asamuzakjp/dom-selector/node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@asamuzakjp/dom-selector/node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/@asamuzakjp/generational-cache": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", @@ -2191,99 +2057,16 @@ } }, "node_modules/@blockly/block-test": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-13.1.0.tgz", - "integrity": "sha512-u59AFquSTta2yRQrp/W/dUk4wbaemKEMzKG+CMoBqwwToagxnSAsb+wLn4AuSt/wABmiAq0q9356rO9VwOuu+g==", - "dev": true, - "license": "Apache 2.0", - "peerDependencies": { - "blockly": "^13.1.0" - } + "resolved": "packages/plugins/block-test", + "link": true }, "node_modules/@blockly/dev-scripts": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@blockly/dev-scripts/-/dev-scripts-13.1.0.tgz", - "integrity": "sha512-fWK0DeB2GdvfH+yB0A2gBygFuTFkeN4rGDkW/qxTRAekoY+mJcQ9i1r3Qox4s87OHLglCHwcglfWnp/rILGwTw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/code-frame": "^8.0.0", - "chalk": "^4.1.2", - "fork-ts-checker-webpack-plugin": "^9.1.0", - "install": "^0.13.0", - "mocha": "^11.7.6", - "rimraf": "^6.1.3", - "source-map-loader": "^5.0.0", - "ts-loader": "^9.6.1", - "webpack": "^5.107.2", - "webpack-cli": "^7.0.3", - "webpack-dev-server": "^5.2.5" - }, - "bin": { - "blockly-scripts": "bin/blockly-scripts.js" - }, - "peerDependencies": { - "typescript": "^4.3.2 || ^5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@blockly/dev-scripts/node_modules/@babel/code-frame": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", - "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^8.0.0", - "js-tokens": "^10.0.0" - }, - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@blockly/dev-scripts/node_modules/@babel/helper-validator-identifier": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", - "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^22.18.0 || >=24.11.0" - } - }, - "node_modules/@blockly/dev-scripts/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true, - "license": "MIT" + "resolved": "packages/plugins/dev-scripts", + "link": true }, "node_modules/@blockly/dev-tools": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-13.1.0.tgz", - "integrity": "sha512-jtQ1tIJGYgAXGA46mgCha+3UWCiL+lHHjpfyr09rce40hTedSSIeWlI4J58IeAnDkGBSQhkBRBpFV1b/37CA+A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@blockly/block-test": "^13.1.0", - "@blockly/theme-dark": "^13.1.0", - "@blockly/theme-deuteranopia": "^13.1.0", - "@blockly/theme-highcontrast": "^13.1.0", - "@blockly/theme-tritanopia": "^13.1.0", - "chai": "^6.2.2", - "dat.gui": "^0.7.9", - "lodash.assign": "^4.2.0", - "lodash.merge": "^4.6.2", - "monaco-editor": "^0.55.1", - "sinon": "^22.0.0" - }, - "peerDependencies": { - "blockly": "^13.1.0" - } + "resolved": "packages/plugins/dev-tools", + "link": true }, "node_modules/@blockly/theme-dark": { "resolved": "packages/plugins/theme-dark", @@ -2322,27 +2105,6 @@ "specificity": "bin/cli.js" } }, - "node_modules/@bramus/specificity/node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@bramus/specificity/node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -2665,9 +2427,10 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "dev": true, "funding": [ { "type": "github", @@ -2680,13 +2443,14 @@ ], "license": "MIT-0", "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "dev": true, "funding": [ { "type": "github", @@ -2699,17 +2463,18 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "dev": true, "funding": [ { "type": "github", @@ -2722,21 +2487,22 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "@csstools/css-calc": "^2.1.4" + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.3.0" }, "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, "funding": [ { "type": "github", @@ -2749,16 +2515,16 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", - "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", "dev": true, "funding": [ { @@ -2781,9 +2547,10 @@ } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, "funding": [ { "type": "github", @@ -2796,7 +2563,7 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, "node_modules/@csstools/media-query-list-parser": { @@ -2851,10 +2618,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", - "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -2866,34 +2633,14 @@ } ], "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" } }, - "node_modules/@csstools/postcss-color-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", - "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -2904,25 +2651,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-color-function-display-p3-linear": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", - "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -2933,25 +2674,23 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", - "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -2962,25 +2701,18 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", - "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "node_modules/@csstools/postcss-alpha-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -2991,25 +2723,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-content-alt-text": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", - "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "funding": [ { "type": "github", @@ -3022,10 +2744,8 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": ">=18" @@ -3034,10 +2754,23 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-contrast-color-function": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", - "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", "funding": [ { "type": "github", @@ -3063,10 +2796,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", - "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", "funding": [ { "type": "github", @@ -3079,9 +2812,11 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { "node": ">=18" @@ -3090,10 +2825,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", - "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3105,21 +2840,14 @@ } ], "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-gamut-mapping": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", - "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3130,23 +2858,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", - "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3157,25 +2881,23 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", - "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3186,25 +2908,18 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", - "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "node_modules/@csstools/postcss-color-function-display-p3-linear/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -3215,23 +2930,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-initial": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", - "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "node_modules/@csstools/postcss-color-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3245,15 +2952,12 @@ "license": "MIT-0", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", - "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3264,35 +2968,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-light-dark-function": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", - "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3303,24 +2991,23 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", - "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3331,18 +3018,18 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-logical-overflow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", - "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "node_modules/@csstools/postcss-color-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -3353,18 +3040,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-logical-overscroll-behavior": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", - "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", "funding": [ { "type": "github", @@ -3376,6 +3060,13 @@ } ], "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, "engines": { "node": ">=18" }, @@ -3383,10 +3074,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", - "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3398,20 +3089,14 @@ } ], "license": "MIT-0", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", - "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3422,22 +3107,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", - "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3450,22 +3132,21 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", - "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3476,23 +3157,18 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", - "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "node_modules/@csstools/postcss-color-mix-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -3503,22 +3179,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", "funding": [ { "type": "github", @@ -3531,7 +3200,11 @@ ], "license": "MIT-0", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { "node": ">=18" @@ -3540,10 +3213,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", - "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3555,24 +3228,14 @@ } ], "license": "MIT-0", - "dependencies": { - "@csstools/css-color-parser": "^3.1.0", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.2.1", - "@csstools/utilities": "^2.0.0" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-position-area-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", - "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3583,18 +3246,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", - "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3605,21 +3269,23 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-property-rule-prelude-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", - "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3630,22 +3296,18 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-random-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", - "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -3656,23 +3318,15 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", - "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", "funding": [ { "type": "github", @@ -3685,7 +3339,6 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/postcss-progressive-custom-properties": "^4.2.1", @@ -3698,10 +3351,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", - "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "node_modules/@csstools/postcss-content-alt-text/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3712,34 +3365,37 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "node_modules/@csstools/postcss-content-alt-text/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/@csstools/postcss-sign-functions": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", - "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", "funding": [ { "type": "github", @@ -3752,9 +3408,11 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-calc": "^2.1.4", + "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { "node": ">=18" @@ -3763,10 +3421,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", - "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "funding": [ { "type": "github", @@ -3778,22 +3436,14 @@ } ], "license": "MIT-0", - "dependencies": { - "@csstools/css-calc": "^2.1.4", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", - "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3804,21 +3454,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/css-tokenizer": "^3.0.4" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-system-ui-font-family": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", - "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "funding": [ { "type": "github", @@ -3829,22 +3477,23 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", - "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3855,22 +3504,37 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", - "dependencies": { - "@csstools/color-helpers": "^5.1.0", - "postcss-value-parser": "^4.2.0" - }, + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", - "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "node_modules/@csstools/postcss-contrast-color-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", "funding": [ { "type": "github", @@ -3894,10 +3558,10 @@ "postcss": "^8.4" } }, - "node_modules/@csstools/postcss-unset-value": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", - "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "funding": [ { "type": "github", @@ -3908,18 +3572,19 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/selector-resolve-nested": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", - "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -3930,18 +3595,37 @@ "url": "https://opencollective.com/csstools" } ], - "license": "MIT-0", + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^7.0.0" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "node_modules/@csstools/postcss-exponential-functions/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", "funding": [ { "type": "github", @@ -3953,17 +3637,21 @@ } ], "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss": "^8.4" } }, - "node_modules/@csstools/utilities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", - "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", "funding": [ { "type": "github", @@ -3975,6 +3663,11 @@ } ], "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, "engines": { "node": ">=18" }, @@ -3982,28 +3675,1958 @@ "postcss": "^8.4" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", + "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "node_modules/@docsearch/core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", - "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", - "license": "MIT", - "peerDependencies": { - "@types/react": ">= 16.8.0 < 20.0.0", - "react": ">= 16.8.0 < 20.0.0", - "react-dom": ">= 16.8.0 < 20.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true + "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-hwb-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-light-dark-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-light-dark-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-media-minmax/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-oklab-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-random-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-random-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-sign-functions/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-sign-functions/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-sign-functions/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true }, "react": { "optional": true @@ -4981,9 +6604,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { @@ -5529,7 +7152,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -5543,35 +7165,6 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -6265,24 +7858,6 @@ "string-argv": "~0.3.1" } }, - "node_modules/@microsoft/api-extractor/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@microsoft/api-extractor/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -6316,6 +7891,16 @@ "node": "18 || 20 || >=22" } }, + "node_modules/@microsoft/api-extractor/node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/@microsoft/api-extractor/node_modules/minimatch": { "version": "10.2.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", @@ -6945,7 +8530,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -7304,24 +8888,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/@rushstack/node-core-library/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -8486,6 +10052,13 @@ "@types/node": "*" } }, + "node_modules/@types/dat.gui": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.13.tgz", + "integrity": "sha512-LmG4Pr0mbsB/1WVttf8xaHx45BvSBDGY5D9+0/9AZCbI4vvOguwBHZdKyJMxt5Yst8+icRSHKmr7ClV2u5ZtDA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -8803,7 +10376,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, "license": "MIT", "optional": true }, @@ -9142,15 +10714,15 @@ "license": "ISC" }, "node_modules/@wdio/config": { - "version": "9.29.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.29.1.tgz", - "integrity": "sha512-8IXDiRG9wUUnpU6M/uzsVqIHJD/7o4y9RaOU2Jh/OdRJP/7rxwfGsa24Bv486rnMGdghztkwLCBJWG0jbeEtfw==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.30.0.tgz", + "integrity": "sha512-pH/Y1F4QVIsx33xyli8+9HCr4HRuOeUk8j/lqNBuuUzbvduYRCLmNkZqxRsLnRth8wrlPdzA8Hq+PPLwJWrceA==", "dev": true, "license": "MIT", "dependencies": { "@wdio/logger": "9.29.1", "@wdio/types": "9.29.1", - "@wdio/utils": "9.29.1", + "@wdio/utils": "9.30.0", "deepmerge-ts": "^7.0.3", "glob": "^10.2.2", "import-meta-resolve": "^4.0.0", @@ -9187,19 +10759,6 @@ "node": ">=18.20.0" } }, - "node_modules/@wdio/logger/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/@wdio/logger/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -9213,26 +10772,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@wdio/logger/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/@wdio/protocols": { - "version": "9.29.1", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.29.1.tgz", - "integrity": "sha512-NFlBQOA4zDb4D/ETpVMqDgbJyEqdhGRsJWybLOXG7PGlPwfcrfmTMHC1+Boq4KODgpwbhCmI9zIk2JQmGYIttQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.30.0.tgz", + "integrity": "sha512-VDKCTw3GVdqUw1+fXAY4FUOSt+a3/r7T2O34d5HAaZLfI6QHacsU7/N0Sv3w/QgWU6yj3WkXElXq1oSWF1XcBw==", "dev": true, "license": "MIT" }, @@ -9297,9 +10840,9 @@ "license": "MIT" }, "node_modules/@wdio/utils": { - "version": "9.29.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.29.1.tgz", - "integrity": "sha512-jyt6b6FfdYwVbMISVhuyGC1xQGZj6xM03KhTHozH7a9/zu9b++94KRdT9HRbwX8zefjW0YeIC5+qWSIf7WWHZg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.30.0.tgz", + "integrity": "sha512-MhTx8jKOtspogeMUmASFsmL6vRetwCpvfcAFHauYZ62UzPjFwHThIXorzoG90mrcS9Yl+c8Sj9BfX+bdxwXfsg==", "dev": true, "license": "MIT", "dependencies": { @@ -9309,7 +10852,7 @@ "decamelize": "^6.0.0", "deepmerge-ts": "^7.0.3", "edgedriver": "^6.1.2", - "geckodriver": "^6.1.0", + "geckodriver": "^6.1.1", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", "locate-app": "^2.2.24", @@ -9344,6 +10887,16 @@ "node": ">=18" } }, + "node_modules/@wdio/utils/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@wdio/utils/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -9381,6 +10934,19 @@ "node": ">=8" } }, + "node_modules/@wdio/utils/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@wdio/utils/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9418,16 +10984,6 @@ "node": ">=12" } }, - "node_modules/@wdio/utils/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -9780,9 +11336,10 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -9854,6 +11411,15 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-align/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9874,6 +11440,18 @@ "node": ">=8" } }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", @@ -9913,12 +11491,15 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -10026,7 +11607,55 @@ "node": ">= 14" } }, - "node_modules/archiver-utils/node_modules/readable-stream": { + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", @@ -10043,21 +11672,35 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/archiver/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "safe-buffer": "~5.2.0" } }, "node_modules/are-docs-informative": { @@ -10517,9 +12160,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", - "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.1.tgz", + "integrity": "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -10541,13 +12184,6 @@ "node": ">= 0.8" } }, - "node_modules/basic-auth/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, "node_modules/basic-ftp": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz", @@ -10620,6 +12256,21 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blockly": { "resolved": "packages/blockly", "link": true @@ -10652,15 +12303,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -10752,13 +12394,12 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, "license": "ISC" }, "node_modules/browserslist": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", - "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "funding": [ { "type": "opencollective", @@ -10775,9 +12416,9 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001803", - "electron-to-chromium": "^1.5.389", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, @@ -10845,9 +12486,9 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11013,7 +12654,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -11244,6 +12884,15 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -11264,6 +12913,18 @@ "node": ">=8" } }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", @@ -11279,19 +12940,6 @@ "node": ">=20" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/cliui/node_modules/ansi-styles": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", @@ -11330,22 +12978,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", @@ -11429,46 +13061,6 @@ "readable-stream": "^2.3.5" } }, - "node_modules/cloneable-readable/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cloneable-readable/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -11606,6 +13198,37 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/compress-commons/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/compress-commons/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -11645,15 +13268,6 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -11669,6 +13283,26 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11676,18 +13310,18 @@ "license": "MIT" }, "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ - "node >= 6.0" + "node >= 0.8" ], "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^3.0.2", + "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, @@ -12152,21 +13786,52 @@ "node": ">= 14" } }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/crc32-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "safe-buffer": "~5.2.0" } }, "node_modules/cross-spawn": { @@ -12437,13 +14102,14 @@ "license": "MIT" }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -12659,7 +14325,6 @@ "version": "0.7.9", "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==", - "dev": true, "license": "Apache-2.0" }, "node_modules/data-uri-to-buffer": { @@ -13032,10 +14697,9 @@ "license": "BSD-3-Clause" }, "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -13119,7 +14783,6 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", - "dev": true, "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -13287,9 +14950,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.394", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.394.tgz", - "integrity": "sha512-Wmt2Gm0o8JWBuGgmc4XZ0u9s1RaCRqhxP47phplmfg04+qypTUurpeJGP45A7Fhv7jdrrVH44PLlR9qXo37cVQ==", + "version": "1.5.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", + "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -13381,7 +15044,6 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", - "dev": true, "license": "MIT", "bin": { "envinfo": "dist/cli.js" @@ -14408,6 +16070,26 @@ "node": ">= 0.6" } }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -14425,12 +16107,14 @@ "license": "MIT" }, "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "engines": { "node": ">=0.10.0" @@ -14826,7 +16510,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -14916,9 +16599,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", "dev": true, "license": "ISC" }, @@ -14969,7 +16652,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -14986,7 +16668,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -14999,7 +16680,6 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz", "integrity": "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", @@ -15027,7 +16707,6 @@ "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -15044,7 +16723,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" @@ -15054,7 +16732,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -15070,7 +16747,6 @@ "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -15097,7 +16773,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -15112,27 +16787,12 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, "license": "MIT" }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -15146,7 +16806,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -15241,7 +16900,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "dev": true, "license": "Unlicense" }, "node_modules/fsevents": { @@ -15302,7 +16960,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -15415,7 +17072,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", @@ -15511,7 +17167,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -15521,7 +17176,6 @@ "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -15870,6 +17524,16 @@ "node": ">=10.13.0" } }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/gulp-cli/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -15904,6 +17568,19 @@ "node": ">=8" } }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/gulp-cli/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -16025,6 +17702,21 @@ "through2": "^4.0.2" } }, + "node_modules/gulp-header/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gulp-header/node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -16127,62 +17819,6 @@ "through2": "^2.0.3" } }, - "node_modules/gulp-umd/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/gulp-umd/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/gulp-umd/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-umd/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/gulp-umd/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/gulplog": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", @@ -16513,42 +18149,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -16904,7 +18504,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -17022,7 +18621,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", @@ -17042,7 +18640,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -17056,7 +18653,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -17069,7 +18665,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -17085,7 +18680,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -17098,7 +18692,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -17171,7 +18764,6 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" @@ -17181,7 +18773,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -17331,10 +18922,27 @@ "license": "MIT" }, "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { "node": ">=0.10.0" } @@ -17582,7 +19190,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -17646,9 +19253,10 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, "license": "MIT" }, "node_modules/isexe": { @@ -17687,7 +19295,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -17854,20 +19461,6 @@ } } }, - "node_modules/jsdom/node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, "node_modules/jsdom/node_modules/entities": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", @@ -17904,13 +19497,6 @@ "node": "20 || >=22" } }, - "node_modules/jsdom/node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/jsdom/node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -17981,13 +19567,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "node_modules/json-stringify-deterministic": { "version": "1.0.14", "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.14.tgz", @@ -18045,46 +19624,6 @@ "setimmediate": "^1.0.5" } }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/just-curry-it": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/just-curry-it/-/just-curry-it-5.3.0.tgz", @@ -18177,46 +19716,6 @@ "node": ">= 0.6.3" } }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/lead": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", @@ -18651,7 +20150,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -18680,7 +20178,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true, "license": "MIT" }, "node_modules/lodash.clonedeep": { @@ -18706,7 +20203,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, "license": "MIT" }, "node_modules/lodash.template": { @@ -18748,7 +20244,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -18897,7 +20392,6 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", - "dev": true, "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -19318,9 +20812,10 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, "license": "CC0-1.0" }, "node_modules/media-typer": { @@ -19333,32 +20828,15 @@ } }, "node_modules/memfs": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.64.0.tgz", - "integrity": "sha512-Kw72fgY7Wn+sD8KmtNWSafl1dz0UvAsE/PHs3YVfLiaZuA3HxNm9sRLqAu0ATiBGJvME1PxZXbBZPv5GycDeAw==", - "license": "Apache-2.0", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-fsa": "4.64.0", - "@jsonjoy.com/fs-node": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-to-fsa": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/fs-print": "4.64.0", - "@jsonjoy.com/fs-snapshot": "4.64.0", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "fs-monkey": "^1.0.4" }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">= 4.0.0" } }, "node_modules/memoizee": { @@ -21405,7 +22883,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" @@ -21422,7 +22899,6 @@ "version": "11.7.6", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", - "dev": true, "license": "MIT", "dependencies": { "browser-stdout": "^1.3.1", @@ -21455,11 +22931,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/brace-expansion": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -21469,7 +22953,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" @@ -21485,7 +22968,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -21496,28 +22978,16 @@ "node": ">=12" } }, - "node_modules/mocha/node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/mocha/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/mocha/node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.2" @@ -21533,7 +23003,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 14.18.0" @@ -21547,7 +23016,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -21558,11 +23026,22 @@ "node": ">=8" } }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -21578,7 +23057,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -21596,7 +23074,6 @@ "version": "17.7.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", - "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -21611,16 +23088,6 @@ "node": ">=12" } }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/modern-tar": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.7.tgz", @@ -21635,7 +23102,6 @@ "version": "0.55.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", - "dev": true, "license": "MIT", "dependencies": { "dompurify": "3.2.7", @@ -21751,7 +23217,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true, "license": "MIT" }, "node_modules/node-emoji": { @@ -22201,7 +23666,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -22217,7 +23681,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -22302,7 +23765,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -22364,7 +23826,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pako": { @@ -22629,7 +24090,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -22699,7 +24159,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -22716,7 +24175,6 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, "license": "ISC" }, "node_modules/path-to-regexp": { @@ -22728,6 +24186,12 @@ "isarray": "0.0.1" } }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -22876,60 +24340,20 @@ "node": ">=16.0.0" } }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/plugin-error/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, "node_modules/portfinder": { @@ -22947,9 +24371,9 @@ } }, "node_modules/postcss": { - "version": "8.5.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.21.tgz", - "integrity": "sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==", + "version": "8.5.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.22.tgz", + "integrity": "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==", "funding": [ { "type": "opencollective", @@ -23072,6 +24496,116 @@ "postcss": "^8.4" } }, + "node_modules/postcss-color-functional-notation/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-color-functional-notation/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/postcss-color-hex-alpha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", @@ -23147,21 +24681,160 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-media/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-custom-media/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-custom-properties/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=18" } }, - "node_modules/postcss-custom-media": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", - "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", "funding": [ { "type": "github", @@ -23177,7 +24850,7 @@ "@csstools/cascade-layer-name-parser": "^2.0.5", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": ">=18" @@ -23186,10 +24859,10 @@ "postcss": "^8.4" } }, - "node_modules/postcss-custom-properties": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", - "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "node_modules/postcss-custom-selectors/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "funding": [ { "type": "github", @@ -23201,24 +24874,17 @@ } ], "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/utilities": "^2.0.0", - "postcss-value-parser": "^4.2.0" - }, "engines": { "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/postcss-custom-selectors": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", - "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "node_modules/postcss-custom-selectors/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "funding": [ { "type": "github", @@ -23230,17 +24896,8 @@ } ], "license": "MIT", - "dependencies": { - "@csstools/cascade-layer-name-parser": "^2.0.5", - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "postcss-selector-parser": "^7.0.0" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" } }, "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { @@ -23546,6 +25203,116 @@ "postcss": "^8.4" } }, + "node_modules/postcss-lab-function/node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss-lab-function/node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-lab-function/node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-lab-function/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/postcss-lab-function/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/postcss-loader": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", @@ -24803,15 +26570,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -25022,19 +26780,26 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/readdir-glob": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", @@ -25094,7 +26859,6 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, "license": "MIT", "dependencies": { "resolve": "^1.20.0" @@ -25443,6 +27207,15 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", @@ -25530,6 +27303,18 @@ "entities": "^2.0.0" } }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/replace-ext": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", @@ -25550,73 +27335,32 @@ "node": ">= 10.13.0" } }, - "node_modules/replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/replacestream/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/replacestream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/replacestream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/replacestream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "dependencies": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } }, - "node_modules/replacestream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/replacestream/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=0.8.0" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -25689,7 +27433,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" @@ -25716,7 +27459,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -25814,7 +27556,6 @@ "version": "6.1.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "glob": "^13.0.3", @@ -25834,7 +27575,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -25844,7 +27584,6 @@ "version": "5.0.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", - "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -25857,7 +27596,6 @@ "version": "13.0.6", "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "minimatch": "^10.2.2", @@ -25875,7 +27613,6 @@ "version": "11.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -25885,7 +27622,6 @@ "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" @@ -25901,7 +27637,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -25988,23 +27723,9 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/safe-regex2": { @@ -26089,6 +27810,23 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -26102,6 +27840,27 @@ "node": ">=4" } }, + "node_modules/section-matter/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/section-matter/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", @@ -26269,6 +28028,15 @@ "range-parser": "1.2.0" } }, + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", @@ -26737,7 +28505,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", - "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "^0.6.3", @@ -26899,6 +28666,20 @@ "wbuf": "^1.7.3" } }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -26983,12 +28764,12 @@ } }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string-argv": { @@ -27023,7 +28804,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -27034,38 +28814,31 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/stringify-entities": { @@ -27097,15 +28870,18 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -27113,7 +28889,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -27122,6 +28897,15 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -27287,6 +29071,25 @@ "node": ">= 10" } }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, "node_modules/swc-loader": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.7.tgz", @@ -27538,46 +29341,6 @@ "xtend": "~4.0.1" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -27848,7 +29611,6 @@ "version": "9.6.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", - "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", @@ -27873,7 +29635,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -28217,6 +29978,22 @@ "undici-types": "~6.21.0" } }, + "node_modules/unified-engine/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, "node_modules/unified-engine/node_modules/ignore": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", @@ -28267,6 +30044,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unified-engine/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/unified-engine/node_modules/type-fest": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", @@ -28835,19 +30627,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-reporter/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/vfile-reporter/node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -28873,22 +30652,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vfile-reporter/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/vfile-reporter/node_modules/supports-color": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", @@ -29106,23 +30869,23 @@ } }, "node_modules/webdriver": { - "version": "9.29.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.29.1.tgz", - "integrity": "sha512-uhxYap3qQXC9H2V8SDr7vcy0blZETeri4goLwbw1TFq4EZHF1Dv503Zc0PAjfkNQJCD4/rzAyr07+EX72kx1pg==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.30.0.tgz", + "integrity": "sha512-DisY5E8p5zAZyl8pee08p4Vlc91c94Am9oswZaNCgZH5Ewm//FoCZ+tHNppENqooCYjfa/upATbFqGOLuXQkrw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "9.29.1", + "@wdio/config": "9.30.0", "@wdio/logger": "9.29.1", - "@wdio/protocols": "9.29.1", + "@wdio/protocols": "9.30.0", "@wdio/types": "9.29.1", - "@wdio/utils": "9.29.1", + "@wdio/utils": "9.30.0", "deepmerge-ts": "^7.0.3", "https-proxy-agent": "^7.0.6", - "undici": "^6.21.3", - "ws": "^8.8.0" + "undici": "^6.27.0", + "ws": "^8.21.0" }, "engines": { "node": ">=18.20.0" @@ -29163,20 +30926,20 @@ "license": "MIT" }, "node_modules/webdriverio": { - "version": "9.29.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.29.1.tgz", - "integrity": "sha512-UIplAnvbjdE0tucHVR/8Uk0Y7rz72VaEx/s0Tq91fMdXm+m+Za16e+b5tObh4xEEfyCITODPfzgBva9rA+xApQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.30.0.tgz", + "integrity": "sha512-cmV/uSbCvnJ99QejGPVGlzb9MjiSYUts8VjdESnDKvA7JvRMIJK0l807Js7HDK/g6KG7j+D2apsFHGlT7W5UeA==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", - "@wdio/config": "9.29.1", + "@wdio/config": "9.30.0", "@wdio/logger": "9.29.1", - "@wdio/protocols": "9.29.1", + "@wdio/protocols": "9.30.0", "@wdio/repl": "9.16.2", "@wdio/types": "9.29.1", - "@wdio/utils": "9.29.1", + "@wdio/utils": "9.30.0", "archiver": "^7.0.1", "aria-query": "^5.3.0", "cheerio": "^1.0.0-rc.12", @@ -29193,7 +30956,7 @@ "rgb2hex": "0.2.5", "serialize-error": "^12.0.0", "urlpattern-polyfill": "^10.0.0", - "webdriver": "9.29.1" + "webdriver": "9.30.0" }, "engines": { "node": ">=18.20.0" @@ -29339,7 +31102,6 @@ "version": "7.2.1", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.1.tgz", "integrity": "sha512-YwSGbcZdfz12DM8JIseVPr3oBb09IgVCVc4vY3oDvZnI/mALTGPAP1QiqOi4/bBLSJrRHaqDIXeHcNA0+G38aw==", - "dev": true, "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^1.1.0", @@ -29391,7 +31153,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz", "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", - "dev": true, "license": "MIT", "engines": { "node": ">=14.17.0" @@ -29401,7 +31162,6 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -29436,6 +31196,35 @@ } } }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.64.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.64.0.tgz", + "integrity": "sha512-Kw72fgY7Wn+sD8KmtNWSafl1dz0UvAsE/PHs3YVfLiaZuA3HxNm9sRLqAu0ATiBGJvME1PxZXbBZPv5GycDeAw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.64.0", + "@jsonjoy.com/fs-fsa": "4.64.0", + "@jsonjoy.com/fs-node": "4.64.0", + "@jsonjoy.com/fs-node-builtins": "4.64.0", + "@jsonjoy.com/fs-node-to-fsa": "4.64.0", + "@jsonjoy.com/fs-node-utils": "4.64.0", + "@jsonjoy.com/fs-print": "4.64.0", + "@jsonjoy.com/fs-snapshot": "4.64.0", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -29754,7 +31543,6 @@ "version": "9.3.4", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", - "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { @@ -29779,7 +31567,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -29793,18 +31580,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -29815,16 +31609,16 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -29839,21 +31633,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -29995,7 +31774,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -30042,20 +31820,18 @@ } }, "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "dev": true, + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=12" } }, "node_modules/yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "license": "MIT", "dependencies": { "camelcase": "^6.0.0", @@ -30071,7 +31847,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -30084,25 +31859,11 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/yargs/node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -30128,20 +31889,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/yargs/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, + "license": "ISC", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yauzl": { @@ -30169,7 +31924,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -30210,6 +31964,37 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/zip-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/zip-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -30411,6 +32196,102 @@ "js-yaml": "bin/js-yaml.mjs" } }, + "packages/plugins/block-test": { + "name": "@blockly/block-test", + "version": "13.1.0", + "license": "Apache 2.0", + "devDependencies": { + "@blockly/dev-scripts": "^13.1.0" + }, + "peerDependencies": { + "blockly": "^13.1.0" + } + }, + "packages/plugins/dev-scripts": { + "name": "@blockly/dev-scripts", + "version": "13.1.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^8.0.0", + "chalk": "^4.1.2", + "fork-ts-checker-webpack-plugin": "^9.1.0", + "install": "^0.13.0", + "mocha": "^11.7.6", + "rimraf": "^6.1.3", + "source-map-loader": "^5.0.0", + "ts-loader": "^9.6.1", + "webpack": "^5.107.2", + "webpack-cli": "^7.0.3", + "webpack-dev-server": "^5.2.5" + }, + "bin": { + "blockly-scripts": "bin/blockly-scripts.js" + }, + "devDependencies": { + "typescript": "^6.0.3" + }, + "peerDependencies": { + "typescript": "^4.3.2 || ^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/plugins/dev-scripts/node_modules/@babel/code-frame": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", + "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^8.0.0", + "js-tokens": "^10.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/plugins/dev-scripts/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "packages/plugins/dev-scripts/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "license": "MIT" + }, + "packages/plugins/dev-tools": { + "name": "@blockly/dev-tools", + "version": "13.1.0", + "license": "Apache-2.0", + "dependencies": { + "@blockly/block-test": "^13.1.0", + "@blockly/theme-dark": "^13.1.0", + "@blockly/theme-deuteranopia": "^13.1.0", + "@blockly/theme-highcontrast": "^13.1.0", + "@blockly/theme-tritanopia": "^13.1.0", + "chai": "^6.2.2", + "dat.gui": "^0.7.9", + "lodash.assign": "^4.2.0", + "lodash.merge": "^4.6.2", + "monaco-editor": "^0.55.1" + }, + "devDependencies": { + "@blockly/dev-scripts": "^13.1.0", + "@types/dat.gui": "^0.7.13", + "sinon": "^22.0.0" + }, + "peerDependencies": { + "blockly": "^13.1.1" + } + }, "packages/plugins/theme-dark": { "name": "@blockly/theme-dark", "version": "13.1.0", diff --git a/package.json b/package.json index e38201d9cb1..47633b5095e 100644 --- a/package.json +++ b/package.json @@ -18,13 +18,15 @@ "private": true, "workspaces": [ "packages/blockly", + "packages/plugins/block-test", + "packages/plugins/dev-scripts", "packages/plugins/theme-dark", "packages/plugins/theme-deuteranopia", "packages/plugins/theme-hackermode", "packages/plugins/theme-highcontrast", "packages/plugins/theme-modern", "packages/plugins/theme-tritanopia", - "packages/dev-tools", + "packages/plugins/dev-tools", "packages/docs" ], "devDependencies": { diff --git a/packages/plugins/block-test/CHANGELOG.md b/packages/plugins/block-test/CHANGELOG.md new file mode 100644 index 00000000000..514dd14b102 --- /dev/null +++ b/packages/plugins/block-test/CHANGELOG.md @@ -0,0 +1,528 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30) + +### ⚠ BREAKING CHANGES + +* Bump Blockly dependency to v13 (#2704) + +### Bug Fixes + +* Fix block-test under v13 ([#2714](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2714)) + +### Miscellaneous Chores + +* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704)) + + +## [7.0.6](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-test@7.0.5...@blockly/block-test@7.0.6) (2026-04-09) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [7.0.5](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-test@7.0.4...@blockly/block-test@7.0.5) (2026-01-05) + + +### Bug Fixes + +* update plugin URLs to RPF ([#2665](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2665)) ([6c34039](https://github.com/RaspberryPiFoundation/blockly-samples/commit/6c3403960b8070eb8e576bd5702bdb53a09ac475)) + + + +## [7.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-test@7.0.3...@blockly/block-test@7.0.4) (2025-12-19) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [7.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@7.0.2...@blockly/block-test@7.0.3) (2025-12-19) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [7.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@7.0.1...@blockly/block-test@7.0.2) (2025-07-17) + + +### Bug Fixes + +* Add labels to empty statement blocks for drag tests ([285b11e](https://github.com/google/blockly-samples/commit/285b11ebed3b3414904a7661f503989b35491ca9)) + + + +## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@7.0.0...@blockly/block-test@7.0.1) (2025-05-22) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.13...@blockly/block-test@7.0.0) (2025-05-16) + + +### ⚠ BREAKING CHANGES + +* update all plugins to blockly v12 (#2538) + +### Features + +* update all plugins to blockly v12 ([#2538](https://github.com/google/blockly-samples/issues/2538)) ([420ba31](https://github.com/google/blockly-samples/commit/420ba3124b260b2c06e8e1d61be44e870780d95f)) + + + +## [6.0.13](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.12...@blockly/block-test@6.0.13) (2025-05-16) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.12](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.11...@blockly/block-test@6.0.12) (2025-05-15) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.11](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.10...@blockly/block-test@6.0.11) (2024-12-03) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.10](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.9...@blockly/block-test@6.0.10) (2024-11-07) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.9](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.8...@blockly/block-test@6.0.9) (2024-09-26) + + +### Bug Fixes + +* **field-*:** Remove unneeded `fieldRegistry.unregister` calls ([#2454](https://github.com/google/blockly-samples/issues/2454)) ([b3ba30e](https://github.com/google/blockly-samples/commit/b3ba30e23dddf0bd98c266659aa229ba6ba685b0)), closes [#2453](https://github.com/google/blockly-samples/issues/2453) + + + + + +## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.7...@blockly/block-test@6.0.8) (2024-08-29) + + +### Bug Fixes + +* predeploy plugins ([#2449](https://github.com/google/blockly-samples/issues/2449)) ([6b36d8b](https://github.com/google/blockly-samples/commit/6b36d8b344a969f79d89bbc7dcee29ae554759f9)) + + + + + +## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.6...@blockly/block-test@6.0.7) (2024-08-22) + + +### Bug Fixes + +* lerna v8 breaking our whole shebangle ([#2446](https://github.com/google/blockly-samples/issues/2446)) ([b8b4c21](https://github.com/google/blockly-samples/commit/b8b4c21d4eaf81f527336ae46f6679ff99ac23c3)) + + + + + +## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.5...@blockly/block-test@6.0.6) (2024-08-08) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.4...@blockly/block-test@6.0.5) (2024-08-01) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.3...@blockly/block-test@6.0.4) (2024-07-11) + + +### Reverts + +* Revert "chore(deps): Bump the npm_and_yarn group across 54 directories with 19 updates (#2403)" (#2410) ([bad8ffb](https://github.com/google/blockly-samples/commit/bad8ffbf85caa4e5b68d2f010cd0deaa9e3dd98f)), closes [#2403](https://github.com/google/blockly-samples/issues/2403) [#2410](https://github.com/google/blockly-samples/issues/2410) + + + +## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.2...@blockly/block-test@6.0.3) (2024-07-04) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.1...@blockly/block-test@6.0.2) (2024-06-06) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@6.0.0...@blockly/block-test@6.0.1) (2024-05-30) + + +### Bug Fixes + +* multiple blockly instances ([#2375](https://github.com/google/blockly-samples/issues/2375)) ([b231e59](https://github.com/google/blockly-samples/commit/b231e598f2f5f5b0abbfd01d981e35572ad50a26)) + + + +## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.1.3...@blockly/block-test@6.0.0) (2024-05-21) + + +### ⚠ BREAKING CHANGES + +* update all plugins to v11 of blockly + +### Features + +* update all plugins to v11 of blockly ([5fcd3e7](https://github.com/google/blockly-samples/commit/5fcd3e7d53eaadffe9bda9a378b404d34b2f8be2)) + + +### Bug Fixes + +* Call blocks handle both manual disabling and disabled defs ([#2334](https://github.com/google/blockly-samples/issues/2334)) ([5eade55](https://github.com/google/blockly-samples/commit/5eade55779c4022d14ad4472ff32c93c78199887)) + + + +## [5.1.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.1.2...@blockly/block-test@5.1.3) (2024-05-16) + + +### Bug Fixes + +* **block-test:** Fix incorrect references to Blockly.prompt ([#2344](https://github.com/google/blockly-samples/issues/2344)) ([3684d45](https://github.com/google/blockly-samples/commit/3684d452b8188d0ffaf7aefc7122a8ee4dec6305)) +* remove angle fields from block-test ([#2346](https://github.com/google/blockly-samples/issues/2346)) ([337ce75](https://github.com/google/blockly-samples/commit/337ce75ab72a74b6c9c2551f92442cbf848a5e90)) + + + +## [5.1.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.1.1...@blockly/block-test@5.1.2) (2024-05-09) + + +### Bug Fixes + +* Fix incorrect Blockly imports ([#2339](https://github.com/google/blockly-samples/issues/2339)) ([9af40b9](https://github.com/google/blockly-samples/commit/9af40b9ca075275af2b48cedcc1750d458084eb3)) + + + +## [5.1.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.1.0...@blockly/block-test@5.1.1) (2024-04-04) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [5.1.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.0.4...@blockly/block-test@5.1.0) (2024-02-08) + + +### Features + +* add chameleon test block ([#2193](https://github.com/google/blockly-samples/issues/2193)) ([435f282](https://github.com/google/blockly-samples/commit/435f28200f75362afce241922bb233f9fad9a36d)) + + + +## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.0.3...@blockly/block-test@5.0.4) (2023-12-14) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.0.2...@blockly/block-test@5.0.3) (2023-11-09) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.0.1...@blockly/block-test@5.0.2) (2023-11-02) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@5.0.0...@blockly/block-test@5.0.1) (2023-10-30) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@4.0.2...@blockly/block-test@5.0.0) (2023-07-24) + + +### ⚠ BREAKING CHANGES + +* update dyanamic connection and test block plugins to blockly v10 (#1812) + +### Bug Fixes + +* update dyanamic connection and test block plugins to blockly v10 ([#1812](https://github.com/google/blockly-samples/issues/1812)) ([37a2a4d](https://github.com/google/blockly-samples/commit/37a2a4d868f9707a055d08f204003bfb54af7d4c)) + + + +## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@4.0.1...@blockly/block-test@4.0.2) (2023-07-20) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@4.0.0...@blockly/block-test@4.0.1) (2023-07-13) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.1.3...@blockly/block-test@4.0.0) (2023-06-28) + + +### ⚠ BREAKING CHANGES + +* update all plugins to use blockly-v10.0.0 (#1744) + +### Features + +* update all plugins to use blockly-v10.0.0 ([#1744](https://github.com/google/blockly-samples/issues/1744)) ([6cc88cb](https://github.com/google/blockly-samples/commit/6cc88cbef39d4ad664a668d3d46eb29ba7292f9c)) + + + +## [3.1.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.1.2...@blockly/block-test@3.1.3) (2023-06-22) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.1.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.1.1...@blockly/block-test@3.1.2) (2023-05-18) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.1.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.1.0...@blockly/block-test@3.1.1) (2023-05-11) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.1.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.9...@blockly/block-test@3.1.0) (2023-05-04) + + +### Features + +* add test block with resizable block in mutator ([#1638](https://github.com/google/blockly-samples/issues/1638)) ([ce6bebf](https://github.com/google/blockly-samples/commit/ce6bebfb7856950918ea1f0f48a5dce729354674)) + + + +## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.8...@blockly/block-test@3.0.9) (2023-04-27) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.7...@blockly/block-test@3.0.8) (2023-03-23) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.6...@blockly/block-test@3.0.7) (2023-03-09) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.5...@blockly/block-test@3.0.6) (2023-03-02) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.4...@blockly/block-test@3.0.5) (2023-02-16) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.3...@blockly/block-test@3.0.4) (2023-02-09) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.2...@blockly/block-test@3.0.3) (2023-01-05) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.1...@blockly/block-test@3.0.2) (2022-12-15) + + +### Bug Fixes + +* Don't use private fields to access the workspace flyout buttons are on. ([#1458](https://github.com/google/blockly-samples/issues/1458)) ([742ce59](https://github.com/google/blockly-samples/commit/742ce5932736a3859b0b45e34b1716d7a9b5dd81)) + + + +## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-test@3.0.0...@blockly/block-test@3.0.1) (2022-10-13) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-test@2.0.18...@blockly/block-test@3.0.0) (2022-10-05) + + +### ⚠ BREAKING CHANGES + +* update peer and devDependencies of all plugins to require Blockly v9 (#1314) + +### Bug Fixes + +* block-test unregister warning ([#1280](https://github.com/google/blockly-samples/issues/1280)) ([2e20697](https://github.com/google/blockly-samples/commit/2e20697f74c14410eb873a4e8c93832e8c4429b8)) +* references to deprecated functions in v9 ([#1313](https://github.com/google/blockly-samples/issues/1313)) ([cb2e679](https://github.com/google/blockly-samples/commit/cb2e67987e0b62a77c26adc660cc6ade1ba67954)) + + +### Miscellaneous Chores + +* update peer and devDependencies of all plugins to require Blockly v9 ([#1314](https://github.com/google/blockly-samples/issues/1314)) ([03d4912](https://github.com/google/blockly-samples/commit/03d4912c42c8de0f30493037ccc28dddaea0f266)) + + + +## 2.0.18 (2022-08-11) + + +### Bug Fixes + +* Remove the deprecated block-extension-tooltip ([#1215](https://github.com/google/blockly-samples/issues/1215)) ([a044478](https://github.com/google/blockly-samples/commit/a044478c86a73e3065bc866e427f175cbec6fc13)) + + + + + +## 2.0.17 (2022-08-04) + + +### Bug Fixes + +* fix the name of the package of suggested-blocks ([#1214](https://github.com/google/blockly-samples/issues/1214)) ([35aa8ec](https://github.com/google/blockly-samples/commit/35aa8ec73a60a4eb5b1e80cb2fc71dcd83d05e27)) + + + + + +## 2.0.15 (2022-07-21) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## 2.0.14 (2022-07-06) + + +### Bug Fixes + +* Update blockly-react to use functional components instead of class components. ([#1178](https://github.com/google/blockly-samples/issues/1178)) ([fa21187](https://github.com/google/blockly-samples/commit/fa21187cdbe4ec3a5c69f185540dd68a98eb69d7)) + + + + + +## 2.0.13 (2022-06-27) + + +### Bug Fixes + +* Update package import for keyboard navigation demo ([#1170](https://github.com/google/blockly-samples/issues/1170)) ([69c1725](https://github.com/google/blockly-samples/commit/69c1725b775279fcc397dc178935208d5f42b08c)) + + + + + +## 2.0.12 (2022-06-21) + +**Note:** Version bump only for package @blockly/block-test + + + + + +## 2.0.11 (2022-06-08) + + +### Bug Fixes + +* package versions to support patch releases ([#1150](https://github.com/google/blockly-samples/issues/1150)) ([e1ae378](https://github.com/google/blockly-samples/commit/e1ae378d779531621c3d948566257d069002963f)) + + + + + +## 2.0.10 (2022-06-02) + + +### Bug Fixes + +* add git identity ([#1156](https://github.com/google/blockly-samples/issues/1156)) ([8d80924](https://github.com/google/blockly-samples/commit/8d809243b277375beb2ce75d4e157b5e17f78193)) diff --git a/packages/plugins/block-test/README.md b/packages/plugins/block-test/README.md new file mode 100644 index 00000000000..d97290898e6 --- /dev/null +++ b/packages/plugins/block-test/README.md @@ -0,0 +1,39 @@ +# @blockly/block-test [![Built on Blockly](https://tinyurl.com/built-on-blockly)](https://github.com/google/blockly) + +A set of [Blockly](https://www.npmjs.com/package/blockly) test blocks. + +## Installation + +### Yarn + +``` +yarn add @blockly/block-test +``` + +### npm + +``` +npm install @blockly/block-test --save +``` + +## Usage + +### Import + +```js +import * as Blockly from 'blockly'; +import {toolboxTestBlocks, toolboxTestBlocksInit} from '@blockly/block-test'; + +// Configure the Blockly workspace to use the test block's toolbox. +const workspace = Blockly.inject('blocklyDiv', { + ...options + toolbox: toolboxTestBlocks, +}); + +// Initalize the test block's toolbox. +toolboxTestBlocksInit(workspace); +``` + +## License + +Apache 2.0 diff --git a/packages/plugins/block-test/package.json b/packages/plugins/block-test/package.json new file mode 100644 index 00000000000..1aaecdb3593 --- /dev/null +++ b/packages/plugins/block-test/package.json @@ -0,0 +1,50 @@ +{ + "name": "@blockly/block-test", + "version": "13.1.0", + "description": "A group of Blockly test blocks.", + "scripts": { + "audit:fix": "blockly-scripts auditFix", + "build": "blockly-scripts build", + "clean": "blockly-scripts clean", + "lint": "eslint .", + "prepublishOnly": "npm run clean && npm run build", + "start": "blockly-scripts start" + }, + "main": "./dist/index.js", + "module": "./src/index.js", + "unpkg": "./dist/index.js", + "author": "Blockly Team", + "keywords": [ + "blockly", + "blockly-plugin", + "blockly-block", + "test" + ], + "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/block-test#readme", + "bugs": { + "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git", + "directory": "plugins/block-test" + }, + "license": "Apache 2.0", + "directories": { + "dist": "dist", + "src": "src" + }, + "files": [ + "dist", + "src" + ], + "devDependencies": { + "@blockly/dev-scripts": "^13.1.0" + }, + "peerDependencies": { + "blockly": "^13.1.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/plugins/block-test/src/align.js b/packages/plugins/block-test/src/align.js new file mode 100644 index 00000000000..235728ca4c3 --- /dev/null +++ b/packages/plugins/block-test/src/align.js @@ -0,0 +1,109 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Align test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_align_dummy_right', + message0: 'text right %1 long text right %2', + args0: [ + { + type: 'input_dummy', + align: 'RIGHT', + }, + { + type: 'input_dummy', + align: 'RIGHT', + }, + ], + style: 'math_blocks', + }, + { + type: 'test_align_all', + message0: + 'text %1 long text left %2 text centre %3 much longer text ' + 'right %4', + args0: [ + { + type: 'input_dummy', + }, + { + type: 'input_dummy', + align: 'LEFT', + }, + { + type: 'input_dummy', + align: 'CENTRE', + }, + { + type: 'input_dummy', + align: 'RIGHT', + }, + ], + style: 'math_blocks', + }, + { + type: 'test_align_with_external_input', + message0: + 'text right %1 long text centre %2 text left %3 much longer ' + 'text %4', + args0: [ + { + type: 'input_dummy', + align: 'RIGHT', + }, + { + type: 'input_dummy', + align: 'CENTRE', + }, + { + type: 'input_dummy', + align: 'LEFT', + }, + { + type: 'input_value', + name: 'VALUE', + }, + ], + inputsInline: false, + style: 'math_blocks', + }, +]); + +/** + * The Align category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Align', + contents: [ + { + kind: 'BLOCK', + type: 'test_align_dummy_right', + }, + { + kind: 'BLOCK', + type: 'test_align_all', + }, + { + kind: 'BLOCK', + type: 'test_align_with_external_input', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/basic.js b/packages/plugins/block-test/src/basic.js new file mode 100644 index 00000000000..68d09312585 --- /dev/null +++ b/packages/plugins/block-test/src/basic.js @@ -0,0 +1,219 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Basic test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_basic_empty', + message0: '', + args0: [], + }, + { + type: 'test_basic_stack', + message0: 'stack block', + previousStatement: null, + nextStatement: null, + colour: '120', + }, + { + type: 'test_basic_dummy', + message0: 'dummy input %1', + args0: [ + { + type: 'input_dummy', + }, + ], + style: 'math_blocks', + }, + { + type: 'test_basic_multiple_dummy', + message0: 'first dummy %1 second dummy %2', + args0: [ + { + type: 'input_dummy', + }, + { + type: 'input_dummy', + }, + ], + style: 'math_blocks', + }, + { + type: 'test_basic_row', + message0: 'row block %1', + args0: [ + { + type: 'input_value', + name: 'INPUT', + }, + ], + output: null, + style: 'math_blocks', + }, + { + type: 'test_basic_value_to_stack', + message0: 'value to stack', + nextStatement: null, + output: null, + style: 'math_blocks', + }, + { + type: 'test_basic_value_to_statement', + message0: 'value to statement %1', + args0: [ + { + type: 'input_statement', + name: 'STATEMENT', + }, + ], + output: null, + style: 'math_blocks', + }, + { + type: 'test_basic_limit_instances', + message0: 'limit 3 instances %1 %2', + args0: [ + { + type: 'input_dummy', + }, + { + type: 'input_statement', + name: 'STATEMENT', + }, + ], + previousStatement: null, + nextStatement: null, + style: 'math_blocks', + }, + { + type: 'test_basic_tooltips', + message0: '%1 %2 %3', + args0: [ + { + type: 'field_label', + name: 'NAME', + text: 'field tooltip', + tooltip: 'This is a JSON tooltip for the *field*.', + }, + { + type: 'input_dummy', + }, + { + type: 'field_label', + name: 'NAME', + text: 'block tooltip', + }, + ], + tooltip: 'This is a JSON tooltip for the *block*.', + style: 'math_blocks', + }, + { + type: 'test_basic_javascript', + message0: 'function %1(%2) { %3 %4 return %5 }', + args0: [ + 'foo', + 'args', + { + type: 'input_dummy', + }, + { + type: 'input_statement', + name: 'STACK', + }, + { + type: 'input_value', + check: 'number', + align: 'right', + name: 'RETURN', + }, + ], + inputsInline: true, + colour: 200, + tooltip: 'Hello world.', + }, +]); + +Blockly.Blocks['test_basic_empty_with_mutator'] = { + init: function () { + this.setMutator(new Blockly.icons.MutatorIcon(['math_number'], this)); + }, + + decompose: function (workspace) { + const topBlock = workspace.newBlock('math_number'); + topBlock.initSvg(); + return topBlock; + }, + compose: function () {}, +}; + +/** + * The Basic Category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Basic', + contents: [ + { + kind: 'BLOCK', + type: 'test_basic_empty', + }, + { + kind: 'BLOCK', + type: 'test_basic_empty_with_mutator', + }, + { + kind: 'BLOCK', + type: 'test_basic_dummy', + }, + { + kind: 'BLOCK', + type: 'test_basic_multiple_dummy', + }, + { + kind: 'BLOCK', + type: 'test_basic_stack', + }, + { + kind: 'BLOCK', + type: 'test_basic_row', + }, + { + kind: 'BLOCK', + type: 'test_basic_value_to_stack', + }, + { + kind: 'BLOCK', + type: 'test_basic_value_to_statement', + }, + { + kind: 'BLOCK', + type: 'test_basic_limit_instances', + }, + { + kind: 'BLOCK', + type: 'test_basic_tooltips', + }, + { + kind: 'BLOCK', + type: 'test_basic_javascript', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/chameleon.js b/packages/plugins/block-test/src/chameleon.js new file mode 100644 index 00000000000..00754aab84a --- /dev/null +++ b/packages/plugins/block-test/src/chameleon.js @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Blocks that have both a previous connection and an output + * connection while they are being dragged. + */ + +import * as Blockly from 'blockly/core'; + +Blockly.Blocks['test_chameleon'] = { + hasOutput: true, + hasPrevious: true, + + init: function () { + this.appendDummyInput().appendField('chameleon'); + this.setColour(120); + this.updateShape(); + }, + + onchange: function (e) { + if (e.type === Blockly.Events.BLOCK_DRAG) { + console.log('got drag event'); + this.hasPrevious = + !this.outputConnection || !this.outputConnection.targetBlock(); + this.hasOutput = !this.getPreviousBlock(); + this.updateShape(); + } + }, + + updateShape: function () { + this.setPreviousStatement(this.hasPrevious); + this.setOutput(this.hasOutput); + }, +}; + +/** + * The Chameleon Category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Chameleon', + contents: [ + { + kind: 'BLOCK', + type: 'test_chameleon', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/connections/index.js b/packages/plugins/block-test/src/connections/index.js new file mode 100644 index 00000000000..7e961093085 --- /dev/null +++ b/packages/plugins/block-test/src/connections/index.js @@ -0,0 +1,38 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Connection test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import {category as rowCategory, onInit as initRow} from './row'; +import {category as stackCategory, onInit as initStack} from './stack'; +import { + category as statementCategory, + onInit as initStatement, +} from './statement'; + +/** + * The Connections category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Connections', + expanded: 'true', + contents: [rowCategory, stackCategory, statementCategory], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + initRow(workspace); + initStack(workspace); + initStatement(workspace); +} diff --git a/packages/plugins/block-test/src/connections/row.js b/packages/plugins/block-test/src/connections/row.js new file mode 100644 index 00000000000..8f879c3255d --- /dev/null +++ b/packages/plugins/block-test/src/connections/row.js @@ -0,0 +1,290 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Row connection test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_connections_row_input', + message0: '%1', + args0: [ + { + type: 'input_value', + name: 'NAME', + }, + ], + colour: '#aaaaaa', + tooltip: 'No Checks\n' + 'Can connect to any output connection.', + }, + { + type: 'test_connections_row_blue', + message0: '%1', + args0: [ + { + type: 'input_value', + name: 'NAME', + check: 'greenRel', + }, + ], + output: 'noneOut', + colour: 230, + tooltip: + 'Output: noneOut\n' + + 'Input: greenRel\n' + + 'Input connection can accept yellow blocks but not red blocks.', + }, + { + type: 'test_connections_row_yellow', + message0: '%1', + args0: [ + { + type: 'input_value', + name: 'NAME', + check: ['orangeRel', 'yellowRel'], + }, + ], + output: ['yellowRel', 'greenRel'], + colour: 60, + tooltip: + 'Output: yellowRel, greenRel\n' + + 'Input: yellowRel, orangeRel\n' + + 'Output can connect to yellow blocks and blue blocks, but not red ' + + 'blocks.\n' + + 'Input can connect to yellow blocks and red blocks, but not blue ' + + 'blocks.', + }, + { + type: 'test_connections_row_red', + message0: '%1', + args0: [ + { + type: 'input_value', + name: 'NAME', + check: 'noneIn', + }, + ], + output: 'orangeRel', + colour: 0, + tooltip: + 'Output: orangeRel\n' + + 'Input: noneIn\n' + + 'Output can connect to yellow blocks, but not blue blocks.', + }, + { + type: 'test_connections_row_output', + message0: '', + output: null, + colour: '#aaaaaa', + tooltip: 'No Checks\n' + 'Can connect to any input connection.', + }, + + { + type: 'test_connections_multivalue_1valid', + message0: 'none %1 both %2', + args0: [ + { + type: 'input_value', + name: 'NAME1', + align: 'RIGHT', + check: 'noneIn', + }, + { + type: 'input_value', + name: 'NAME2', + align: 'RIGHT', + check: ['yellowRel', 'orangeRel'], + }, + ], + output: ['yellowRel', 'greenRel'], + colour: 60, + tooltip: + 'Output: yellowRel, greenRel\n' + + 'Input Top: noneIn\n' + + 'Input Bottom: yellowRel, orangeRel\n' + + 'Output can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Top Input can connect to nothing, except grey blocks.\n' + + 'Bottom Input can connect to yellow blocks and red blocks, but not' + + ' blue blocks.', + }, + { + type: 'test_connections_multivalue_2valid', + message0: 'both %1 both %2', + args0: [ + { + type: 'input_value', + name: 'NAME1', + align: 'RIGHT', + check: ['yellowRel', 'orangeRel'], + }, + { + type: 'input_value', + name: 'NAME2', + align: 'RIGHT', + check: ['yellowRel', 'orangeRel'], + }, + ], + output: ['yellowRel', 'greenRel'], + colour: 60, + tooltip: + 'Output: yellowRel, greenRel\n' + + 'Input Top: yellowRel, orangeRel\n' + + 'Input Bottom: yellowRel, orangeRel\n' + + 'Output can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Top Input can connect to yellow blocks and red blocks, but not blue' + + ' blocks.\n' + + 'Bottom Input can connect to yellow blocks and red blocks, but not' + + ' blue blocks.', + }, +]); + +/** + * Handles "insert" button in the connection row test category. This will insert + * a group of test blocks connected in a row. + * @param {!Blockly.FlyoutButton} button The Flyout button. + */ +const insertConnectionRows = function (button) { + const workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace( + Blockly.utils.xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '', + ), + workspace, + ); +}; + +/** + * The Row connections category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Row', + contents: [ + { + kind: 'LABEL', + text: 'blocks have', + }, + { + kind: 'SEP', + gap: '-1', + }, + { + kind: 'LABEL', + text: 'tooltips', + }, + { + kind: 'BUTTON', + text: 'insert', + callbackkey: 'insertConnectionRows', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_row_input', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_row_blue', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_row_yellow', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_row_red', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_row_output', + }, + { + kind: 'BLOCK', + blockxml: ` + + + + + +`, + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_multivalue_1valid', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_multivalue_2valid', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + workspace.registerButtonCallback( + 'insertConnectionRows', + insertConnectionRows, + ); +} diff --git a/packages/plugins/block-test/src/connections/stack.js b/packages/plugins/block-test/src/connections/stack.js new file mode 100644 index 00000000000..d19edae9834 --- /dev/null +++ b/packages/plugins/block-test/src/connections/stack.js @@ -0,0 +1,190 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Stack connection test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_connections_stack_next', + message0: '', + nextStatement: null, + colour: '#aaaaaa', + tooltip: 'No Checks\n' + 'Can connect to any previous connection.', + }, + { + type: 'test_connections_stack_blue', + message0: '', + previousStatement: 'nonePrev', + nextStatement: 'greenRel', + colour: 230, + tooltip: + 'Prev: nonePrev\n' + + 'Next: greenRel\n' + + 'Next connection can accept yellow blocks but not red blocks.', + }, + { + type: 'test_connections_stack_yellow', + message0: '', + previousStatement: ['greenRel', 'yellowRel'], + nextStatement: ['yellowRel', 'orangeRel'], + colour: 60, + tooltip: + 'Prev: yellowRel, greenRel\n' + + 'Next: yellowRel, orangeRel\n' + + 'Prev can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Next can connect to yellow blocks and red blocks, but not blue' + + ' blocks.', + }, + { + type: 'test_connections_stack_red', + message0: '', + previousStatement: 'orangeRel', + nextStatement: 'noneNext', + colour: 0, + tooltip: + 'Prev: orangeRel\n' + + 'Next: noneNext\n' + + 'Prev can connect to yellow blocks, but not blue blocks.', + }, + { + type: 'test_connections_stack_prev', + message0: '', + previousStatement: null, + colour: '#aaaaaa', + tooltip: 'No Checks\n' + 'Can connect to any input connection.', + }, +]); + +/** + * Handles "insert" button in the connection stack test category. This will + * insert a group of test blocks connected in a stack. + * @param {!Blockly.FlyoutButton} button The flyout button. + */ +const insertConnectionStacks = function (button) { + const workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace( + Blockly.utils.xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '', + ), + workspace, + ); +}; + +/** + * The Stack connections category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Stack', + contents: [ + { + kind: 'LABEL', + text: 'blocks have', + }, + { + kind: 'SEP', + gap: '-1', + }, + { + kind: 'LABEL', + text: 'tooltips', + }, + { + kind: 'BUTTON', + text: 'insert', + callbackkey: 'insertConnectionStacks', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_stack_next', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_stack_blue', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_stack_yellow', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_stack_red', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_stack_prev', + }, + { + kind: 'BLOCK', + blockxml: ` + + + + +`, + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + workspace.registerButtonCallback( + 'insertConnectionStacks', + insertConnectionStacks, + ); +} diff --git a/packages/plugins/block-test/src/connections/statement.js b/packages/plugins/block-test/src/connections/statement.js new file mode 100644 index 00000000000..603c52f1808 --- /dev/null +++ b/packages/plugins/block-test/src/connections/statement.js @@ -0,0 +1,267 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Statement connection test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_connections_statement_blue', + message0: 'Blue %1', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: 'greenRel', + }, + ], + previousStatement: 'nonePrev', + nextStatement: 'greenRel', + colour: 230, + tooltip: + 'Prev: nonePrev\n' + + 'Next: greenRel\n' + + 'Statement: greenRel\n' + + 'Next connection can accept yellow blocks but not red blocks.\n' + + 'Statement connection can accept yellow blocks but not red blocks.', + }, + { + type: 'test_connections_statement_yellow', + message0: 'Yellow %1', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: ['yellowRel', 'orangeRel'], + }, + ], + previousStatement: ['greenRel', 'yellowRel'], + nextStatement: ['yellowRel', 'orangeRel'], + colour: 60, + tooltip: + 'Prev: yellowRel, greenRel\n' + + 'Next: yellowRel, orangeRel\n' + + 'Statement: orangeRel\n' + + 'Prev can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Next can connect to yellow blocks and red blocks, but not blue' + + ' blocks.\n' + + 'Statement connection can accept yellow blocks and red blocks but not' + + ' blue blocks.\n', + }, + { + type: 'test_connections_statement_red', + message0: 'Red %1', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: 'noneNext', + }, + ], + previousStatement: 'orangeRel', + nextStatement: 'noneNext', + colour: 0, + tooltip: + 'Prev: orangeRel\n' + + 'Next: noneNext\n' + + 'Statement: noneNext\n' + + 'Prev connection can accept yellow blocks but not blue blocks.\n' + + 'Statement connection accepts none.', + }, + { + type: 'test_connections_statement_nonext', + message0: 'None %1', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: ['yellowRel', 'orangeRel'], + }, + ], + previousStatement: ['greenRel', 'yellowRel'], + colour: 60, + tooltip: + 'Prev: yellowRel, greenRel\n' + + 'Next: yellowRel, orangeRel\n' + + 'Statement: orangeRel\n' + + 'Prev can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Statement connection can accept yellow blocks and red blocks but not' + + ' blue blocks.\n', + }, + { + type: 'test_connections_multistatement_1valid', + message0: 'none %1 both %2', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: 'noneNext', + }, + { + type: 'input_statement', + name: 'NAME', + check: ['yellowRel', 'orangeRel'], + }, + ], + previousStatement: ['greenRel', 'yellowRel'], + colour: 60, + tooltip: + 'Prev: yellowRel, greenRel\n' + + 'Next: yellowRel, orangeRel\n' + + 'Statement: orangeRel\n' + + 'Prev can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Top Statement cannot connect to anything, except grey blocks.\n' + + 'Bottom Statement connection can accept yellow blocks and red blocks' + + ' but not blue blocks.\n', + }, + { + type: 'test_connections_multistatement_2valid', + message0: 'both %1 both %2', + args0: [ + { + type: 'input_statement', + name: 'NAME', + check: ['yellowRel', 'orangeRel'], + }, + { + type: 'input_statement', + name: 'NAME', + check: ['yellowRel', 'orangeRel'], + }, + ], + previousStatement: ['greenRel', 'yellowRel'], + colour: 60, + tooltip: + 'Prev: yellowRel, greenRel\n' + + 'Next: yellowRel, orangeRel\n' + + 'Statement: orangeRel\n' + + 'Prev can connect to yellow blocks and blue blocks, but not red' + + ' blocks.\n' + + 'Top Statement connection can accept yellow blocks and red blocks but' + + ' not blue blocks.\n' + + 'Bottom Statement connection can accept yellow blocks and red blocks' + + ' but not blue blocks.\n', + }, +]); + +/** + * Handles "insert" button in the connection statement test category. This will + * insert a group of test blocks connected as statements. + * @param {!Blockly.FlyoutButton} button The flyout button. + */ +const insertConnectionStatements = function (button) { + const workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace( + Blockly.utils.xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '', + ), + workspace, + ); +}; + +/** + * The Statement connections category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Statement', + contents: [ + { + kind: 'LABEL', + text: 'blocks have', + }, + { + kind: 'SEP', + gap: '-1', + }, + { + kind: 'LABEL', + text: 'tooltips', + }, + { + kind: 'BUTTON', + text: 'insert', + callbackkey: 'insertConnectionStatements', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_statement_blue', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_statement_yellow', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_statement_red', + }, + { + kind: 'BLOCK', + type: 'test_connections_statement_nonext', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_multistatement_1valid', + }, + { + kind: 'SEP', + gap: '7', + }, + { + kind: 'BLOCK', + type: 'test_connections_multistatement_2valid', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + workspace.registerButtonCallback( + 'insertConnectionStatements', + insertConnectionStatements, + ); +} diff --git a/packages/plugins/block-test/src/drag.js b/packages/plugins/block-test/src/drag.js new file mode 100644 index 00000000000..1eac79eeeef --- /dev/null +++ b/packages/plugins/block-test/src/drag.js @@ -0,0 +1,261 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Drag test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +/** Block that duplicates itself on drag. */ +Blockly.Blocks['drag_to_dupe'] = { + init: function () { + this.setOutput(true, null); + this.appendDummyInput().appendField('drag to dupe'); + this.setDragStrategy(new DragToDupe(this)); + + this.cloningAllowed = true; + this.isCloningAllowed = () => { + return this.cloningAllowed && !this.isInFlyout && !this.isShadow(); + }; + this.setCloningAllowed = (/** @type {boolean} */ allowed) => { + this.cloningAllowed = allowed; + }; + }, +}; + +/** Drag strategy that duplicates the block on drag. */ +class DragToDupe extends Blockly.dragging.BlockDragStrategy { + /** + * Creates a new `DragToDupe` drag strategy. + * @param {!Blockly.BlockSvg} block The block that will be dragged. + */ + constructor(block) { + super(block); + this.draggingBlock = block; + } + + /** + * Returns a block instance on which the drag should actually be performed, + * which may differ from that which we were instantiated with. + * @returns {!Blockly.BlockSvg} The block to drag. + */ + getTargetBlock() { + let targetBlock; + + if ( + 'isCloningAllowed' in this.draggingBlock && + typeof this.draggingBlock.isCloningAllowed === 'function' && + this.draggingBlock.isCloningAllowed() + ) { + const json = Blockly.serialization.blocks.save(this.draggingBlock, { + addCoordinates: true, + }); + if (json) { + targetBlock = /** @type {!Blockly.BlockSvg} */ ( + Blockly.serialization.blocks.appendInternal( + json, + this.draggingBlock.workspace, + { + recordUndo: true, + }, + ) + ); + } + } + + targetBlock ??= super.getTargetBlock(); + this.maybeSetCloningAllowed(targetBlock, false); + return targetBlock; + } + + /** + * Handles the end of a drag. + * @param {!PointerEvent|!KeyboardEvent} event The event that triggered the + * end of the drag. + * @param {Blockly.DragDisposition} disposition How the drag is being ended. + */ + endDrag(event, disposition) { + super.endDrag(event, disposition); + this.maybeSetCloningAllowed(this.draggingBlock, true); + + if (disposition === Blockly.DragDisposition.REVERT) { + this.draggingBlock.dispose(); + } + } + + /** + * Handles a drag being reverted/cancelled. + */ + revertDrag() { + super.revertDrag(); + if ( + 'isCloningAllowed' in this.draggingBlock && + typeof this.draggingBlock.isCloningAllowed === 'function' + ) { + this.draggingBlock.dispose(); + } + } + + /** + * If supported, sets whether or not cloning the given block is allowed. + * @param {!Blockly.BlockSvg} block The block to toggle cloning on. + * @param {boolean} allowed Whether or not cloning should be allowed. + */ + maybeSetCloningAllowed(block, allowed) { + if ( + 'setCloningAllowed' in block && + typeof block.setCloningAllowed === 'function' + ) { + block.setCloningAllowed(allowed); + } + } +} + +/** + * The Drag category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Drag', + contents: [ + { + kind: 'LABEL', + text: 'Drag each to the workspace', + }, + { + kind: 'BLOCK', + blockxml: ` + + + + Drag me by this child + + +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + + + Drag me by this shadow + + +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + + + Shadow value + + + + + + + Shadow statement + + + + +`, + }, + { + kind: 'LABEL', + text: 'Multiple Variable Refs', + }, + { + kind: 'BLOCK', + blockxml: ` + + + + item + + + + + + + item + + + + +`, + }, + { + kind: 'LABEL', + text: 'Procedure Definitions', + }, + { + kind: 'BLOCK', + blockxml: ` + + without arguments + + + + + No argument reference. + + + + +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + + with one argument + + + + + Expected an argument reference here. + + + fnArgument + + + + +`, + }, + { + kind: 'BLOCK', + type: 'drag_to_dupe', + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'drag_to_dupe', + }, + }, + }, + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/fields/defaults.js b/packages/plugins/block-test/src/fields/defaults.js new file mode 100644 index 00000000000..cf2a9bd9123 --- /dev/null +++ b/packages/plugins/block-test/src/fields/defaults.js @@ -0,0 +1,281 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Default field test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_fields_text_input', + message0: 'text input %1', + args0: [ + { + type: 'field_input', + name: 'TEXT_INPUT', + text: 'default', + }, + ], + style: 'math_blocks', + tooltip: '', + helpUrl: '', + }, + { + type: 'test_fields_only_text_input', + message0: '%1', + args0: [ + { + type: 'field_input', + name: 'TEXT_INPUT', + text: 'default', + }, + ], + style: 'textInput', + tooltip: '', + helpUrl: '', + output: 'String', + }, + { + type: 'test_fields_checkbox', + message0: 'checkbox %1', + args0: [ + { + type: 'field_checkbox', + name: 'CHECKBOX', + checked: true, + }, + ], + style: 'math_blocks', + tooltip: '', + helpUrl: '', + }, + { + type: 'test_fields_variable', + message0: 'variable %1', + args0: [ + { + type: 'field_variable', + name: 'VARIABLE', + variable: 'item', + }, + ], + style: 'math_blocks', + tooltip: '', + helpUrl: '', + }, + { + type: 'test_fields_label_serializable', + message0: 'label serializable %1', + args0: [ + { + type: 'field_label_serializable', + name: 'LABEL', + text: 'default', + }, + ], + style: 'math_blocks', + tooltip: '', + helpUrl: '', + }, + { + type: 'test_fields_image', + message0: 'image %1', + args0: [ + { + type: 'field_image', + name: 'IMAGE', + src: 'https://blockly-demo.appspot.com/static/tests/media/a.png', + width: 32, + height: 32, + alt: 'A', + }, + ], + colour: 230, + }, +]); + +/** + * The Default fields category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Defaults', + contents: [ + { + kind: 'BUTTON', + text: 'add blocks to workspace', + callbackkey: 'addAllBlocksToWorkspace', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'set random style', + callbackkey: 'setRandomStyle', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'toggle enabled', + callbackkey: 'toggleEnabled', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'toggle shadow', + callbackkey: 'toggleShadow', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'toggle collapsed', + callbackkey: 'toggleCollapsed', + }, + { + kind: 'BLOCK', + type: 'test_fields_checkbox', + }, + { + kind: 'BLOCK', + type: 'test_fields_text_input', + }, + { + kind: 'BLOCK', + type: 'test_fields_only_text_input', + }, + { + kind: 'BLOCK', + type: 'test_fields_variable', + }, + { + kind: 'BUTTON', + text: 'randomize label text', + callbackkey: 'randomizeLabelText', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_fields_label_serializable', + }, + { + kind: 'BUTTON', + text: 'change image', + callbackkey: 'changeImage', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_fields_image', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + const randomizeLabelText = function (button) { + const blocks = button + .getTargetWorkspace() + .getBlocksByType('test_fields_label_serializable'); + const possible = 'AB'; + for (let i = 0, block; (block = blocks[i]); i++) { + let text = ''; + for (let j = 0; j < 4; j++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + block.setFieldValue(text, 'LABEL'); + } + }; + const setRandomStyle = function (button) { + const blocks = button + .getTargetWorkspace() + .getFlyout() + .getWorkspace() + .getAllBlocks(false); + const styles = Object.keys( + workspace.getRenderer().getConstants().blockStyles, + ); + styles.splice(styles.indexOf(blocks[0].getStyleName()), 1); + const style = styles[Math.floor(Math.random() * styles.length)]; + for (let i = 0, block; (block = blocks[i]); i++) { + block.setStyle(style); + } + }; + const toggleEnabled = function (button) { + const blocks = button + .getTargetWorkspace() + .getFlyout() + .getWorkspace() + .getAllBlocks(false); + for (let i = 0, block; (block = blocks[i]); i++) { + block.setDisabledReason(block.isEnabled(), 'Toggle block enabled'); + } + }; + const toggleShadow = function (button) { + const blocks = button + .getTargetWorkspace() + .getFlyout() + .getWorkspace() + .getAllBlocks(false); + for (let i = 0, block; (block = blocks[i]); i++) { + block.setShadow(!block.isShadow()); + } + }; + const toggleCollapsed = function (button) { + const blocks = button + .getTargetWorkspace() + .getFlyout() + .getWorkspace() + .getAllBlocks(false); + for (let i = 0, block; (block = blocks[i]); i++) { + block.setCollapsed(!block.isCollapsed()); + } + }; + const changeImage = function (button) { + const blocks = button + .getTargetWorkspace() + .getFlyout() + .getWorkspace() + .getBlocksByType('test_fields_image'); + const possible = 'abcdefghijklm'; + const image = possible.charAt(Math.floor(Math.random() * possible.length)); + const src = + 'https://blockly-demo.appspot.com/static/tests/media/' + image + '.png'; + for (let i = 0, block; (block = blocks[i]); i++) { + const imageField = block.getField('IMAGE'); + imageField.setValue(src); + } + }; + workspace.registerButtonCallback('randomizeLabelText', randomizeLabelText); + workspace.registerButtonCallback('setRandomStyle', setRandomStyle); + workspace.registerButtonCallback('toggleEnabled', toggleEnabled); + workspace.registerButtonCallback('toggleShadow', toggleShadow); + workspace.registerButtonCallback('toggleCollapsed', toggleCollapsed); + workspace.registerButtonCallback('changeImage', changeImage); +} diff --git a/packages/plugins/block-test/src/fields/dropdowns.js b/packages/plugins/block-test/src/fields/dropdowns.js new file mode 100644 index 00000000000..723bbebf674 --- /dev/null +++ b/packages/plugins/block-test/src/fields/dropdowns.js @@ -0,0 +1,591 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Dropdown fields test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_dropdowns_long', + message0: 'long: %1', + args0: [ + { + type: 'field_dropdown', + name: 'FIELDNAME', + options: [ + ['first item', 'ITEM1'], + ['second item', 'ITEM2'], + ['third item', 'ITEM3'], + ['fourth item', 'ITEM4'], + ['fifth item', 'ITEM5'], + ['sixth item', 'ITEM6'], + ['seventh item', 'ITEM7'], + ['eighth item', 'ITEM8'], + ['ninth item', 'ITEM9'], + ['tenth item', 'ITEM10'], + ['eleventh item', 'ITEM11'], + ['twelfth item', 'ITEM12'], + ['thirteenth item', 'ITEM13'], + ['fourteenth item', 'ITEM14'], + ['fifteenth item', 'ITEM15'], + ['sixteenth item', 'ITEM16'], + ['seventeenth item', 'ITEM17'], + ['eighteenth item', 'ITEM18'], + ['nineteenth item', 'ITEM19'], + ['twentieth item', 'ITEM20'], + ['twenty-first item', 'ITEM21'], + ['twenty-second item', 'ITEM22'], + ['twenty-third item', 'ITEM23'], + ['twenty-fourth item', 'ITEM24'], + ['twenty-fifth item', 'ITEM25'], + ['twenty-sixth item', 'ITEM26'], + ['twenty-seventh item', 'ITEM27'], + ['twenty-eighth item', 'ITEM28'], + ['twenty-ninth item', 'ITEM29'], + ['thirtieth item', 'ITEM30'], + ['thirty-first item', 'ITEM31'], + ['thirty-second item', 'ITEM32'], + ], + }, + ], + }, + { + type: 'test_dropdowns_images', + message0: '%1', + args0: [ + { + NOTE: 'The following paths are relative to playground.html', + type: 'field_dropdown', + name: 'FIELDNAME', + options: [ + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/a.png', + width: 32, + height: 32, + alt: 'A', + }, + 'A', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/b.png', + width: 32, + height: 32, + alt: 'B', + }, + 'B', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/c.png', + width: 32, + height: 32, + alt: 'C', + }, + 'C', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/d.png', + width: 32, + height: 32, + alt: 'D', + }, + 'D', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/e.png', + width: 32, + height: 32, + alt: 'E', + }, + 'E', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/f.png', + width: 32, + height: 32, + alt: 'F', + }, + 'F', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/g.png', + width: 32, + height: 32, + alt: 'G', + }, + 'G', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/h.png', + width: 32, + height: 32, + alt: 'H', + }, + 'H', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/i.png', + width: 32, + height: 32, + alt: 'I', + }, + 'I', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/j.png', + width: 32, + height: 32, + alt: 'J', + }, + 'J', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/k.png', + width: 32, + height: 32, + alt: 'K', + }, + 'K', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/l.png', + width: 32, + height: 32, + alt: 'L', + }, + 'L', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/m.png', + width: 32, + height: 32, + alt: 'M', + }, + 'M', + ], + ], + }, + ], + }, + { + type: 'test_dropdowns_images_and_text', + message0: '%1', + args0: [ + { + type: 'field_dropdown', + name: 'FIELDNAME', + options: [ + ['images and text', 'IMAGES AND TEXT'], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/a.png', + width: 32, + height: 32, + alt: 'A', + }, + 'A', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/b.png', + width: 32, + height: 32, + alt: 'B', + }, + 'B', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/c.png', + width: 32, + height: 32, + alt: 'C', + }, + 'C', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/d.png', + width: 32, + height: 32, + alt: 'D', + }, + 'D', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/e.png', + width: 32, + height: 32, + alt: 'E', + }, + 'E', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/f.png', + width: 32, + height: 32, + alt: 'F', + }, + 'F', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/g.png', + width: 32, + height: 32, + alt: 'G', + }, + 'G', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/h.png', + width: 32, + height: 32, + alt: 'H', + }, + 'H', + ], + ['xyz', 'LMNOP'], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/i.png', + width: 32, + height: 32, + alt: 'I', + }, + 'I', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/j.png', + width: 32, + height: 32, + alt: 'J', + }, + 'J', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/k.png', + width: 32, + height: 32, + alt: 'K', + }, + 'K', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/l.png', + width: 32, + height: 32, + alt: 'L', + }, + 'L', + ], + [ + { + src: 'https://blockly-demo.appspot.com/static/tests/media/m.png', + width: 32, + height: 32, + alt: 'M', + }, + 'M', + ], + ], + }, + ], + }, + { + type: 'test_dropdowns_in_mutator', + message0: 'dropdown mutator', + mutator: 'test_dropdown_mutator', + }, + { + type: 'test_dropdowns_in_mutator_block', + message0: 'dropdown %1', + args0: [ + { + type: 'field_dropdown', + name: 'DROPDOWN', + options: [ + ['option', 'ONE'], + ['option', 'TWO'], + ], + }, + ], + }, +]); + +/** + * An array of options for the dynamic dropdown. + * @type {!Array.} + * @private + */ +const dynamicDropdownOptions_ = []; + +/** + * Handles "add option" button in the field test category. This will prompt + * the user for an option to add. + * @package + */ +const addDynamicDropdownOption = function () { + Blockly.dialog.prompt( + 'Add an option?', + 'option ' + dynamicDropdownOptions_.length, + function (text) { + if (text) { + // Do not remove this log! Helps you know if it was added correctly. + console.log('Adding option: ' + text); + // The option is an array containing human-readable text and a + // language-neutral id. + dynamicDropdownOptions_.push([ + text, + 'OPTION' + dynamicDropdownOptions_.length, + ]); + } + }, + ); +}; + +/** + * Handles "remove option" button in the field test category. This will prompt + * the user for an option to remove. May remove multiple options with the + * same name. + * @package + */ +const removeDynamicDropdownOption = function () { + const defaultText = dynamicDropdownOptions_[0] + ? dynamicDropdownOptions_[0][0] + : ''; + Blockly.dialog.prompt('Remove an option?', defaultText, function (text) { + for (let i = 0, option; (option = dynamicDropdownOptions_[i]); i++) { + // The option is an array containing human-readable text and a + // language-neutral id, we'll compare against the human-readable text. + if (option[0] == text) { + // Do not remove this log! Helps you know if it was removed correctly. + console.log('Removing option: ' + text); + dynamicDropdownOptions_.splice(i, 1); + } + } + }); +}; + +Blockly.Blocks['test_dropdowns_dynamic_random'] = { + init: function () { + const dropdown = new Blockly.FieldDropdown(this.dynamicOptions); + this.appendDummyInput() + .appendField('dynamic random') + .appendField(dropdown, 'OPTIONS'); + }, + + dynamicOptions: function () { + const random = Math.floor(Math.random() * 10) + 1; + const options = []; + for (let i = 0; i < random; i++) { + options.push([String(i), String(i)]); + } + return options; + }, +}; + +Blockly.Blocks['test_dropdowns_dynamic_connect_dependant'] = { + init: function () { + const dropdown = new Blockly.FieldDropdown(this.dynamicOptions); + this.appendDummyInput() + .appendField('dynamic connect-dependant') + .appendField(dropdown, 'OPTIONS'); + this.setNextStatement(true); + this.setPreviousStatement(true); + }, + + dynamicOptions: function () { + if (this.sourceBlock_ && this.sourceBlock_.getSurroundParent()) { + const parent = this.sourceBlock_.getSurroundParent(); + const options = [ + ['connected', 'CONNECTED_KEY'], + [`surroundParent: ${parent.type}`, `${parent.id}_type_key`], + [`surroundParent: ${parent.id}`, `${parent.id}_key`], + ]; + const top = this.sourceBlock_.getTopStackBlock(); + if (top.id !== parent.id) { + options.push([`topStack: ${top.type}`, `${top.id}_type_key`]); + options.push([`topStack: ${top.id}`, `${top.id}_key`]); + } + return options; + } else { + return [['unconnected', 'UNCONNECTED_KEY']]; + } + }, +}; + +/** + * Mutator methods added to the test_dropdowns_in_mutator block. + * @mixin + * @package + * @readonly + */ +const DROPDOWN_MUTATOR = { + /** + * Create XML to represent the block mutation. + * @returns {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function () { + const container = Blockly.utils.xml.createElement('mutation'); + return container; + }, + /** + * Restore a block from XML. + * @param {!Element} _xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (_xmlElement) {}, + /** + * Returns the state of the block as a JSON serializable object. + * @returns {!Object} The state of the block as a JSON serializable object. + */ + saveExtraState: function () { + return {}; + }, + /** + * Applies the given state to the block. + * @param {!Object} _state The state to apply. + */ + loadExtraState: function (_state) {}, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @returns {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function (workspace) { + const containerBlock = workspace.newBlock( + 'test_dropdowns_in_mutator_block', + ); + containerBlock.initSvg(); + + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} _containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function (_containerBlock) {}, +}; + +/** + * Register custom mutator used by the test_dropdowns_in_mutator block. + */ +Blockly.Extensions.registerMutator( + 'test_dropdown_mutator', + DROPDOWN_MUTATOR, + null, + ['test_dropdowns_in_mutator_block'], +); + +Blockly.Blocks['test_dropdowns_dynamic'] = { + init: function () { + const dropdown = new Blockly.FieldDropdown(this.dynamicOptions); + this.appendDummyInput() + .appendField('dynamic') + .appendField(dropdown, 'OPTIONS'); + }, + + dynamicOptions: function () { + if (!dynamicDropdownOptions_.length) { + return [['', 'OPTION0']]; + } + return dynamicDropdownOptions_; + }, +}; + +/** + * The Dropdown field category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Drop-downs', + contents: [ + { + kind: 'LABEL', + text: 'Dynamic', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_dynamic', + }, + { + kind: 'BUTTON', + text: 'Add option', + callbackkey: 'addDynamicOption', + }, + { + kind: 'BUTTON', + text: 'Remove option', + callbackkey: 'removeDynamicOption', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_dynamic_random', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_dynamic_connect_dependant', + }, + { + kind: 'LABEL', + text: 'Other', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_long', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_images', + }, + { + kind: 'BLOCK', + type: 'test_dropdowns_images_and_text', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + workspace.registerButtonCallback( + 'addDynamicOption', + addDynamicDropdownOption, + ); + workspace.registerButtonCallback( + 'removeDynamicOption', + removeDynamicDropdownOption, + ); +} diff --git a/packages/plugins/block-test/src/fields/emojis.js b/packages/plugins/block-test/src/fields/emojis.js new file mode 100644 index 00000000000..fc4ae83f75e --- /dev/null +++ b/packages/plugins/block-test/src/fields/emojis.js @@ -0,0 +1,53 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Emojis in fields test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +/** + * The Emoji category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Emoji! o((*^ᴗ^*))o', + contents: [ + { + kind: 'LABEL', + text: 'Unicode & Emojis', + }, + { + kind: 'BLOCK', + type: 'test_style_emoji', + }, + { + kind: 'BLOCK', + blockxml: ` + + Robot face in text field:🤖 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + Zalgo in text field:B̛̻̦̬̘̰͎̥̈̔͊͞ͅl̡͖̫̺̬̖̣̳̃̀́͑͑̕͟͠͝o̢̹͙̮̫͔͋̉̊̑̿̽̚c̸̹̹̜͙̹̠͋̒͑̊̇͝k̡͉̫͇̖̳͖̊͒́̆̄̎̂̔̕͜͞l̰̙̞̳̩̠͖̯̀̆̈́̿̈̓͗y̨̡̟͇̮͈̬̙̲̏̅̀͘͠ +`, + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/fields/images.js b/packages/plugins/block-test/src/fields/images.js new file mode 100644 index 00000000000..607b8f94036 --- /dev/null +++ b/packages/plugins/block-test/src/fields/images.js @@ -0,0 +1,281 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Image fields test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_images_datauri', + message0: 'Image data: URI %1', + args0: [ + { + type: 'field_image', + src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAABHZJREFUaAXtmEuPDFEUx8cwJIx4jQjxSGYt4pWQiGSIz4A1O2FtLyx8B4+MxIKEtQkRsZBIEF/AAgki3gzjNfx/Xfc/rkpVd1dXdU13OMm/z73ndc+5r6rqgYHu01wNAfqa5kTZx+1I3PtNJ35Aqe4P6VrW+9mnEl6o/g/hu0Ab6koxg0nsjn+dVF6c+Yr8SZgUaGeRfR0ry6alzEFaGuYY/AryafFODjQ++EKOlfRq+nXSxzTeY2FHGHcocM/uIvXZWoA2ZJ1td0pGjKMoRY6d9Nr8ndemXdrMyayVYr1wQ9gn3BVIhNklNluKg06fNslTFDacG4q4LgwLxIIcO+nV+HtOY5HoF2FbgXG3y3ZKwPdsAb/KTeOZIxESOhRG2SB+SrgvfBDeC/cEZKwgdFjA5wydQHFMy2rh8WWxOYx4UJybiiTBR+Fzqu/nin2kHohj0a+dmEWfNYpwAefV3iSMCiMC5+GSYD0PSgjfWVkJDmoaJLRO8EocUXulMC68EW4KpuNqUAy2+EDpePRnjdj/JMhKUASH37N/S+0FgrePV+akZLWTl3+jRt4j7BbGhCUC9EAgcbbThdC+KL5aMA2Fxi5xbLkMoKXCmEBMYjMG5DGTXgW/XuqtiuVZNr8S4nM7cbBHBbYTehcxqDZJOTGv2DvJoKuC45lvaWiSbRea+cyHNN8i0UwHgyfilwUS+SYsFkiCmSYWD7tXwkOB5J8H7uRcCL48EPEDTMYqgYngneyl8FSAPHbSq+DXSWSFYmuwIhzg4WDgSYr93GY7kjQ++OaR7fP0M3IPNiNo0mBWCcxMm+izCtbBHRM5emR5FOvxi21ZibifF6Mh96BNjSIlgX9GfRJJkwen4CLbgrj2Tcds2Y9nt6VxQYOOkyo4TsO86IrkjRGvjNvmsQ8yCox1cTu2LdQuW4gT4wYyuZ21rbxKtsHHbcdynEK8TCEM7GS5jp3k8pAB16plQdRYCRLHxjp8JwVilSpG/h0TA08IXwUSAyTFNdwM2Nge32sCsTqmTp09c8zsM4H3KB6EJMcqW5+Oj946X88jklHMGoE3AuvVbJ/KbC1G4crkW4Ptsld4KzimZ1yiGSJJF0chy4Q7Av7xta5uMfKgxbz+WPMOxv9VrMhtwcmTJDqADKIAkgVeNWS8CbAi2M4akciEMCXwusFrB0WQPJy+z0qWDh98S58RxeiYvEXgnJUVIdIJcQqBQ8ib6fCNY+FTmMpsLZIlATiH1MQHFWT+Oun+JcvSOVZk3n5zsH3TTEuKgEjCf4k6pjnyZjqvhmMRrzCVWZF4MJLwwzGW086TW1eqAA/mWXO/b/n/Qnpt6f6vyL++Ir6hzCubj7q3lscz79tC/DVoXlkhVT0QWyXkV/TxYGhueSv/lvq6CuFM8CryQjgdsqJf2VmpfK+GJLOYi+FbvtIiGKwbK+JZNo+LQlb5+WCAbqyIY5rHhXSt3Y3BPOPmXUs+Dlzld7K30iMNwD8q3Ex85lquZv8QhzimdD/W9Xyb5H0z1Zbsb+OT/8HoqhrfAAAAAElFTkSuQmCC', + width: 50, + height: 50, + alt: '*', + }, + ], + style: 'text_blocks', + }, + { + type: 'test_images_small', + message0: 'Image too small %1', + args0: [ + { + type: 'field_image', + src: 'media/30px.png', + width: 50, + height: 50, + alt: '*', + }, + ], + style: 'text_blocks', + }, + { + type: 'test_images_large', + message0: 'Image too large %1', + args0: [ + { + type: 'field_image', + src: 'media/200px.png', + width: 50, + height: 50, + alt: '*', + }, + ], + style: 'text_blocks', + }, + { + type: 'test_images_fliprtl', + message0: 'Image flipped RTL %1', + args0: [ + { + type: 'field_image', + src: 'media/arrow.png', + width: 50, + height: 50, + alt: '*', + flipRtl: true, + }, + ], + colour: 160, + }, + { + type: 'test_images_missing', + message0: 'Image missing %1', + args0: [ + { + type: 'field_image', + src: 'missing.png', + width: 50, + height: 50, + alt: '*', + }, + ], + style: 'text_blocks', + }, + { + type: 'test_images_many_icons', + message0: + 'Lots of network icons: %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11' + + ' %12 %13 %14 %15 %16 %17 %18', + args0: [ + { + type: 'input_dummy', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/a.png', + width: 32, + height: 32, + alt: 'A', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/b.png', + width: 32, + height: 32, + alt: 'B', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/c.png', + width: 32, + height: 32, + alt: 'C', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/d.png', + width: 32, + height: 32, + alt: 'D', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/e.png', + width: 32, + height: 32, + alt: 'E', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/f.png', + width: 32, + height: 32, + alt: 'F', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/g.png', + width: 32, + height: 32, + alt: 'G', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/h.png', + width: 32, + height: 32, + alt: 'H', + }, + { + type: 'input_dummy', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/a.png', + width: 32, + height: 32, + alt: 'A', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/b.png', + width: 32, + height: 32, + alt: 'B', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/c.png', + width: 32, + height: 32, + alt: 'C', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/d.png', + width: 32, + height: 32, + alt: 'D', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/e.png', + width: 32, + height: 32, + alt: 'E', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/f.png', + width: 32, + height: 32, + alt: 'F', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/g.png', + width: 32, + height: 32, + alt: 'G', + }, + { + type: 'field_image', + src: 'https://blockly-demo.appspot.com/static/tests/media/h.png', + width: 32, + height: 32, + alt: 'H', + }, + ], + style: 'text_blocks', + }, +]); + +Blockly.Blocks['test_images_clickhandler'] = { + init: function () { + this.appendDummyInput() + .appendField('Image click handler') + .appendField( + new Blockly.FieldImage( + 'https://blockly-demo.appspot.com/static/tests/media/a.png', + 32, + 32, + 'image with click handler', + this.onClick_, + ), + 'IMAGE', + ); + this.setStyle('text_blocks'); + }, + onClick_: function () { + alert('Image clicked'); + }, +}; + +/** + * The Image field category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Images', + contents: [ + { + kind: 'BLOCK', + type: 'test_images_datauri', + }, + { + kind: 'BLOCK', + type: 'test_images_small', + }, + { + kind: 'BLOCK', + type: 'test_images_large', + }, + { + kind: 'BLOCK', + type: 'test_images_fliprtl', + }, + { + kind: 'BLOCK', + type: 'test_images_missing', + }, + { + kind: 'BLOCK', + type: 'test_images_many_icons', + }, + { + kind: 'BLOCK', + type: 'test_images_clickhandler', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/fields/index.js b/packages/plugins/block-test/src/fields/index.js new file mode 100644 index 00000000000..259058e35fb --- /dev/null +++ b/packages/plugins/block-test/src/fields/index.js @@ -0,0 +1,51 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Fields test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import {category as fieldDefaults, onInit as initDefaults} from './defaults'; +import {category as fieldNumbers, onInit as initNumbers} from './numbers'; +import {category as fieldDropdowns, onInit as initDropdowns} from './dropdowns'; +import {category as fieldImages, onInit as initImages} from './images'; +import {category as fieldEmoji, onInit as initEmoji} from './emojis'; +import { + category as fieldValidators, + onInit as initValidators, +} from './validators'; + +/** + * The fields category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Fields', + expanded: 'true', + contents: [ + fieldDefaults, + fieldNumbers, + fieldDropdowns, + fieldImages, + fieldEmoji, + fieldValidators, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + initDefaults(workspace); + initNumbers(workspace); + initDropdowns(workspace); + initImages(workspace); + initEmoji(workspace); + initValidators(workspace); +} diff --git a/packages/plugins/block-test/src/fields/numbers.js b/packages/plugins/block-test/src/fields/numbers.js new file mode 100644 index 00000000000..fd7d0b41267 --- /dev/null +++ b/packages/plugins/block-test/src/fields/numbers.js @@ -0,0 +1,167 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Number fields test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_numbers_float', + message0: 'float %1', + args0: [ + { + type: 'field_number', + name: 'NUM', + text: '0', + }, + ], + style: 'math_blocks', + output: 'Number', + tooltip: 'A number.', + }, + { + type: 'test_numbers_whole', + message0: 'precision 1 %1', + args0: [ + { + type: 'field_number', + name: 'NUM', + precision: 1, + text: '0', + }, + ], + style: 'math_blocks', + output: 'Number', + tooltip: 'The number should be rounded to multiples of 1', + }, + { + type: 'test_numbers_hundredths', + message0: 'precision 0.01 %1', + args0: [ + { + type: 'field_number', + name: 'NUM', + precision: 0.01, + text: '0', + }, + ], + style: 'math_blocks', + output: 'Number', + tooltip: 'The number should be rounded to multiples of 0.01', + }, + { + type: 'test_numbers_halves', + message0: 'precision 0.5 %1', + args0: [ + { + type: 'field_number', + name: 'NUM', + precision: 0.5, + text: '0', + }, + ], + style: 'math_blocks', + output: 'Number', + tooltip: 'The number should be rounded to multiples of 0.5', + }, + { + type: 'test_numbers_three_halves', + message0: 'precision 1.5 %1', + args0: [ + { + type: 'field_number', + name: 'NUM', + precision: 1.5, + text: '0', + }, + ], + style: 'math_blocks', + output: 'Number', + tooltip: 'The number should be rounded to multiples of 1.5', + }, + { + type: 'test_numbers_whole_bounded', + message0: 'midi note %1', + args0: [ + { + type: 'field_number', + name: 'NOTE', + precision: 1, + min: 1, + max: 127, + text: '0', + }, + ], + style: 'math_blocks', + output: 'Note', + tooltip: 'A midi note.', + }, +]); + +/** + * The Numbers field category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Numbers', + contents: [ + { + kind: 'BLOCK', + blockxml: ` + + 123.456 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + 123.456 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + 123.456 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + 123.456 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + 123.456 +`, + }, + { + kind: 'BLOCK', + blockxml: ` + + 60 +`, + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/fields/validators.js b/packages/plugins/block-test/src/fields/validators.js new file mode 100644 index 00000000000..a0c155fb4b0 --- /dev/null +++ b/packages/plugins/block-test/src/fields/validators.js @@ -0,0 +1,577 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Field validators test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.Blocks['test_validators_dispose_block'] = { + init: function () { + this.appendDummyInput() + .appendField('dispose block') + .appendField( + new Blockly.FieldTextInput('default', this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'Any changes to the text cause the block to be' + ' disposed', + ); + }, + + validate: function (newValue) { + if (newValue != 'default') { + this.getSourceBlock().dispose(true); + } + }, +}; + +Blockly.Blocks['test_validators_text_null'] = { + init: function () { + this.appendDummyInput() + .appendField('always null') + .appendField( + new Blockly.FieldTextInput('default', this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'All input validates to null (invalid). The display' + + ' text will remain the input text, but the value should be the' + + ' default text. The input should be red after the first keystroke.', + ); + }, + + validate: function (newValue) { + return null; + }, +}; +Blockly.Blocks['test_validators_text_A'] = { + init: function () { + this.appendDummyInput() + .appendField("remove 'a'") + .appendField( + new Blockly.FieldTextInput('default', this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + "All 'a' characters are removed from field value." + + " The display text will include invalid 'a' characters while the" + + ' field is being edited, but the value will not.', + ); + }, + + validate: function (newValue) { + return newValue.replace(/a/g, ''); + }, +}; +Blockly.Blocks['test_validators_text_B'] = { + init: function () { + this.appendDummyInput() + .appendField("'b' -> null") + .appendField( + new Blockly.FieldTextInput('default', this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + "Upon detecting a 'b' character the input will" + + ' validated to null (invalid). Upon removal it should revert to' + + ' being valid. The display text will remain the input text, but if' + + ' the input text is invalid the value should be the default text.', + ); + }, + + validate: function (newValue) { + if (newValue.indexOf('b') !== -1) { + return null; + } + return newValue; + }, +}; + +Blockly.Blocks['test_validators_checkbox_null'] = { + init: function () { + this.appendDummyInput() + .appendField('always null') + .appendField(new Blockly.FieldCheckbox(true, this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText( + 'The new input always validates to null (invalid).' + + ' This means that the field value should not change.', + ); + }, + + validate: function (newValue) { + return null; + }, +}; +Blockly.Blocks['test_validators_checkbox_match'] = { + init: function () { + this.appendDummyInput() + .appendField('force match') + .appendField(new Blockly.FieldCheckbox(true), 'MATCH') + .appendField(new Blockly.FieldCheckbox(true, this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText( + 'The validator for this block only works on the end-most checkbox.' + + ' The validator will always return the value of the start-most' + + ' checkbox. Therefore they should always match.', + ); + }, + + validate: function (newValue) { + return this.sourceBlock_.getFieldValue('MATCH'); + }, +}; +Blockly.Blocks['test_validators_checkbox_not_match_null'] = { + init: function () { + this.appendDummyInput() + .appendField('not match -> null') + .appendField(new Blockly.FieldCheckbox(true), 'MATCH') + .appendField(new Blockly.FieldCheckbox(true, this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText( + 'The validator for this block only works on the' + + ' end-most checkbox. If the new value does not match the value of the' + + ' start-most checkbox, it will return null (invalid), which means the' + + ' field value should not change. Therefore they should always match.', + ); + }, + + validate: function (newValue) { + if (this.sourceBlock_.getFieldValue('MATCH') != newValue) { + return null; + } + return newValue; + }, +}; + +Blockly.Blocks['test_validators_dropdown_null'] = { + init: function () { + this.appendDummyInput() + .appendField('always null') + .appendField( + new Blockly.FieldDropdown( + [ + ['1a', '1A'], + ['1b', '1B'], + ['1c', '1C'], + ['2a', '2A'], + ['2b', '2B'], + ['2c', '2C'], + ], + this.validate, + ), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'All input validates to null (invalid). This means' + + ' the field value should not change.', + ); + }, + + validate: function (newValue) { + return null; + }, +}; +Blockly.Blocks['test_validators_dropdown_force_1s'] = { + init: function () { + this.appendDummyInput() + .appendField('force 1s') + .appendField( + new Blockly.FieldDropdown( + [ + ['1a', '1A'], + ['1b', '1B'], + ['1c', '1C'], + ['2a', '2A'], + ['2b', '2B'], + ['2c', '2C'], + ], + this.validate, + ), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + "The input's value will always change to start with 1.", + ); + }, + + validate: function (newValue) { + return '1' + newValue.charAt(1); + }, +}; +Blockly.Blocks['test_validators_dropdown_1s_null'] = { + init: function () { + this.appendDummyInput() + .appendField('not 1s -> null') + .appendField( + new Blockly.FieldDropdown( + [ + ['1a', '1A'], + ['1b', '1B'], + ['1c', '1C'], + ['2a', '2A'], + ['2b', '2B'], + ['2c', '2C'], + ], + this.validate, + ), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'If the input does not start with 1, the input will validate to' + + ' null (invalid). Otherwise it will return the input value.', + ); + }, + + validate: function (newValue) { + if (newValue.charAt(0) != '1') { + return null; + } + return newValue; + }, +}; + +Blockly.Blocks['test_validators_number_null'] = { + init: function () { + this.appendDummyInput() + .appendField('always null') + .appendField( + new Blockly.FieldNumber(123, null, null, null, this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'All input validates to null (invalid). The field will display the' + + ' input while the field is being edited, but the value should be the' + + ' default value. The input should be red after the first' + + ' keystroke.', + ); + }, + + validate: function (newValue) { + return null; + }, +}; +Blockly.Blocks['test_validators_number_mult10_force'] = { + init: function () { + this.appendDummyInput() + .appendField('force mult of 10') + .appendField( + new Blockly.FieldNumber(123, null, null, null, this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'The input value will be rounded to the nearest' + + ' multiple of 10. The field will display the input while the field is' + + ' being edited, but the value should be the validated (rounded)' + + ' value. Note: If you want to do rounding this is not the proper' + + ' way, use the precision option of the number field constructor' + + ' instead.', + ); + }, + + validate: function (newValue) { + return Math.round(newValue / 10) * 10; + }, +}; +Blockly.Blocks['test_validators_number_mult10_null'] = { + init: function () { + this.appendDummyInput() + .appendField('not mult of 10 -> null') + .appendField( + new Blockly.FieldNumber(123, null, null, null, this.validate), + 'INPUT', + ); + this.setColour(230); + this.setCommentText( + 'If the input value is not a multiple of 10, the' + + ' input will validate to null (invalid). The field will display the' + + ' input while the field is being edited, but if the input value is' + + ' invalid the value should be the default value.', + ); + }, + + validate: function (newValue) { + if (newValue % 10 != 0) { + return null; + } + return newValue; + }, +}; + +Blockly.Blocks['test_validators_variable_null'] = { + init: function () { + this.appendDummyInput() + .appendField('always null') + .appendField(new Blockly.FieldVariable('1a', this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText( + 'All ids validate to null (invalid). This means' + + ' the variable should not change.', + ); + }, + + validate: function (newValue) { + return null; + }, +}; +Blockly.Blocks['test_validators_variable_force_1s'] = { + init: function () { + this.appendDummyInput() + .appendField('force 1s') + .appendField(new Blockly.FieldVariable('1a', this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText('The id will always change to start with 1.'); + }, + + validate: function (newValue) { + return '1' + newValue.charAt(1); + }, +}; +Blockly.Blocks['test_validators_variable_1s_null'] = { + init: function () { + this.appendDummyInput() + .appendField('not 1s -> null') + .appendField(new Blockly.FieldVariable('1a', this.validate), 'INPUT'); + this.setColour(230); + this.setCommentText( + 'If the id does not start with 1, the id will' + + ' validate to null (invalid). Otherwise it will return the id.', + ); + }, + + validate: function (newValue) { + if (newValue.charAt(0) != '1') { + return null; + } + return newValue; + }, +}; + +/** + * The Validators field category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Validators', + contents: [ + { + kind: 'BUTTON', + text: 'add blocks to workspace', + callbackkey: 'addAllBlocksToWorkspace', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'set input', + callbackkey: 'setInput', + }, + { + kind: 'LABEL', + text: 'Dispose block', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_dispose_block', + }, + { + kind: 'LABEL', + text: 'Checkboxes', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_checkbox_null', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_checkbox_match', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_checkbox_not_match_null', + }, + { + kind: 'LABEL', + text: 'Dropdowns', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_dropdown_null', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_dropdown_force_1s', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_dropdown_1s_null', + }, + { + kind: 'LABEL', + text: 'Numbers', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_number_null', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_number_mult10_force', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_number_mult10_null', + }, + { + kind: 'LABEL', + text: 'Text', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_text_null', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_text_A', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_text_B', + }, + { + kind: 'LABEL', + text: 'Variables', + }, + { + kind: 'SEP', + gap: '8', + }, + { + 'kind': 'BUTTON', + 'text': 'add test variables', + 'callbackkey': 'addVariables', + 'web-class': 'modifiesWorkspace', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_variable_null', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_variable_force_1s', + }, + { + kind: 'SEP', + gap: '12', + }, + { + kind: 'BLOCK', + type: 'test_validators_variable_1s_null', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + const addVariables = function (button) { + workspace.getVariableMap().createVariable('1b', '', '1B'); + workspace.getVariableMap().createVariable('1c', '', '1C'); + workspace.getVariableMap().createVariable('2a', '', '2A'); + workspace.getVariableMap().createVariable('2b', '', '2B'); + workspace.getVariableMap().createVariable('2c', '', '2C'); + }; + const setInput = function (button) { + Blockly.dialog.prompt('Input text to set.', 'ab', function (input) { + const blocks = button.getTargetWorkspace().getAllBlocks(false); + for (let i = 0, block; (block = blocks[i]); i++) { + if (block.getField('INPUT')) { + block.setFieldValue(input, 'INPUT'); + } + } + }); + }; + + workspace.registerButtonCallback('addVariables', addVariables); + workspace.registerButtonCallback('setInput', setInput); +} diff --git a/packages/plugins/block-test/src/index.js b/packages/plugins/block-test/src/index.js new file mode 100644 index 00000000000..4b077183452 --- /dev/null +++ b/packages/plugins/block-test/src/index.js @@ -0,0 +1,80 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Import all the test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +import {category as alignCategory, onInit as initAlign} from './align'; +import {category as basicCategory, onInit as initBasic} from './basic'; +import { + category as chameleonCategory, + onInit as initChameleon, +} from './chameleon'; +import { + category as connectionsCategory, + onInit as initConnections, +} from './connections'; +import {category as dragCategory, onInit as initDrag} from './drag'; +import {category as fieldsCategory, onInit as initFields} from './fields'; +import {category as mutatorsCategory, onInit as initMutators} from './mutators'; +import {category as styleCategory, onInit as initStyle} from './style'; +import { + category as serializationCategory, + onInit as initSerialization, +} from './serialization/category'; + +/** + * The Test blocks toolbox. + */ +export const toolboxTestBlocks = { + contents: [ + alignCategory, + basicCategory, + chameleonCategory, + connectionsCategory, + dragCategory, + fieldsCategory, + mutatorsCategory, + styleCategory, + serializationCategory, + ], +}; + +/** + * Initialize this toolbox. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function toolboxTestBlocksInit(workspace) { + initAlign(workspace); + initBasic(workspace); + initChameleon(workspace); + initConnections(workspace); + initDrag(workspace); + initFields(workspace); + initMutators(workspace); + initStyle(workspace); + initSerialization(workspace); + + const addAllBlocksToWorkspace = function (button) { + const workspace = button.getTargetWorkspace(); + const blocks = workspace.getFlyout().getWorkspace().getTopBlocks(); + for (let i = 0, block; (block = blocks[i]); i++) { + const state = Blockly.serialization.blocks.save(block, { + addCoordinates: true, + }); + Blockly.serialization.blocks.append(state, workspace); + } + }; + workspace.registerButtonCallback( + 'addAllBlocksToWorkspace', + addAllBlocksToWorkspace, + ); +} diff --git a/packages/plugins/block-test/src/mutators.js b/packages/plugins/block-test/src/mutators.js new file mode 100644 index 00000000000..76316f9cc6c --- /dev/null +++ b/packages/plugins/block-test/src/mutators.js @@ -0,0 +1,257 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Mutator test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_mutator_textChange', + message0: 'mutator text: %1', + args0: [ + { + type: 'field_input', + name: 'MUTATOR_TEXT', + text: 'a label', + }, + ], + style: 'colour_blocks', + }, +]); + +/** + * Mutator methods added to the test_mutators_many block. + * @mixin + * @package + * @readonly + */ +const COLOR_CHANGE_MUTATOR = { + /** + * Create XML to represent the block mutation. + * @returns {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function () { + const container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('arbitrary', this.getFieldValue('LABEL')); + return container; + }, + /** + * Restore a block from XML. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (xmlElement) { + this.setFieldValue(xmlElement.getAttribute('arbitrary'), 'LABEL'); + }, + /** + * Returns the state of this block as a json serializable object. + * @returns {{arbitrary: string}} The state of this block. + * @this {Blockly.Block} + */ + saveExtraState: function () { + return {arbitrary: this.getFieldValue('LABEL')}; + }, + /** + * Applies the state to this block. + * @param {{arbitrary: string}} state The state to apply. + * @this {Blockly.Block} + */ + loadExtraState: function (state) { + this.setFieldValue(state['arbitrary'], 'LABEL'); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @returns {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function (workspace) { + const containerBlock = Blockly.serialization.blocks.append( + {type: 'test_mutator_textChange'}, + workspace, + ); + containerBlock + .getField('MUTATOR_TEXT') + .setValue(this.getFieldValue('LABEL')); + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function (containerBlock) { + this.setFieldValue(containerBlock.getFieldValue('MUTATOR_TEXT'), 'LABEL'); + }, +}; + +const n = 20; +const blocksIds = []; +for (let i = 0; i < n; i++) { + blocksIds.push(`test_mutator_category_${i}`); +} + +const defineBlocks = blocksIds.map((t) => ({ + type: t, + message0: 'mutator text: %1', + args0: [ + { + type: 'field_input', + name: 'MUTATOR_TEXT', + text: 'a label', + }, + ], + style: 'colour_blocks', +})); + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_mutators_many', + message0: 'test many blocks mutator %1', + args0: [ + { + type: 'field_label', + name: 'LABEL', + text: 'changeable label', + }, + ], + mutator: 'test_many_blocks_mutator', + colour: '#000000', + }, + ...defineBlocks, +]); + +/** Register custom mutator used by the test_mutators_many block. */ +Blockly.Extensions.registerMutator( + 'test_many_blocks_mutator', + COLOR_CHANGE_MUTATOR, + null, + [...blocksIds], +); + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_mutators_noflyout', + message0: 'noflyout mutator %1', + args0: [ + { + type: 'field_label', + name: 'LABEL', + text: 'changeable label', + }, + ], + mutator: 'test_noflyout_mutator', + colour: '#000000', + }, +]); + +/** Register custom mutator used by the test_mutators_noflyout block. */ +Blockly.Extensions.registerMutator( + 'test_noflyout_mutator', + COLOR_CHANGE_MUTATOR, + null, + [], +); + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_mutators_changeableFlyout', + message0: 'changeable flyout mutator %1', + args0: [ + { + type: 'field_label', + name: 'LABEL', + text: 'changeable label', + }, + ], + mutator: 'test_changeableFlyout_mutator', + colour: '#000000', + }, +]); + +/** Register custom mutator used by the test_mutators_changeableFlyout block. */ +Blockly.Extensions.registerMutator( + 'test_changeableFlyout_mutator', + COLOR_CHANGE_MUTATOR, + null, + ['text'], +); + +/** + * The Mutators category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Mutators', + contents: [ + { + kind: 'LABEL', + text: 'logic_compare', + }, + { + kind: 'BLOCK', + type: 'logic_compare', + inputs: { + A: { + shadow: { + type: 'math_number', + fields: {NUM: 10}, + }, + }, + B: { + shadow: { + type: 'math_number', + fields: {NUM: 10}, + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'logic_compare', + inputs: { + A: { + block: { + type: 'math_number', + fields: {NUM: 10}, + }, + }, + B: { + block: { + type: 'math_number', + fields: {NUM: 10}, + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'test_mutators_noflyout', + }, + { + kind: 'BLOCK', + type: 'test_mutators_many', + }, + { + kind: 'BLOCK', + type: 'test_mutators_changeableFlyout', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/src/serialization/blocks.js b/packages/plugins/block-test/src/serialization/blocks.js new file mode 100644 index 00000000000..bb7d6a0aeea --- /dev/null +++ b/packages/plugins/block-test/src/serialization/blocks.js @@ -0,0 +1,112 @@ +// @ts-nocheck +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +import * as Blockly from 'blockly/core'; +import './fields'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_field_serialization_no_overrides', + message0: 'no overrides: %1', + args0: [ + { + type: 'field_no_overrides', + name: 'LABEL', + text: 'test', + }, + ], + colour: 0, + output: null, + }, + { + type: 'test_field_serialization_xml', + message0: 'xml: %1', + args0: [ + { + type: 'field_xml', + name: 'LABEL', + text: 'test', + }, + ], + colour: 30, + output: null, + }, + { + type: 'test_field_serialization_jso', + message0: 'jso: %1', + args0: [ + { + type: 'field_jso', + name: 'LABEL', + text: 'test', + }, + ], + colour: 90, + output: null, + }, + { + type: 'test_field_serialization_both', + message0: 'both: %1', + args0: [ + { + type: 'field_both', + name: 'LABEL', + text: 'test', + }, + ], + colour: 150, + output: null, + }, +]); + +Blockly.Blocks['test_extra_state_xml'] = Object.assign( + {}, + Blockly.Blocks['lists_create_with'], +); +delete Blockly.Blocks['test_extra_state_xml'].saveExtraState; +delete Blockly.Blocks['test_extra_state_xml'].loadExtraState; +Blockly.Blocks['test_extra_state_xml'].init = function () { + this.setColour(30); + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, 'Array'); + this.setMutator( + new Blockly.icons.MutatorIcon(['lists_create_with_item'], this), + ); +}; + +Blockly.Blocks['test_extra_state_jso'] = Object.assign( + {}, + Blockly.Blocks['lists_create_with'], +); +delete Blockly.Blocks['test_extra_state_jso'].mutationToDom; +delete Blockly.Blocks['test_extra_state_jso'].domToMutation; +Blockly.Blocks['test_extra_state_jso'].init = function () { + this.setColour(90); + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, 'Array'); + this.setMutator( + new Blockly.icons.MutatorIcon(['lists_create_with_item'], this), + ); +}; + +Blockly.Blocks['test_extra_state_both'] = Object.assign( + {}, + Blockly.Blocks['lists_create_with'], +); +Blockly.Blocks['test_extra_state_both'].init = function () { + this.setColour(150); + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, 'Array'); + this.setMutator( + new Blockly.icons.MutatorIcon(['lists_create_with_item'], this), + ); +}; diff --git a/packages/plugins/block-test/src/serialization/category.js b/packages/plugins/block-test/src/serialization/category.js new file mode 100644 index 00000000000..776f1bd892c --- /dev/null +++ b/packages/plugins/block-test/src/serialization/category.js @@ -0,0 +1,193 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +import * as Blockly from 'blockly/core'; +import './blocks'; + +/** + * The Serialization category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Serialization', + contents: [ + { + kind: 'BUTTON', + text: 'add blocks to workspace', + callbackkey: 'addAllBlocksToWorkspace', + }, + { + kind: 'SEP', + gap: '8', + }, + { + kind: 'BUTTON', + text: 'randomize text', + callbackkey: 'randomizeText', + }, + { + kind: 'BLOCK', + type: 'test_field_serialization_no_overrides', + }, + { + kind: 'BLOCK', + type: 'test_field_serialization_xml', + }, + { + kind: 'BLOCK', + type: 'test_field_serialization_jso', + }, + { + kind: 'BLOCK', + type: 'test_field_serialization_both', + }, + { + kind: 'SEP', + gap: 30, + }, + { + kind: 'BLOCK', + blockxml: + '' + + '' + + '', + }, + { + kind: 'BLOCK', + type: 'test_extra_state_jso', + extraState: { + itemCount: 2, + }, + }, + { + kind: 'BLOCK', + type: 'test_extra_state_both', + extraState: { + itemCount: 2, + }, + }, + { + kind: 'SEP', + gap: 30, + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_field_serialization_no_overrides', + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_field_serialization_xml', + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_field_serialization_jso', + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_field_serialization_both', + }, + }, + }, + }, + { + kind: 'SEP', + gap: 30, + }, + { + kind: 'BLOCK', + blockxml: + '' + + '' + + '' + + '' + + '' + + '' + + '', + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_extra_state_jso', + extraState: { + itemCount: 2, + }, + }, + }, + }, + }, + { + kind: 'BLOCK', + type: 'text_print', + inputs: { + TEXT: { + shadow: { + type: 'test_extra_state_both', + extraState: { + itemCount: 2, + }, + }, + }, + }, + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + const randomizeText = function (button) { + const targetWorkspace = button.getTargetWorkspace(); + const blocks = [ + ...targetWorkspace.getBlocksByType( + 'test_field_serialization_no_overrides', + ), + ...targetWorkspace.getBlocksByType('test_field_serialization_xml'), + ...targetWorkspace.getBlocksByType('test_field_serialization_jso'), + ...targetWorkspace.getBlocksByType('test_field_serialization_both'), + ]; + const possible = 'ABCDEF'; + for (let i = 0, block; (block = blocks[i]); i++) { + let text = ''; + for (let j = 0; j < 4; j++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + block.setFieldValue(text, 'LABEL'); + } + }; + workspace.registerButtonCallback('randomizeText', randomizeText); +} diff --git a/packages/plugins/block-test/src/serialization/fields.js b/packages/plugins/block-test/src/serialization/fields.js new file mode 100644 index 00000000000..0c687225c20 --- /dev/null +++ b/packages/plugins/block-test/src/serialization/fields.js @@ -0,0 +1,201 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +'use strict'; + +import * as Blockly from 'blockly/core'; + +/** + * Field that does not override any serialization hooks. + */ +class NoOverridesField extends Blockly.FieldLabel { + /** + * Constructor. + * @param {string=} value The value for the field to hold. + * @param {string=} cssClass The css class to apply to the field. + * @param {*} config The config for the field. + */ + constructor(value, cssClass, config) { + super(value, cssClass, config); + + this.EDITABLE = false; + this.SERIALIZABLE = true; + } +} + +/** + * Creates the field based on its JSON definition. + * @param {*} options Options for creating the field. + * @returns {!NoOverridesField} The field that was created. + */ +NoOverridesField.fromJson = function (options) { + const text = Blockly.utils.parsing.replaceMessageReferences(options['text']); + return new this(text, undefined, options); +}; + +Blockly.fieldRegistry.register('field_no_overrides', NoOverridesField); + +/** + * Field that overrides XML serialization hooks. + */ +class XmlField extends Blockly.FieldLabel { + /** + * Constructor. + * @param {string=} value The value for the field to hold. + * @param {string=} cssClass The css class to apply to the field. + * @param {*} config The config for the field. + */ + constructor(value, cssClass, config) { + super(value, cssClass, config); + + this.EDITABLE = false; + this.SERIALIZABLE = true; + } + + /** + * Saves the state of the field as XML. + * @param {!Element} element The element to add the state to. + * @returns {!Element} The element with the state added. + */ + toXml(element) { + element.setAttribute('value', this.getValue()); + return element; + } + + /** + * Applies the given state to the field. + * @param {!Element} element The element containing the state to apply. + */ + fromXml(element) { + this.setValue(element.getAttribute('value')); + } +} + +/** + * Creates the field based on its JSON definition. + * @param {*} options Options for creating the field. + * @returns {!XmlField} The field that was created. + */ +XmlField.fromJson = function (options) { + const text = Blockly.utils.parsing.replaceMessageReferences(options['text']); + return new this(text, undefined, options); +}; + +Blockly.fieldRegistry.register('field_xml', XmlField); + +/** + * Field that overrides JSO serialization hooks. + */ +class JsoField extends Blockly.FieldLabel { + /** + * Constructor. + * @param {string=} value The value for the field to hold. + * @param {string=} cssClass The css class to apply to the field. + * @param {*} config The config for the field. + */ + constructor(value, cssClass, config) { + super(value, cssClass, config); + + this.EDITABLE = false; + this.SERIALIZABLE = true; + } + + /** + * Saves the state of the field as a JSON serializable value. + * @returns {*} The state of the field. + */ + saveState() { + return { + value: this.getValue(), + }; + } + + /** + * Applies the given state to the field. + * @param {*} state The state to apply. + */ + loadState(state) { + this.setValue(state['value']); + } +} + +/** + * Creates the field based on its JSON definition. + * @param {*} options Options for creating the field. + * @returns {!JsoField} The field that was created. + */ +JsoField.fromJson = function (options) { + const text = Blockly.utils.parsing.replaceMessageReferences(options['text']); + return new this(text, undefined, options); +}; + +Blockly.fieldRegistry.register('field_jso', JsoField); + +/** + * Field that overrides XML and JSO serialization hooks. + */ +class BothField extends Blockly.FieldLabel { + /** + * Constructor. + * @param {string=} value The value for the field to hold. + * @param {string=} cssClass The css class to apply to the field. + * @param {*} config The config for the field. + */ + constructor(value, cssClass, config) { + super(value, cssClass, config); + + this.EDITABLE = false; + this.SERIALIZABLE = true; + } + + /** + * Saves the state of the field as XML. + * @param {!Element} element The element to add the state to. + * @returns {!Element} The element with the state added. + */ + toXml(element) { + element.setAttribute('value', this.getValue()); + return element; + } + + /** + * Applies the given state to the field. + * @param {!Element} element The element containing the state to apply. + */ + fromXml(element) { + this.setValue(element.getAttribute('value')); + } + + /** + * Saves the state of the field as a JSON serializable value. + * @returns {*} The state of the field. + */ + saveState() { + return { + value: this.getValue(), + }; + } + + /** + * Applies the given state to the field. + * @param {*} state The state to apply. + */ + loadState(state) { + this.setValue(state['value']); + } +} + +/** + * Creates the field based on its JSON definition. + * @param {*} options Options for creating the field. + * @returns {!BothField} The field that was created. + */ +BothField.fromJson = function (options) { + const text = Blockly.utils.parsing.replaceMessageReferences(options['text']); + return new this(text, undefined, options); +}; + +Blockly.fieldRegistry.register('field_both', BothField); diff --git a/packages/plugins/block-test/src/style.js b/packages/plugins/block-test/src/style.js new file mode 100644 index 00000000000..06c3715a6af --- /dev/null +++ b/packages/plugins/block-test/src/style.js @@ -0,0 +1,194 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +'use strict'; + +/** + * @fileoverview Style test blocks. + * @author samelh@google.com (Sam El-Husseini) + */ + +import * as Blockly from 'blockly/core'; + +Blockly.defineBlocksWithJsonArray([ + { + type: 'test_style_hat', + message0: 'Hat block (event)', + nextStatement: null, + style: 'hat_blocks', + }, + { + type: 'test_style_hex1', + message0: 'Block color: Bright purple %1 %2 %3 %4', + args0: [ + { + type: 'field_input', + name: 'TEXT', + text: '#992aff', + }, + { + type: 'field_dropdown', + name: 'DROPDOWN', + options: [ + ['option', 'ONE'], + ['option', 'TWO'], + ], + }, + { + type: 'field_checkbox', + name: 'NAME', + checked: true, + }, + { + type: 'input_value', + name: 'NAME', + }, + ], + previousStatement: null, + nextStatement: null, + colour: '#992aff', + }, + { + type: 'test_style_hex2', + message0: 'Block color: White %1 %2 %3 %4', + args0: [ + { + type: 'field_input', + name: 'TEXT', + text: '#fefefe', + }, + { + type: 'field_dropdown', + name: 'DROPDOWN', + options: [ + ['option', 'ONE'], + ['option', 'TWO'], + ], + }, + { + type: 'field_checkbox', + name: 'NAME', + checked: true, + }, + { + type: 'input_value', + name: 'NAME', + }, + ], + previousStatement: null, + nextStatement: null, + colour: '#fefefe', + }, + { + type: 'test_style_hex3', + message0: 'Block color: Black %1 %2 %3 %4', + args0: [ + { + type: 'field_input', + name: 'TEXT', + text: '#010101', + }, + { + type: 'field_dropdown', + name: 'DROPDOWN', + options: [ + ['option', 'ONE'], + ['option', 'TWO'], + ], + }, + { + type: 'field_checkbox', + name: 'NAME', + checked: true, + }, + { + type: 'input_value', + name: 'NAME', + }, + ], + previousStatement: null, + nextStatement: null, + colour: '#010101', + }, + { + type: 'test_style_no_colour', + message0: 'Block color: unset', + }, + { + type: 'test_style_hex4', + message0: 'Block color: #RRGGBBAA (invalid)', + colour: '#992aff99', + }, + { + type: 'test_style_hex5', + message0: 'Block color: #RRGGBB (invalid)', + colour: '#NotHex', + }, + { + type: 'test_style_emoji', + message0: 'Robot Face: \uD83E\uDD16', + colour: '#AAAAAA', + }, +]); + +/** + * The Style category. + */ +export const category = { + kind: 'CATEGORY', + name: 'Style', + contents: [ + { + kind: 'LABEL', + text: 'Hats', + }, + { + kind: 'BLOCK', + type: 'test_style_hat', + }, + { + kind: 'LABEL', + text: 'Colour', + }, + { + kind: 'BLOCK', + type: 'test_style_hex1', + }, + { + kind: 'BLOCK', + type: 'test_style_hex2', + }, + { + kind: 'BLOCK', + type: 'test_style_hex3', + }, + { + kind: 'BLOCK', + type: 'test_style_no_colour', + }, + { + kind: 'BLOCK', + type: 'test_style_hex4', + }, + { + kind: 'BLOCK', + type: 'test_style_hex5', + gap: '40', + }, + { + kind: 'BLOCK', + type: 'test_style_hex5', + disabled: 'true', + }, + ], +}; + +/** + * Initialize this toolbox category. + * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. + */ +export function onInit(workspace) { + // NOP +} diff --git a/packages/plugins/block-test/test/index.html b/packages/plugins/block-test/test/index.html new file mode 100644 index 00000000000..8d4238a2026 --- /dev/null +++ b/packages/plugins/block-test/test/index.html @@ -0,0 +1,26 @@ + + + + + Blockly Test Blocks + + + + +
+ + + diff --git a/packages/plugins/block-test/test/index.js b/packages/plugins/block-test/test/index.js new file mode 100644 index 00000000000..2f7e5675439 --- /dev/null +++ b/packages/plugins/block-test/test/index.js @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Block test. + */ + +import * as Blockly from 'blockly'; +import { + toolboxTestBlocks as toolbox, + toolboxTestBlocksInit as onInit, +} from '../src/index'; + +// Do not use the advanced playground here because it will create a circular +// dependency with the @blockly/dev-tools package. +document.addEventListener('DOMContentLoaded', function () { + const workspace = Blockly.inject('root', { + toolbox: toolbox, + maxInstances: { + test_basic_limit_instances: 3, + }, + }); + onInit(workspace); +}); diff --git a/packages/plugins/dev-scripts/CHANGELOG.md b/packages/plugins/dev-scripts/CHANGELOG.md new file mode 100644 index 00000000000..27826dfabe9 --- /dev/null +++ b/packages/plugins/dev-scripts/CHANGELOG.md @@ -0,0 +1,356 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30) + +### Bug Fixes + +* Fix JSDom whinging about its default stylesheet ([#2700](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2700)) + + +## [4.0.12](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/dev-scripts@4.0.11...@blockly/dev-scripts@4.0.12) (2026-04-09) + + +### Bug Fixes + +* remove eslint dependency from dev-scripts ([#2682](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2682)) ([dc6b746](https://github.com/RaspberryPiFoundation/blockly-samples/commit/dc6b7467f8960d19d7d21e6fe7b2fd14cbfff51c)) + + + +## [4.0.11](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/dev-scripts@4.0.10...@blockly/dev-scripts@4.0.11) (2026-01-05) + + +### Bug Fixes + +* update plugin URLs to RPF ([#2665](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2665)) ([6c34039](https://github.com/RaspberryPiFoundation/blockly-samples/commit/6c3403960b8070eb8e576bd5702bdb53a09ac475)) + + + +## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.9...@blockly/dev-scripts@4.0.10) (2025-12-19) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.8...@blockly/dev-scripts@4.0.9) (2025-05-22) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.7...@blockly/dev-scripts@4.0.8) (2025-05-15) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.6...@blockly/dev-scripts@4.0.7) (2024-12-03) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.5...@blockly/dev-scripts@4.0.6) (2024-11-07) + + +### Bug Fixes + +* Modify Webpack sourcemap parameters to account for Windows path separators ([#2465](https://github.com/google/blockly-samples/issues/2465)) ([58be365](https://github.com/google/blockly-samples/commit/58be365e6e0f859f0255df1d9380a0a58e3f233e)) + + + + + +## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.4...@blockly/dev-scripts@4.0.5) (2024-08-08) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.3...@blockly/dev-scripts@4.0.4) (2024-08-01) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.2...@blockly/dev-scripts@4.0.3) (2024-07-11) + + +### Reverts + +* Revert "chore(deps): Bump the npm_and_yarn group across 54 directories with 19 updates (#2403)" (#2410) ([bad8ffb](https://github.com/google/blockly-samples/commit/bad8ffbf85caa4e5b68d2f010cd0deaa9e3dd98f)), closes [#2403](https://github.com/google/blockly-samples/issues/2403) [#2410](https://github.com/google/blockly-samples/issues/2410) +* Revert "chore(deps): Bump the npm_and_yarn group across 12 directories with 8…" (#2407) ([c008407](https://github.com/google/blockly-samples/commit/c008407107a22376baa637546eb6224a9a1cc48e)), closes [#2407](https://github.com/google/blockly-samples/issues/2407) + + + +## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.1...@blockly/dev-scripts@4.0.2) (2024-07-04) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@4.0.0...@blockly/dev-scripts@4.0.1) (2024-05-30) + + +### Bug Fixes + +* multiple blockly instances ([#2375](https://github.com/google/blockly-samples/issues/2375)) ([b231e59](https://github.com/google/blockly-samples/commit/b231e598f2f5f5b0abbfd01d981e35572ad50a26)) + + + +## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@3.1.1...@blockly/dev-scripts@4.0.0) (2024-05-21) + + +### ⚠ BREAKING CHANGES + +* update all plugins to v11 of blockly +* **dev-scripts:** This PR removes the support that was added + +### Features + +* update all plugins to v11 of blockly ([5fcd3e7](https://github.com/google/blockly-samples/commit/5fcd3e7d53eaadffe9bda9a378b404d34b2f8be2)) +* upgrade ts version, fix field validators ([b2d2191](https://github.com/google/blockly-samples/commit/b2d2191ff11b30347b33f95acf6e58f7ce54d004)) + + +### Bug Fixes + +* Call blocks handle both manual disabling and disabled defs ([#2334](https://github.com/google/blockly-samples/issues/2334)) ([5eade55](https://github.com/google/blockly-samples/commit/5eade55779c4022d14ad4472ff32c93c78199887)) +* **dev-scripts:** Fixes, refactoring and simplification of `webpack.config.js` and `'blockly'` imports ([#2229](https://github.com/google/blockly-samples/issues/2229)) ([f5ffdb9](https://github.com/google/blockly-samples/commit/f5ffdb961e3b60ddb164087f4bddc4e6215906b7)), closes [#335](https://github.com/google/blockly-samples/issues/335) [#335](https://github.com/google/blockly-samples/issues/335) [#1630](https://github.com/google/blockly-samples/issues/1630) [#335](https://github.com/google/blockly-samples/issues/335) [#226](https://github.com/google/blockly-samples/issues/226) [google/blockly#7822](https://github.com/google/blockly/issues/7822) [google/blockly#7822](https://github.com/google/blockly/issues/7822) [/github.com/google/blockly-samples/pull/2229#issuecomment-1979123919](https://github.com/google//github.com/google/blockly-samples/pull/2229/issues/issuecomment-1979123919) + + + +## [3.1.1](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@3.1.0...@blockly/dev-scripts@3.1.1) (2023-12-14) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [3.1.0](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@3.0.0...@blockly/dev-scripts@3.1.0) (2023-11-09) + + +### Features + +* switch to new umd library output in webpack config ([#1973](https://github.com/google/blockly-samples/issues/1973)) ([7748c04](https://github.com/google/blockly-samples/commit/7748c0466b98099709064fba8530629814eb3333)) + + + +## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@2.0.2...@blockly/dev-scripts@3.0.0) (2023-11-02) + + +### ⚠ BREAKING CHANGES + +* remove the lint script from blockly-scripts (#2044) + +### Bug Fixes + +* remove the lint script from blockly-scripts ([#2044](https://github.com/google/blockly-samples/issues/2044)) ([a6df905](https://github.com/google/blockly-samples/commit/a6df90571182af8ed98bdf04ee317da41ea5de1c)) + + + +## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@2.0.1...@blockly/dev-scripts@2.0.2) (2023-10-30) + + +### Bug Fixes + +* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676)) + + + +## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@2.0.0...@blockly/dev-scripts@2.0.1) (2023-07-20) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.36...@blockly/dev-scripts@2.0.0) (2023-06-28) + + +### ⚠ BREAKING CHANGES + +* update all plugins to use blockly-v10.0.0 (#1744) + +### Features + +* update all plugins to use blockly-v10.0.0 ([#1744](https://github.com/google/blockly-samples/issues/1744)) ([6cc88cb](https://github.com/google/blockly-samples/commit/6cc88cbef39d4ad664a668d3d46eb29ba7292f9c)) + + +### Reverts + +* Revert "chore(deps): Bump semver and fork-ts-checker-webpack-plugin (#1731)" (#1742) ([550eb33](https://github.com/google/blockly-samples/commit/550eb33ac1b88163b4f819e45d31e84f2821b6bf)), closes [#1731](https://github.com/google/blockly-samples/issues/1731) [#1742](https://github.com/google/blockly-samples/issues/1742) + + + +## [1.2.36](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.35...@blockly/dev-scripts@1.2.36) (2023-06-22) + + +### Bug Fixes + +* put eslint cache files in a better spot ([#1723](https://github.com/google/blockly-samples/issues/1723)) ([ac34524](https://github.com/google/blockly-samples/commit/ac34524e434870ffd40c9141965d6477e359967c)) + + + +## [1.2.35](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.34...@blockly/dev-scripts@1.2.35) (2023-05-18) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [1.2.34](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.33...@blockly/dev-scripts@1.2.34) (2023-05-11) + + +### Bug Fixes + +* Clean the dist directory before every build. ([#1685](https://github.com/google/blockly-samples/issues/1685)) ([71b1544](https://github.com/google/blockly-samples/commit/71b1544e1810f375798ca339b87816d6921c8ce5)) + + + +## [1.2.33](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.32...@blockly/dev-scripts@1.2.33) (2023-04-27) + + +### Bug Fixes + +* Fix compatibility with Node 18 ([#1672](https://github.com/google/blockly-samples/issues/1672)) ([df1b943](https://github.com/google/blockly-samples/commit/df1b943e42ded5cd1dfc8d83c8388116c5607a31)) + + + +## [1.2.32](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.31...@blockly/dev-scripts@1.2.32) (2023-03-23) + + +### Bug Fixes + +* eliminate faulty postinstall script ([#1630](https://github.com/google/blockly-samples/issues/1630)) ([d5efc18](https://github.com/google/blockly-samples/commit/d5efc18193d7f142329d1127ea6c8a64d24aff0c)) + + + +## [1.2.31](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.30...@blockly/dev-scripts@1.2.31) (2023-03-02) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [1.2.30](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.29...@blockly/dev-scripts@1.2.30) (2023-02-16) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [1.2.29](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.28...@blockly/dev-scripts@1.2.29) (2023-02-09) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## [1.2.28](https://github.com/google/blockly-samples/compare/@blockly/dev-scripts@1.2.27...@blockly/dev-scripts@1.2.28) (2022-10-13) + + +### Bug Fixes + +* scripts plugin now properly builds TypeScript declarations ([#1322](https://github.com/google/blockly-samples/issues/1322)) ([180cb6a](https://github.com/google/blockly-samples/commit/180cb6a431a2e9bdc1000b1521413d74625391db)) + + + +## 1.2.27 (2022-08-11) + + +### Bug Fixes + +* Remove the deprecated block-extension-tooltip ([#1215](https://github.com/google/blockly-samples/issues/1215)) ([a044478](https://github.com/google/blockly-samples/commit/a044478c86a73e3065bc866e427f175cbec6fc13)) + + + + + +## 1.2.26 (2022-08-04) + + +### Bug Fixes + +* fix the name of the package of suggested-blocks ([#1214](https://github.com/google/blockly-samples/issues/1214)) ([35aa8ec](https://github.com/google/blockly-samples/commit/35aa8ec73a60a4eb5b1e80cb2fc71dcd83d05e27)) + + + + + +## 1.2.24 (2022-07-21) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## 1.2.23 (2022-07-06) + + +### Bug Fixes + +* Update blockly-react to use functional components instead of class components. ([#1178](https://github.com/google/blockly-samples/issues/1178)) ([fa21187](https://github.com/google/blockly-samples/commit/fa21187cdbe4ec3a5c69f185540dd68a98eb69d7)) + + + + + +## 1.2.22 (2022-06-27) + + +### Bug Fixes + +* Update package import for keyboard navigation demo ([#1170](https://github.com/google/blockly-samples/issues/1170)) ([69c1725](https://github.com/google/blockly-samples/commit/69c1725b775279fcc397dc178935208d5f42b08c)) + + + + + +## 1.2.21 (2022-06-21) + +**Note:** Version bump only for package @blockly/dev-scripts + + + + + +## 1.2.20 (2022-06-08) + + +### Bug Fixes + +* package versions to support patch releases ([#1150](https://github.com/google/blockly-samples/issues/1150)) ([e1ae378](https://github.com/google/blockly-samples/commit/e1ae378d779531621c3d948566257d069002963f)) + + + + + +## 1.2.19 (2022-06-02) + + +### Bug Fixes + +* add git identity ([#1156](https://github.com/google/blockly-samples/issues/1156)) ([8d80924](https://github.com/google/blockly-samples/commit/8d809243b277375beb2ce75d4e157b5e17f78193)) diff --git a/packages/plugins/dev-scripts/README.md b/packages/plugins/dev-scripts/README.md new file mode 100644 index 00000000000..e1ee8bfad29 --- /dev/null +++ b/packages/plugins/dev-scripts/README.md @@ -0,0 +1,20 @@ +# @blockly/dev-scripts [![Built on Blockly](https://tinyurl.com/built-on-blockly)](https://github.com/google/blockly) + +This package includes scripts and configuration files used by Blockly plugins. + +## Available Scripts + +### `blockly-scripts start` + +Runs the package in development mode. + +Open [http://localhost:3000/test](http://localhost:3000/test) to view the test +playground in the browser. The page will reload if you make edits. + +### `blockly-scripts build` + +Builds the package into the `dist` directory. + +### `blockly-scripts clean` + +Deletes the `dist` and `build` directories if they exist. diff --git a/packages/plugins/dev-scripts/bin/blockly-scripts.js b/packages/plugins/dev-scripts/bin/blockly-scripts.js new file mode 100755 index 00000000000..ab5b5248961 --- /dev/null +++ b/packages/plugins/dev-scripts/bin/blockly-scripts.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Blockly dev scripts entry point. + * @author samelh@google.com (Sam El-Husseini) + */ + +const args = process.argv.slice(2); +const {spawnSync} = require('child_process'); + +const availableScripts = [ + 'build', + 'start', + 'clean', + 'predeploy', + 'test', + 'auditFix', +]; + +const script = args[0]; +if (availableScripts.includes(script)) { + const result = spawnSync( + 'node', + [].concat(require.resolve('../scripts/' + script)).concat(args.slice(1)), + {stdio: 'inherit'}, + ); + if (result.signal) { + if (result.signal === 'SIGKILL') { + console.log('The build failed because the process exited too early. '); + } else if (result.signal === 'SIGTERM') { + console.log('The build failed because the process exited too early. '); + } + process.exit(1); + } + process.exit(result.status); +} else { + console.log('Unknown script "' + script + '".'); +} diff --git a/packages/plugins/dev-scripts/config/webpack.config.js b/packages/plugins/dev-scripts/config/webpack.config.js new file mode 100644 index 00000000000..3799fe89164 --- /dev/null +++ b/packages/plugins/dev-scripts/config/webpack.config.js @@ -0,0 +1,173 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * @fileoverview Webpack configuration file. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); +const exists = (relativePath) => fs.existsSync(resolveApp(relativePath)); + +const packageJson = require(resolveApp('package.json')); + +module.exports = (env) => { + const mode = env.mode; + const isDevelopment = mode === 'development'; + const isProduction = mode === 'production'; + const isTest = mode === 'test'; + const isTypescript = exists('tsconfig.json'); + + let entry; + let outputFile; + let target = 'web'; + const plugins = [ + // Use DefinePlugin (https://webpack.js.org/plugins/define-plugin/) + // to pass the name of the package being built to the dev-tools + // playground (via plugins/dev-tools/src/playground/id.js). The + // "process.env." prefix is arbitrary: the stringified value + // gets substituted directly into the source code of that file + // at build time. + new webpack.DefinePlugin({ + 'process.env.PACKAGE_NAME': JSON.stringify(packageJson.name), + }), + ]; + + if (isProduction) { + // Production. + if (exists('./src/index.js')) entry = './src/index.js'; + if (exists('./src/index.ts')) entry = './src/index.ts'; + outputFile = 'index.js'; + } else if (isDevelopment) { + // Development. + if (exists('./test/index.js')) entry = './test/index.js'; + if (exists('./test/index.ts')) entry = './test/index.ts'; + outputFile = 'test_bundle.js'; + } else if (isTest) { + // Test. + // Create an entry point for each .mocha.js file. + fs.readdirSync('./test/') + .filter((file) => file.substr(-9) === '.mocha.js') + .forEach((file) => { + const entryName = file.replace(/\.mocha\.js/i, ''); + if (!entry) entry = {}; + entry[entryName] = `./test/${file}`; + }); + outputFile = '[name].mocha.js'; + target = 'node'; + // Certain optional plugins wanted by dependencies of blockly + // (jsdom want canvas, jsdom depends on ws which wants + // bufferutils and utf-8-validate) are loaded via: + // + // try {/*...*/ = require('package')} catch (e) {/*...*/} + // + // Webpack tries to satisfy the require even though it's in a + // try/catch, and issues a warning if it can't be found. + // IgnorePlugin suppresses this. + plugins.push( + new webpack.IgnorePlugin({ + resourceRegExp: /^(canvas|bufferutil|utf-8-validate)$/, + }), + ); + } + + return { + target, + mode: isProduction ? 'production' : 'development', + entry: entry, + devtool: isProduction ? 'source-map' : 'eval-source-map', + output: { + path: isProduction ? resolveApp('dist') : resolveApp('build'), + publicPath: isProduction ? '/dist/' : '/build/', + filename: outputFile, + library: { + type: 'umd', + }, + globalObject: 'this', + clean: true, + }, + resolve: { + extensions: ['.ts', '.js', '.json', '.wasm'], + // Some deps may require node.js core modules. Tell node.js what + // polyfills to use for them when building for non-node.js targets + // (Or to ignore them if the fallback is false.) + fallback: { + util: false, + }, + }, + module: { + rules: [ + // Load Blockly source maps. + { + test: /(blockly[/\\].*\.js)$/, + use: [require.resolve('source-map-loader')], + enforce: 'pre', + }, + isTypescript && { + test: /\.tsx?$/, + loader: require.resolve('ts-loader'), + options: isProduction ? {} : {compilerOptions: {rootDir: '.'}}, + }, + ].filter(Boolean), + }, + // Ignore spurious warnings from source-map-loader + // It can't find source maps for some Closure modules and that is expected + ignoreWarnings: [/Failed to parse source map.*blockly/], + plugins, + externals: isProduction + ? { + 'blockly': { + root: 'Blockly', + commonjs: 'blockly', + commonjs2: 'blockly', + amd: 'blockly', + }, + 'blockly/core': { + root: 'Blockly', + commonjs: 'blockly/core', + commonjs2: 'blockly/core', + amd: 'blockly/core', + }, + 'blockly/javascript': { + root: 'Blockly.JavaScript', + commonjs: 'blockly/javascript', + commonjs2: 'blockly/javascript', + amd: 'blockly/javascript', + }, + 'blockly/python': { + root: 'Blockly.Python', + commonjs: 'blockly/python', + commonjs2: 'blockly/python', + amd: 'blockly/python', + }, + 'blockly/dart': { + root: 'Blockly.Dart', + commonjs: 'blockly/dart', + commonjs2: 'blockly/dart', + amd: 'blockly/dart', + }, + 'blockly/php': { + root: 'Blockly.PHP', + commonjs: 'blockly/php', + commonjs2: 'blockly/php', + amd: 'blockly/php', + }, + 'blockly/lua': { + root: 'Blockly.Lua', + commonjs: 'blockly/lua', + commonjs2: 'blockly/lua', + amd: 'blockly/lua', + }, + 'jsdom': 'commonjs jsdom', + } + : {jsdom: 'commonjs jsdom'}, + }; +}; diff --git a/packages/plugins/dev-scripts/config/webpackDevServer.config.js b/packages/plugins/dev-scripts/config/webpackDevServer.config.js new file mode 100644 index 00000000000..0e3d3fc4754 --- /dev/null +++ b/packages/plugins/dev-scripts/config/webpackDevServer.config.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * @fileoverview Webpack dev server configuration file. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +module.exports = () => { + return { + port: 'auto', + hot: true, + static: ['./test'], + watchFiles: { + paths: './', + options: { + ignored: 'node_modules', + }, + }, + open: true, + client: { + overlay: { + errors: true, + warnings: false, + }, + }, + }; +}; diff --git a/packages/plugins/dev-scripts/package.json b/packages/plugins/dev-scripts/package.json new file mode 100644 index 00000000000..70b82eb60f5 --- /dev/null +++ b/packages/plugins/dev-scripts/package.json @@ -0,0 +1,51 @@ +{ + "name": "@blockly/dev-scripts", + "version": "13.1.0", + "description": "Configuration and scripts for Blockly plugins.", + "bin": { + "blockly-scripts": "./bin/blockly-scripts.js" + }, + "author": "Blockly Team", + "keywords": [ + "blockly", + "dev", + "scripts" + ], + "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/dev-scripts#readme", + "bugs": { + "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git", + "directory": "plugins/dev-scripts" + }, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^8.0.0", + "chalk": "^4.1.2", + "fork-ts-checker-webpack-plugin": "^9.1.0", + "install": "^0.13.0", + "mocha": "^11.7.6", + "rimraf": "^6.1.3", + "source-map-loader": "^5.0.0", + "ts-loader": "^9.6.1", + "webpack": "^5.107.2", + "webpack-cli": "^7.0.3", + "webpack-dev-server": "^5.2.5" + }, + "peerDependencies": { + "typescript": "^4.3.2 || ^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "typescript": "^6.0.3" + } +} diff --git a/packages/plugins/dev-scripts/scripts/auditFix.js b/packages/plugins/dev-scripts/scripts/auditFix.js new file mode 100644 index 00000000000..f7daed5b1a6 --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/auditFix.js @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview An audit and fix script for Blockly extension packages. + * This script: + * - Runs `npm install` to get a clean (not locally linked) installation. + * - Runs `npm audit fix` to do the fixes. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const execSync = require('child_process').execSync; + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); + +console.log(`Running npm audit fix steps for ${packageJson.name}`); + +// Run npm install. +execSync(`npm install`, {stdio: [0, 1, 2]}); + +// Audit fix. +execSync(`npm audit fix`, {stdio: [0, 1, 2]}); diff --git a/packages/plugins/dev-scripts/scripts/build.js b/packages/plugins/dev-scripts/scripts/build.js new file mode 100644 index 00000000000..8507409bc6d --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/build.js @@ -0,0 +1,79 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A 'build' script for Blockly extension packages. + * This script: + * - Uses webpack to build the src directory in development mode if no + * additional arguments are passed. + * - Uses webpack to build the src directory in production mode if + * ``blockly-scripts build prod`` is called. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); + +const chalk = require('chalk'); +const webpack = require('webpack'); +const webpackConfig = require('../config/webpack.config'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); +console.log(`Running production build for ${packageJson.name}`); + +// Create the webpack configuration for based on the build environment. +const config = webpackConfig({ + mode: 'production', +}); +if (!config.entry) { + console.log(`${chalk.red(`Configuration error.`)} +Make sure a ${chalk.red('src/index.(js|ts)')} file is included in your package. +`); + process.exit(1); +} + +// Create and run the webpack compiler. +webpack(config, (err, stats) => { + if (err) { + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + process.exit(1); + } + const statsData = stats.toJson({ + all: false, + warnings: true, + errors: true, + }); + + const formatWebpackMessage = (obj) => { + return obj.message.trim(); + }; + + const messages = { + errors: statsData.errors.map(formatWebpackMessage), + warnings: statsData.warnings.map(formatWebpackMessage), + }; + + if (!messages.errors.length && !messages.warnings.length) { + console.log(chalk.green('Compiled successfully!')); + } + if (messages.errors.length) { + console.log(chalk.red('Failed to compile.\n')); + console.log(messages.errors.join('\n\n')); + process.exit(1); + } + if (messages.warnings.length) { + console.log(chalk.yellow('Compiled with warnings.\n')); + console.log(messages.warnings.join('\n\n')); + } +}); diff --git a/packages/plugins/dev-scripts/scripts/clean.js b/packages/plugins/dev-scripts/scripts/clean.js new file mode 100644 index 00000000000..8528fc5465d --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/clean.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A 'clean' script for Blockly extension packages. + * This script: + * Deletes the dist and build directories if they exist. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const rimraf = require('rimraf'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); +console.log(`Running clean for ${packageJson.name}`); + +// Delete both the dist and build directories if they exist. +const dirs = ['dist', 'build']; +dirs.forEach((dir) => { + rimraf.sync(resolveApp(dir)); +}); diff --git a/packages/plugins/dev-scripts/scripts/predeploy.js b/packages/plugins/dev-scripts/scripts/predeploy.js new file mode 100644 index 00000000000..922fbcf2eb5 --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/predeploy.js @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A 'predeploy' script for Blockly extension packages. + * This script: + * - Uses webpack to build the test directory in development mode in + * preparation for deployment. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); + +const chalk = require('chalk'); +const webpack = require('webpack'); +const webpackConfig = require('../config/webpack.config'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); +console.log(`Running predeploy for ${packageJson.name}`); + +// Create the webpack configuration for based on the build environment. +const config = webpackConfig({ + mode: 'development', +}); +if (!config.entry) { + console.log(`${chalk.red(`Configuration error.`)} +Make sure a ${chalk.red('src/index.(js|ts)')} file is included in your package. +`); + process.exit(1); +} + +// Create and run the webpack compiler. +webpack(config, (err, stats) => { + if (err) { + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + return; + } + console.log( + stats.toString({ + chunks: false, // Makes the build much quieter + colors: true, // Shows colors in the console + }), + ); +}); diff --git a/packages/plugins/dev-scripts/scripts/start.js b/packages/plugins/dev-scripts/scripts/start.js new file mode 100644 index 00000000000..030a1fe0f34 --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/start.js @@ -0,0 +1,188 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A 'start' script for Blockly extension packages. + * This script: + * Builds the src and test directories in development mode. + * Starts the webpack dev server which watches changes to these directories. + * Opens the test page `0.0.0.0:3000/test`. + * Hot reloads the page if any changes are made to the source files. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const os = require('os'); + +const webpack = require('webpack'); +const WebpackDevServer = require('webpack-dev-server'); +const webpackConfig = require('../config/webpack.config'); +const webpackDevServerConfig = require('../config/webpackDevServer.config'); + +const chalk = require('chalk'); +const codeFrame = require('@babel/code-frame').codeFrameColumns; +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); +const isTypescript = fs.existsSync(resolveApp('tsconfig.json')); + +console.log(`Running start for ${packageJson.name}`); + +// Create the webpack configuration for the development environment. +// Build the test directory. +const config = webpackConfig({ + mode: 'development', +}); +if (!config.entry) { + console.log(`${chalk.red(`Configuration error.`)} +Make sure a ${chalk.red('test/index.(js|ts)')} file is included in your package. +`); + process.exit(1); +} + +let compiler; +try { + compiler = webpack(config); +} catch (err) { + console.log(`${chalk.red('Failed to compile.')}\n${err.message || err}\n`); + process.exit(1); +} + +const devSocket = { + warnings: (warnings) => + devServer.sockWrite(devServer.sockets, 'warnings', warnings), + errors: (errors) => devServer.sockWrite(devServer.sockets, 'errors', errors), +}; + +compiler.hooks.invalid.tap('invalid', () => { + console.log('Compiling...'); +}); + +let tsMessagesPromise; +let tsMessagesResolver; + +if (isTypescript) { + compiler.hooks.beforeCompile.tap('beforeCompile', () => { + tsMessagesPromise = new Promise((resolve) => { + tsMessagesResolver = (msgs) => resolve(msgs); + }); + }); + + // Register TypeScript type checker hooks. + const tsCheckerHooks = ForkTsCheckerWebpackPlugin.getCompilerHooks(compiler); + tsCheckerHooks.issues.tap('done', (issues) => { + const formatTypecheckerMessage = (message) => { + const {severity, file, line, character} = message; + + const messageColor = severity == 'warning' ? chalk.yellow : chalk.red; + + const source = + file && fs.existsSync(file) && fs.readFileSync(file, 'utf-8'); + const frame = source + ? codeFrame( + source, + {start: {line: line, column: character}}, + {highlightCode: true, linesAbove: 2, linesBelow: 2}, + ) + .split('\n') + .map((str) => ' ' + str) + .join(os.EOL) + : ''; + + return [ + os.EOL, + messageColor.bold(`${severity.toLowerCase()} in `) + + chalk.cyan.bold(`${file}(${line},${character})`) + + messageColor(':'), + '', + frame, + ].join(os.EOL); + }; + + tsMessagesResolver({ + errors: issues + .filter((msg) => msg.severity === 'error') + .map(formatTypecheckerMessage), + warnings: issues + .filter((msg) => msg.severity === 'warning') + .map(formatTypecheckerMessage), + }); + + return issues; + }); +} + +// Register webpack compiler hooks. +compiler.hooks.done.tap('done', async (stats) => { + const statsData = stats.toJson({ + all: false, + warnings: true, + errors: true, + }); + + const formatWebpackMessage = (obj) => { + return obj.message.trim(); + }; + + const messages = { + errors: statsData.errors.map(formatWebpackMessage), + warnings: statsData.warnings.map(formatWebpackMessage), + }; + + if (isTypescript && statsData.errors.length === 0) { + const delayedMsg = setTimeout(() => { + console.log( + chalk.yellow( + 'Files successfully emitted, waiting for typecheck results...', + ), + ); + }, 100); + + const tsMessages = await tsMessagesPromise; + clearTimeout(delayedMsg); + + messages.warnings.push(...tsMessages.errors); + messages.warnings.push(...tsMessages.warnings); + + if (tsMessages.errors.length > 0) { + devSocket.warnings(tsMessages.errors); + } else if (tsMessages.warnings.length > 0) { + devSocket.warnings(tsMessages.warnings); + } + } + + // Emit compile output. + if (!messages.errors.length && !messages.warnings.length) { + console.log(chalk.green('Compiled successfully!')); + } + if (messages.errors.length) { + console.log(chalk.red('Failed to compile.\n')); + console.log(messages.errors.join('\n\n')); + return; + } + if (messages.warnings.length) { + console.log(chalk.yellow('Compiled with warnings.\n')); + console.log(messages.warnings.join('\n\n')); + } +}); + +// Read the webpack devServer configuration. +const serverConfig = webpackDevServerConfig(); + +// Start the dev server. +const devServer = new WebpackDevServer(serverConfig, compiler); +devServer.startCallback((err) => { + if (err) { + return console.log(err); + } + console.log('Starting the development server...\n'); +}); diff --git a/packages/plugins/dev-scripts/scripts/test.js b/packages/plugins/dev-scripts/scripts/test.js new file mode 100644 index 00000000000..8df4aa140d7 --- /dev/null +++ b/packages/plugins/dev-scripts/scripts/test.js @@ -0,0 +1,92 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A 'test' script for Blockly extension packages. + * This script: + * Runs mocha tests on all *.mocha.js tests in the test directory. + * @author samelh@google.com (Sam El-Husseini) + */ + +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const chalk = require('chalk'); +const Mocha = require('mocha'); +const webpack = require('webpack'); +const webpackConfig = require('../config/webpack.config'); + +const appDirectory = fs.realpathSync(process.cwd()); +const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath); + +const packageJson = require(resolveApp('package.json')); +console.log(`Building tests for ${packageJson.name}`); + +const config = webpackConfig({ + mode: 'test', +}); +if (!config.entry) { + console.log( + chalk.yellow(`Warning: No tests found`) + + '\n' + + 'There were no ' + + chalk.yellow('test/*.mocha.js') + + ' files found ' + + 'in your package.\n', + ); + process.exit(0); +} + +let mochaConfig = { + ui: 'tdd', +}; +// If custom configuration exists, use that instead. +const testDir = resolveApp('test'); +if (fs.existsSync(path.join(testDir, '.mocharc.js'))) { + mochaConfig = require(path.join(testDir, '.mocharc.js')); +} + +// Create and run the webpack compiler. +webpack(config, (err, stats) => { + if (err) { + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + return; + } + console.log( + stats.toString({ + chunks: false, // Makes the build much quieter + colors: true, // Shows colors in the console + }), + ); + + // Run mocha. + console.log(`Running tests for ${packageJson.name}`); + + // Instantiate a Mocha instance. + const mocha = new Mocha(mochaConfig); + + // Run mocha for each built mocha .js file. + const testOutputDir = 'build'; + fs.readdirSync(testOutputDir) + .filter((file) => { + // Only keep the .mocha.js files + return file.substr(-9) === '.mocha.js'; + }) + .forEach((file) => { + mocha.addFile(path.join(testOutputDir, file)); + }); + + // Run the tests. + mocha.run((failures) => { + // exit with non-zero status if there were failures. + process.exitCode = failures ? 1 : 0; + }); +}); diff --git a/packages/plugins/dev-tools/package.json b/packages/plugins/dev-tools/package.json index bf6cc6ac0f0..7a6d9c3789c 100644 --- a/packages/plugins/dev-tools/package.json +++ b/packages/plugins/dev-tools/package.json @@ -47,12 +47,12 @@ "dat.gui": "^0.7.9", "lodash.assign": "^4.2.0", "lodash.merge": "^4.6.2", - "monaco-editor": "^0.55.1", - "sinon": "^22.0.0" + "monaco-editor": "^0.55.1" }, "devDependencies": { "@blockly/dev-scripts": "^13.1.0", - "@types/dat.gui": "^0.7.13" + "@types/dat.gui": "^0.7.13", + "sinon": "^22.0.0" }, "peerDependencies": { "blockly": "^13.1.1"