diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 47863ac82..44b66379d 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -2,10 +2,8 @@
## How can I contribute?
-- [Suggest](https://github.com/RaspberryPiFoundation/blockly-samples/issues/new?assignees=&labels=status%3A+triage&template=feature_request.yaml) plugins or examples
+- [Suggest](https://github.com/RaspberryPiFoundation/blockly-samples/issues/new?assignees=&labels=status%3A+triage&template=feature_request.yaml) examples
- :arrow_right: Start by reading [How To Write A Good Issue](https://docs.blockly.com/guides/modify/contribute/write_a_good_issue)
-- Implement plugins
- - :arrow_right: Read up on how to [Add a Plugin](https://docs.blockly.com/guides/modify/contribute/add_a_plugin)
- [Report bugs](https://github.com/RaspberryPiFoundation/blockly-samples/issues/new?assignees=&labels=status%3A+triage&template=bug_report.yaml)
- :arrow_right: Start by reading [How To Write A Good Issue](https://docs.blockly.com/guides/modify/contribute/write_a_good_issue)
- Fix bugs
@@ -37,4 +35,4 @@ This project follows
## More information
-Head over to the [Developer Site](https://docs.blockly.com/guides/modify/contributing) for more information, including an [overview of the repository structure](https://docs.blockly.com/guides/modify/contribute/samples_repository_structure) and details of our [publishing process](https://docs.blockly.com/guides/modify/contribute/add_a_plugin#publishing).
+Head over to the [Developer Site](https://docs.blockly.com/guides/modify/contributing) for more information, including an [overview of the repository structure](https://docs.blockly.com/guides/modify/contribute/samples_repository_structure).
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
index ab659267a..a3eb23bac 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -20,7 +20,7 @@ body:
attributes:
label: Component
description: Which component has a bug?
- placeholder: e.g. workspace search plugin, RTL demo
+ placeholder: e.g. RTL demo
- type: textarea
id: description
attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
index 7aef88666..62df16122 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yaml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -20,7 +20,7 @@ body:
attributes:
label: Component
description: Which component does this request apply to?
- placeholder: e.g. workspace search plugin, RTL demo
+ placeholder: e.g. RTL demo
- type: textarea
id: problem
attributes:
diff --git a/.github/workflows/build.yml b/.github/workflows/lint_and_format.yml
similarity index 56%
rename from .github/workflows/build.yml
rename to .github/workflows/lint_and_format.yml
index facc36618..21c85702e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/lint_and_format.yml
@@ -1,4 +1,4 @@
-# This workflow will lint, build and test Blockly samples.
+# This workflow will lint and format Blockly samples.
name: Build and Test
@@ -8,29 +8,6 @@ permissions:
contents: read
jobs:
- build:
- timeout-minutes: 10
- runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [22.x, 24.x]
- steps:
- - uses: actions/checkout@v4
-
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
- with:
- node-version: ${{ matrix.node-version }}
-
- - name: Npm CI
- run: npm ci
-
- - name: Build
- run: npm run build
-
- - name: Test
- run: npm run test
-
lint:
timeout-minutes: 5
runs-on: ubuntu-latest
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
deleted file mode 100644
index e56e77c52..000000000
--- a/.github/workflows/publish.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-# This workflow handles releasing all of the packages in samples.
-
-name: publish
-
-on:
- workflow_dispatch: # Manually trigger. Colon is required.
- inputs:
- version:
- description: 'Version to publish all (non-private) plugins as.'
- required: true
- type: string
- default: '13.1.0'
- from-package:
- description: 'Check to publish from-package instead of the default publish. This skips versioning and publishes any package whose package.json version is not yet on npm. Use this to retry a partially-failed run, or to publish a plugin that was previously held back as private (remove private first).'
- required: false
- type: boolean
- default: false
-
-permissions:
- id-token: write # Required for OIDC.
- contents: write # For checkout and tag.
- packages: write # For publish.
-
-jobs:
- publish:
- runs-on: ubuntu-latest
- # Don't try to publish from a fork of RaspberryPiFoundation/blockly-samples.
- if: ${{ github.repository_owner == 'RaspberryPiFoundation' }}
-
- # Environment specific to releasing so we can isolate the npm token.
- environment: release
-
- steps:
- - name: Checkout
- uses: actions/checkout@v5
- # fetch all tags and commits so that lerna can version appropriately
- with:
- fetch-depth: 0
- ref: 'main'
-
- # This uses a reverse-engineered email for the github actions bot. See
- # https://github.com/actions/checkout/issues/13#issuecomment-724415212
- - name: Git Identity
- run: |
- git config --global user.name 'github-actions[bot]'
- git config --global user.email '<41898282+github-actions[bot]@users.noreply.github.com'
-
- - name: Setup Node
- uses: actions/setup-node@v6
- with:
- node-version: 24
- registry-url: 'https://registry.npmjs.org'
-
- - name: NPM install
- # Use CI so that we don't update dependencies in this step.
- run: npm ci
-
- - name: Build
- run: npm run build
-
- - name: Test
- run: npm run test
-
- - name: Publish
- env:
- GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- FROM_PACKAGE: ${{ github.event.inputs['from-package'] }}
- VERSION: ${{ github.event.inputs.version }}
- run: |
- cd plugins
- if [ "${FROM_PACKAGE}" = "true" ]; then
- npx lerna publish from-package --yes --loglevel silly
- else
- npx lerna publish "${VERSION}" --force-publish --conventional-commits --create-release github --yes --loglevel silly
- fi
-
- update-gh-pages:
- name: Update GitHub Pages
- # Call the Update gh-pages workflow only if publishing succeeds
- needs: [publish]
- # Don't try to auto-update if on a fork of RaspberryPiFoundation/blockly-samples.
- if: ${{ github.repository_owner == 'RaspberryPiFoundation' }}
- uses: ./.github/workflows/update_gh_pages.yml
diff --git a/.gitignore b/.gitignore
index 85956cb31..c2cb71088 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,8 +12,6 @@ node_modules/
# Generated files
dist/
build/
-plugins/*/test/**/*.d.ts
-plugins/*/test/**/*.d.ts.map
gh-pages/index.html
gh-pages/plugins
gh-pages/examples
diff --git a/.prettierignore b/.prettierignore
index f2014cf73..3c33c8d62 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -18,12 +18,5 @@ examples/lib/*
CHANGELOG.md
PULL_REQUEST_TEMPLATE.md
-# Specific examples that are sometimes copied into plugins
-plugins/dev-create/templates/sample-app/*
-plugins/dev-create/templates/sample-app-ts/*
-
-# Golden test files
-plugins/**/golden/*
-
/.nx/cache
-/.nx/workspace-data
\ No newline at end of file
+/.nx/workspace-data
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 543abf391..000000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Features
-
-* **field-bitmap:** make the bitmap editor keyboard and screen-reader accessible ([#2754](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2754))
-* **field-grid-dropdown:** wrap vertical keyboard focus across columns
-
-### Bug Fixes
-
-* **block-dynamic-connection:** recache connection pairs after dynamically adding new ones
-* **field-grid-dropdown:** announce as a grid popup instead of a listbox
-* FieldGridDropdown recomputeAriaContext no longer throws an error ([#2741](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2741))
-* Fix positioning of dropdown on full-block color fields ([#2747](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2747))
-* Improve accessibility of colour slider plugin ([#2745](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2745))
-* Minimap variable renaming ([#2756](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2756))
-* **workspace-search:** set search buttons to type='button'
-* Wrong code generation for FieldImage ([#2755](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2755))
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-### ⚠ BREAKING CHANGES
-
-* make field-multilineinput keyboard navigable and accessible (#2729)
-* Add ARIA labels for block-plus-minus (#2696)
-* Bump Blockly dependency to v13 (#2704)
-
-### Features
-
-* fix keyboard nav for minimap ([#2730](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2730))
-* make field-multilineinput keyboard navigable and accessible ([#2729](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2729))
-
-### Bug Fixes
-
-* Add ARIA labels for block-plus-minus ([#2696](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2696))
-* Fix block-test under v13 ([#2714](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2714))
-* Fix bug that caused focus to move to parent block when vivifying a shadow ([#2726](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2726))
-* Fix chaotic glitchiness when using scroll options with keyboard moves ([#2732](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2732))
-* Fix JSDom whinging about its default stylesheet ([#2700](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2700))
-* Fix keyboard navigation for the continuous toolbox ([#2690](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2690))
-* Fix minimap plugin under v13 ([#2702](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2702))
-* Fix strict connection checker tests ([#2703](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2703))
-* Fix the tests for block-dynamic-connection ([#2705](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2705))
-* Fix the workspace-search plugin tests ([#2706](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2706))
-* Fix typed-variable-modal build and tests ([#2701](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2701))
-* Improve accessibility of `FieldAngle` ([#2697](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2697))
-* Improve accessibility of `FieldDate` ([#2698](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2698))
-* Improve accessibility of grid and colour fields ([#2724](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2724))
-* Improve accessibility of toolbox search ([#2713](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2713))
-* Improve keyboard accessibility of slider field ([#2727](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2727))
-* Improve the keyboard and screenreader accessibility of the backpack ([#2731](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2731))
-* Make zoom to fit plugin keyboard and screenreader accessible ([#2728](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2728))
-* Remove deprecated calls from block-shareable-procedures ([#2699](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2699))
-* wrap sample app eval in try/catch ([#2733](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2733))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
diff --git a/README.md b/README.md
index ed83629d5..a99ab45c0 100644
--- a/README.md
+++ b/README.md
@@ -2,14 +2,10 @@
Blockly Samples
-Plugins and examples related to the [Blockly](https://github.com/RaspberryPiFoundation/blockly) library.
+Examples related to the [Blockly](https://github.com/RaspberryPiFoundation/blockly) library.
-This repository has two sections:
-
-- [Plugins](plugins/): self-contained pieces of code that add functionality to Blockly.
-- [Examples](examples/): self-contained sample projects demonstrating techniques to include and extend the Blockly library.
-
-Please see our [GitHub Pages site](https://raspberrypifoundation.github.io/blockly-samples/index.html) for interactive demos of most plugins.
+This repository contains a variety of [self-contained sample projects](examples/) demonstrating techniques to include and extend the Blockly library.
+Please see our [GitHub Pages site](https://raspberrypifoundation.github.io/blockly-samples/index.html) for interactive demos of most examples, as well as plugins, which live in the [core Blockly repository](https://github.com/RaspberryPiFoundation/blockly).
## Support
diff --git a/eslint.config.js b/eslint.config.js
index 36345e337..503b09ddd 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -35,12 +35,6 @@ module.exports = [
'**/dist/',
'**/build/',
'examples/blockly-svelte/public/bundle.js',
- 'plugins/migration/test/manual-test-data/',
- // specific examples that are sometimes copied into plugins
- 'plugins/dev-create/templates/sample-app',
- 'plugins/dev-create/templates/sample-app-ts',
- // Golden test files
- 'plugins/**/golden/*',
],
},
js.configs.recommended, // eslint-recommended
diff --git a/examples/headless-demo/index.html b/examples/headless-demo/index.html
index 8c01ed278..7e1530f75 100644
--- a/examples/headless-demo/index.html
+++ b/examples/headless-demo/index.html
@@ -129,8 +129,7 @@
]
}
}
-
+
diff --git a/gh-pages/README.md b/gh-pages/README.md
index 344c4b574..771b807df 100644
--- a/gh-pages/README.md
+++ b/gh-pages/README.md
@@ -21,11 +21,9 @@ To test locally with a beta version of Blockly, go to the root of blockly-sample
Run the [Update GitHub Pages Action](https://github.com/RaspberryPiFoundation/blockly-samples/actions/workflows/update_gh_pages.yml) from either the `RaspberryPiFoundation/blockly-samples` repo or your fork to deploy to that location automatically. Click the "Run workflow" button to start it. After this workflow finishes, GitHub's built-in "build and deploy" action will automatically start. When that finishes, the updated site will be live.
-Note: Updating GitHub Pages is done automatically when publishing plugins through the Publish action.
-
### Manual
-1. Make sure everything is installed (plugins and examples). From root, run:
+1. Make sure examples are installed. From root, run:
```
npm install
diff --git a/gulpfile.js b/gulpfile.js
index 3119d66e9..f7e66bae5 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -9,212 +9,12 @@
*/
const execSync = require('child_process').execSync;
-const fs = require('fs');
const ghpages = require('gh-pages');
const gulp = require('gulp');
-const jsgl = require('js-green-licenses');
-const path = require('path');
-const rimraf = require('rimraf');
const predeployTasks = require('./scripts/gh-predeploy');
gulp.header = require('gulp-header');
-/**
- * Run the license checker for all packages.
- * @returns {Promise} A promise.
- */
-function checkLicenses() {
- const checker = new jsgl.LicenseChecker({
- // dev: true,
- // verbose: false,
- });
- checker.setDefaultHandlers();
- const pluginsDir = 'plugins';
- const promises = [];
- // Check root package.json.
- promises.push(checker.checkLocalDirectory('.'));
- fs.readdirSync(pluginsDir)
- .filter((file) => {
- return fs.statSync(path.join(pluginsDir, file)).isDirectory();
- })
- .forEach((plugin) => {
- const pluginDir = path.join(pluginsDir, plugin);
- // Check each plugin package.json.
- promises.push(checker.checkLocalDirectory(pluginDir));
- });
- return Promise.all(promises);
-}
-
-/**
- * Prepare for publishing. Must be run before any manual publish command.
- *
- * Clones blockly-samples, runs build and tests.
- * @param {Function} done Completed callback.
- */
-function prepareForPublish(done) {
- const releaseDir = 'dist';
-
- // Delete the release directory if it exists.
- if (fs.existsSync(releaseDir)) {
- console.log('Removing previous `dist/` directory.');
- rimraf.sync(releaseDir);
- }
-
- // Clone a fresh copy of blockly-samples.
- console.log(
- `Checking out a fresh copy of blockly-samples under ` +
- `${path.resolve(releaseDir)}`,
- );
- execSync(
- `git clone https://github.com/RaspberryPiFoundation/blockly-samples ${releaseDir}`,
- {stdio: 'pipe'},
- );
-
- // Run npm ci.
- console.log('Running npm ci to install.');
- execSync(`npm ci`, {cwd: releaseDir, stdio: 'inherit'});
-
- // Build all plugins.
- console.log('Building all plugins.');
- execSync('npm run build', {cwd: releaseDir, stdio: 'inherit'});
-
- // Test all plugins.
- console.log('Testing all plugins.');
- execSync('npm run test', {cwd: releaseDir, stdio: 'inherit'});
-
- done();
-}
-
-/**
- * Exit early if the release directory does not exist.
- * @param {string} releaseDir release directory to check
- * @param {Function} done Gulp callback.
- */
-function exitIfNoReleaseDir(releaseDir, done) {
- // Check that release directory exists.
- if (!fs.existsSync(releaseDir)) {
- console.error(
- `No release directory ${releaseDir} exists. ` +
- `blockly-samples may not have been cloned correctly.`,
- );
- done();
- process.exit(1);
- }
-}
-
-/**
- * Publishes plugins using lerna. MUST be run after `prepareForPublish`.
- * @param {boolean=} force True for forcing all plugins to publish, even ones
- * that have not changed.
- * @returns {Function} Gulp task.
- */
-function publish(force) {
- return (done) => {
- const releaseDir = 'dist/plugins';
- exitIfNoReleaseDir(releaseDir, done);
-
- // Run lerna publish. Uses conventional commits for versioning
- // creates the release on GitHub.
- console.log(`Publishing ${force ? 'all' : 'changed'} plugins.`);
- execSync(
- `lerna publish --conventional-commits --create-release github` +
- `${force ? ' --force-publish=*' : ''}`,
- {cwd: releaseDir, stdio: 'inherit'},
- );
-
- console.log('Removing release directory.');
- rimraf.sync(releaseDir);
-
- done();
- };
-}
-
-/**
- * Publish all plugins that have changed since the last release.
- * Run `npm run publish:prepare` before running this script.
- * @param {Function} done Completed callback.
- * @returns {Function} Gulp task.
- */
-function prepareAndPublish(done) {
- return gulp.series(prepareForPublish, publish(false))(done);
-}
-
-/**
- * Forces all plugins to publish.
- * Uses the built in lerna option --force-publish=*.
- * @param {Function} done Completed callback.
- * @returns {Function} Gulp task.
- */
-function prepareAndForcePublish(done) {
- return gulp.series(prepareForPublish, publish(true))(done);
-}
-
-/**
- * Publishes plugins that haven't previously been uploaded to npm.
- * Useful if a previous run of publishing failed after versions were
- * uploaded to github but not all packages were placed uploaded to npm.
- * You must run `npm run publish:prepare` first.
- * @param {Function} done Completed callback.
- */
-function publishFromPackage(done) {
- const releaseDir = 'dist/plugins';
- exitIfNoReleaseDir(releaseDir, done);
-
- // Run lerna publish. Will not update versions.
- console.log(`Publishing plugins from package.json versions.`);
- execSync(`lerna publish from-package`, {
- cwd: releaseDir,
- stdio: 'inherit',
- });
-
- console.log('Removing release directory.');
- rimraf.sync(releaseDir);
- done();
-}
-
-/**
- * Publishes plugins that haven't been previously uploaded to npm.
- * Also runs the prepare scripts to ensure plugins have been built and tested before publishing.
- * @param {Function} done Completed callback.
- * @returns {Function} Gulp task.
- */
-function prepareAndPublishFromPackage(done) {
- return gulp.series(prepareForPublish, publishFromPackage)(done);
-}
-
-/**
- * Runs lerna version to check which version numbers would be updated.
- * The version numbers will not be pushed and no tags or releases will
- * be created, even if you answer 'yes' to the prompt.
- * @param {Function} done Completed callback.
- */
-function checkVersions(done) {
- const releaseDir = 'dist/plugins';
- exitIfNoReleaseDir(releaseDir, done);
-
- // Check version numbers that would be created.
- console.log(
- 'Running lerna version.',
- 'These version numbers will not be pushed and no tags will be created,',
- 'even if you answer yes to the prompt.',
- );
- execSync(
- `lerna version --conventional-commits --no-git-tag-version --no-push`,
- {cwd: releaseDir, stdio: 'inherit'},
- );
-
- done();
-}
-
-/**
- * Runs prepareForPublish and then checkVersions.
- * @param {Function} done Completed callback.
- * @returns {Function} Gulp task.
- */
-function prepareAndCheckVersions(done) {
- return gulp.series(prepareForPublish, checkVersions)(done);
-}
-
/**
* Deploy all plugins to gh-pages.
* @param {string=} repo The repo to deploy to.
@@ -239,25 +39,6 @@ function deployToGhPages(repo) {
};
}
-/**
- * Prepares plugins to be tested locally.
- * @param {boolean} isBeta True if we want to test gh pages with the beta
- * version of Blockly.
- * @returns {Function} Gulp task.
- */
-function preparePluginsForLocal(isBeta) {
- return (done) => {
- if (isBeta) {
- execSync(`npm install blockly@beta --force `, {
- stdio: 'inherit',
- });
- }
- // Bundles all the plugins.
- execSync(`npm run deploy:prepare:plugins`, {stdio: 'inherit'});
- done();
- };
-}
-
/**
* Prepares examples to be tested locally.
* @param {boolean} isBeta True if we want to test gh pages with the beta
@@ -286,10 +67,7 @@ function prepareExamplesForLocal(isBeta) {
*/
function testGhPagesLocally(isBeta) {
return gulp.series(
- gulp.parallel(
- preparePluginsForLocal(isBeta),
- prepareExamplesForLocal(isBeta),
- ),
+ prepareExamplesForLocal(isBeta),
predeployTasks.predeployAllLocal,
function (done) {
console.log('Starting server using http-server');
@@ -320,15 +98,9 @@ function deployToGhPagesUpstream(done) {
}
module.exports = {
- checkLicenses: checkLicenses,
deploy: deployToGhPagesOrigin,
deployUpstream: deployToGhPagesUpstream,
predeploy: predeployTasks.predeployAll,
- prepareForPublish: prepareForPublish,
- publishManual: prepareAndPublish,
- forcePublish: prepareAndForcePublish,
- publishFromPackage: prepareAndPublishFromPackage,
- checkVersions: prepareAndCheckVersions,
testGhPagesBeta: testGhPagesLocally(true),
testGhPages: testGhPagesLocally(false),
};
diff --git a/nx.json b/nx.json
index bf1ef8744..773314df7 100644
--- a/nx.json
+++ b/nx.json
@@ -1,13 +1,5 @@
{
"targetDefaults": {
- "build": {
- "cache": true,
- "dependsOn": ["^build"],
- "outputs": ["{projectRoot}/dist"]
- },
- "clean": {
- "dependsOn": []
- },
"deploy:prepare": {
"cache": true,
"dependsOn": [],
@@ -18,11 +10,6 @@
"dependsOn": [],
"outputs": ["{projectRoot}/dist"]
},
- "deploy:prepare:plugins": {
- "cache": true,
- "dependsOn": ["^deploy:prepare:plugins"],
- "outputs": ["{projectRoot}/dist"]
- },
"deploy": {
"dependsOn": []
},
@@ -37,9 +24,6 @@
"cache": true,
"dependsOn": []
},
- "license": {
- "dependsOn": []
- },
"lint": {
"cache": true,
"dependsOn": []
@@ -51,27 +35,6 @@
"postinstall": {
"dependsOn": []
},
- "test": {
- "cache": true,
- "dependsOn": ["^test"],
- "outputs": ["{projectRoot}/build"]
- },
- "publish:prepare": {
- "dependsOn": ["^publish:prepare"],
- "outputs": ["{projectRoot}/dist"]
- },
- "publish:manual": {
- "dependsOn": []
- },
- "publish:force": {
- "dependsOn": []
- },
- "publish:unpublishedOnly": {
- "dependsOn": []
- },
- "publish:checkVersions": {
- "dependsOn": []
- },
"test:ghpages:beta": {
"dependsOn": []
},
diff --git a/package-lock.json b/package-lock.json
index 1b57f083a..8df9a550f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,6 @@
"version": "0.0.0",
"license": "Apache-2.0",
"workspaces": [
- "plugins/*",
"examples/blockly-**",
"examples/**-demo",
"examples/sample-**",
@@ -21,6 +20,8 @@
"@eslint/js": "^10.0.1",
"@typescript-eslint/eslint-plugin": "^8.61.1",
"@typescript-eslint/parser": "^8.61.1",
+ "ajv": "^8.20.0",
+ "ajv-keywords": "^5.1.0",
"blockly": "^13.2.0",
"conventional-changelog-conventionalcommits": "^9.3.1",
"eslint": "^10.5.0",
@@ -32,7 +33,6 @@
"gulp": "^5.0.1",
"gulp-header": "^2.0.12",
"http-server": "^14.1.1",
- "js-green-licenses": "^4.0.0",
"lerna": "^9.0.7",
"prettier": "^3.8.4",
"rimraf": "^6.1.3",
@@ -50,8 +50,6 @@
},
"examples/backpack-demo/node_modules/@blockly/workspace-backpack": {
"version": "7.0.11",
- "resolved": "https://registry.npmjs.org/@blockly/workspace-backpack/-/workspace-backpack-7.0.11.tgz",
- "integrity": "sha512-VKxkk7SEIWkqEwZ8OueuDipw4+28dNKM16/JJRN8Vwhmjdt5uU/rWNB+3L0qD+woIAdUFbHYw/oA3quFGID6XQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8.17.0"
@@ -84,8 +82,6 @@
},
"examples/blockly-rtc/node_modules/@discoveryjs/json-ext": {
"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": {
@@ -94,71 +90,59 @@
},
"examples/blockly-rtc/node_modules/abbrev": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-5.0.0.tgz",
- "integrity": "sha512-/XrFJgzQQQHpti1raDJC6m4ws6aNktmjBlhk8Fdlk7LwCEuDoieEJJY9OFHjfiFJFFRM2tK+Ky/IsfbbmlMu1w==",
"dev": true,
"license": "ISC",
"engines": {
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
}
},
- "examples/blockly-rtc/node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"examples/blockly-rtc/node_modules/commander": {
"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"
}
},
- "examples/blockly-rtc/node_modules/isexe": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
- "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "examples/blockly-rtc/node_modules/envinfo": {
+ "version": "7.21.0",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
"engines": {
- "node": ">=20"
+ "node": ">=4"
}
},
- "examples/blockly-rtc/node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "examples/blockly-rtc/node_modules/import-local": {
+ "version": "3.2.0",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "examples/blockly-rtc/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "examples/blockly-rtc/node_modules/isexe": {
+ "version": "4.0.0",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 18"
+ "node": ">=20"
}
},
"examples/blockly-rtc/node_modules/node-gyp": {
"version": "13.1.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-13.1.0.tgz",
- "integrity": "sha512-FpNzOLFACKG0oRBYbZ5WOeWD1EqRTIWX90MaRIWTO18lVYPx8fqIjrdS3pihjnCkSmgop6zVGkSqg1vXZLksuw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -182,8 +166,6 @@
},
"examples/blockly-rtc/node_modules/nopt": {
"version": "10.0.1",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-10.0.1.tgz",
- "integrity": "sha512-df3sBr/6ax9hSGuC3CspvLlbnX8cP5L5nZwXF8cGN8l0zSWR6BvzmQ6jPUKjvo6+/xdpkNvEcucBNUdBeeV13g==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -198,8 +180,6 @@
},
"examples/blockly-rtc/node_modules/proc-log": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-7.0.0.tgz",
- "integrity": "sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==",
"dev": true,
"license": "ISC",
"engines": {
@@ -208,8 +188,6 @@
},
"examples/blockly-rtc/node_modules/tar": {
"version": "7.5.22",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz",
- "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -225,8 +203,6 @@
},
"examples/blockly-rtc/node_modules/undici": {
"version": "8.11.2",
- "resolved": "https://registry.npmjs.org/undici/-/undici-8.11.2.tgz",
- "integrity": "sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -235,8 +211,6 @@
},
"examples/blockly-rtc/node_modules/webpack-cli": {
"version": "7.2.3",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.3.tgz",
- "integrity": "sha512-vDFU7jrfCctnN7jJQWPl+V26B51GLp11prVZXg50oeonsgeBzSTJEWmXkjHsOjTgMjlPOQM8GWLh33X9RN/0ow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -287,8 +261,6 @@
},
"examples/blockly-rtc/node_modules/webpack-merge": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
- "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -302,8 +274,6 @@
},
"examples/blockly-rtc/node_modules/which": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-7.0.0.tgz",
- "integrity": "sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -316,16 +286,6 @@
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
}
},
- "examples/blockly-rtc/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"examples/custom-dialogs-demo": {
"name": "blockly-custom-dialog-demo",
"version": "13.2.0",
@@ -364,8 +324,6 @@
},
"examples/developer-tools/node_modules/@blockly/field-angle": {
"version": "6.0.9",
- "resolved": "https://registry.npmjs.org/@blockly/field-angle/-/field-angle-6.0.9.tgz",
- "integrity": "sha512-7cjOoOG7Ol8k2VIWuLkaDSnN5PGcG56PwzHbqrv0dWMWUVHZbyC4tPo8hWL+5I3X6ebvF5GU1VkX6pmwXyg9OQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8.0.0"
@@ -376,8 +334,6 @@
},
"examples/developer-tools/node_modules/@blockly/field-colour": {
"version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-6.0.12.tgz",
- "integrity": "sha512-sZUlMtn1Bnj3/inayhZAMJ1ZUxFfR8eISBWPgOvWMBlnUIeCWXJDc76a6JVEcZhnjHFjDI+ihOXYdrp5cedShA==",
"license": "Apache-2.0",
"dependencies": {
"@blockly/field-grid-dropdown": "^6.0.10"
@@ -391,8 +347,6 @@
},
"examples/developer-tools/node_modules/@blockly/field-grid-dropdown": {
"version": "6.0.10",
- "resolved": "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-6.0.10.tgz",
- "integrity": "sha512-b54xLznsFb5OyAfpFYCFX52M7vRc9dITbLzTBIsETuXfVX8R4TFj3z0+QbJ1znlqNhr5+dgrfDfkUEm8+8zbxg==",
"license": "Apache 2.0",
"engines": {
"node": ">=8.17.0"
@@ -403,8 +357,6 @@
},
"examples/developer-tools/node_modules/@discoveryjs/json-ext": {
"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": {
@@ -413,18 +365,25 @@
},
"examples/developer-tools/node_modules/commander": {
"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"
}
},
+ "examples/developer-tools/node_modules/envinfo": {
+ "version": "7.21.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"examples/developer-tools/node_modules/webpack-cli": {
"version": "7.0.3",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.3.tgz",
- "integrity": "sha512-2E2C6A1e2El7791zQgTH7LPIuwLjRliow9OHS/qlJc9pwhZlCoL/uiwqd/1WSlXT83wJfmfDbkcqHXuXoPJZ3g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -463,8 +422,6 @@
},
"examples/developer-tools/node_modules/webpack-merge": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
- "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -597,8 +554,6 @@
},
"examples/sample-app-ts/node_modules/@discoveryjs/json-ext": {
"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": {
@@ -607,18 +562,43 @@
},
"examples/sample-app-ts/node_modules/commander": {
"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"
}
},
+ "examples/sample-app-ts/node_modules/envinfo": {
+ "version": "7.21.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "examples/sample-app-ts/node_modules/import-local": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"examples/sample-app-ts/node_modules/webpack-cli": {
"version": "7.2.3",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.3.tgz",
- "integrity": "sha512-vDFU7jrfCctnN7jJQWPl+V26B51GLp11prVZXg50oeonsgeBzSTJEWmXkjHsOjTgMjlPOQM8GWLh33X9RN/0ow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -669,8 +649,6 @@
},
"examples/sample-app-ts/node_modules/webpack-merge": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
- "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -684,8 +662,6 @@
},
"examples/sample-app/node_modules/@discoveryjs/json-ext": {
"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": {
@@ -694,18 +670,43 @@
},
"examples/sample-app/node_modules/commander": {
"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"
}
},
+ "examples/sample-app/node_modules/envinfo": {
+ "version": "7.21.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "examples/sample-app/node_modules/import-local": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"examples/sample-app/node_modules/webpack-cli": {
"version": "7.2.3",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.3.tgz",
- "integrity": "sha512-vDFU7jrfCctnN7jJQWPl+V26B51GLp11prVZXg50oeonsgeBzSTJEWmXkjHsOjTgMjlPOQM8GWLh33X9RN/0ow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -756,8 +757,6 @@
},
"examples/sample-app/node_modules/webpack-merge": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
- "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -789,941 +788,767 @@
"blockly": "^13.2.0"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@asamuzakjp/css-color": {
- "version": "5.1.11",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz",
- "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==",
+ "node_modules/@babel/eslint-parser": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-8.0.7.tgz",
+ "integrity": "sha512-ik5I+U64QuQQPohw0A1wVWPR+vTRYVfWBDLOLc1KwZQ2SKayQLD52DgoB3W/kmwc4MP1E37qh7nZuDD9xsKYcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@asamuzakjp/generational-cache": "^1.0.1",
- "@csstools/css-calc": "^3.2.0",
- "@csstools/css-color-parser": "^4.1.0",
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
+ "eslint-scope": "^9.1.0",
+ "eslint-visitor-keys": "^5.0.0",
+ "verkit": "^0.5.0"
},
"engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ "node": "^22.18.0 || >=24.11.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^8.0.0",
+ "eslint": "^9.0.0 || ^10.0.0"
}
},
- "node_modules/@asamuzakjp/dom-selector": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz",
- "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@asamuzakjp/generational-cache": "^1.0.1",
- "@asamuzakjp/nwsapi": "^2.3.9",
- "bidi-js": "^1.0.3",
- "css-tree": "^3.2.1",
- "is-potential-custom-element-name": "^1.0.1"
- },
"engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/@asamuzakjp/generational-cache": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz",
- "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==",
+ "node_modules/@cacheable/memory": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz",
+ "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cacheable/utils": "^2.5.0",
+ "@keyv/bigmap": "^1.3.1",
+ "hookified": "^1.15.1",
+ "keyv": "^5.6.0"
+ }
+ },
+ "node_modules/@cacheable/utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz",
+ "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hashery": "^1.5.1",
+ "keyv": "^5.6.0"
+ }
+ },
+ "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==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ "node": ">=10.0.0"
}
},
- "node_modules/@asamuzakjp/nwsapi": {
- "version": "2.3.9",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
- "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
+ "node_modules/@emnapi/core": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz",
+ "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.0.4",
+ "tslib": "^2.4.0"
+ }
},
- "node_modules/@babel/code-frame": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "node_modules/@emnapi/runtime": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz",
+ "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.29.7",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@babel/eslint-parser": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-8.0.1.tgz",
- "integrity": "sha512-2javO8pAQv/ld6sS6OcxoLAlzZEZy+xm99bnoAfMhzKSumKhdF5wylpbZB7XTorWr3KLPtx5K95eduJPOy1mzA==",
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz",
+ "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eslint-scope": "^9.1.0",
- "eslint-visitor-keys": "^5.0.0",
- "semver": "^7.7.3"
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.91.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz",
+ "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.9",
+ "@typescript-eslint/types": "^8.65.0",
+ "comment-parser": "1.4.7",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~8.0.0"
},
"engines": {
- "node": "^22.18.0 || >=24.11.0"
- },
- "peerDependencies": {
- "@babel/core": "^8.0.0",
- "eslint": "^9.0.0 || ^10.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@babel/eslint-parser/node_modules/eslint-scope": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
- "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "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": {
- "@types/esrecurse": "^4.3.1",
- "@types/estree": "^1.0.8",
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@babel/eslint-parser/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@babel/eslint-parser/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
},
"engines": {
- "node": ">=10"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "node_modules/@eslint/config-array/node_modules/balanced-match": {
+ "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": ">=6.9.0"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/@blockly/block-dynamic-connection": {
- "resolved": "plugins/block-dynamic-connection",
- "link": true
- },
- "node_modules/@blockly/block-plus-minus": {
- "resolved": "plugins/block-plus-minus",
- "link": true
- },
- "node_modules/@blockly/block-shareable-procedures": {
- "resolved": "plugins/block-shareable-procedures",
- "link": true
- },
- "node_modules/@blockly/block-test": {
- "resolved": "plugins/block-test",
- "link": true
- },
- "node_modules/@blockly/continuous-toolbox": {
- "resolved": "plugins/continuous-toolbox",
- "link": true
- },
- "node_modules/@blockly/create-package": {
- "resolved": "plugins/dev-create",
- "link": true
- },
- "node_modules/@blockly/dev-scripts": {
- "resolved": "plugins/dev-scripts",
- "link": true
- },
- "node_modules/@blockly/dev-tools": {
- "resolved": "plugins/dev-tools",
- "link": true
- },
- "node_modules/@blockly/disable-top-blocks": {
- "resolved": "plugins/disable-top-blocks",
- "link": true
- },
- "node_modules/@blockly/field-angle": {
- "resolved": "plugins/field-angle",
- "link": true
- },
- "node_modules/@blockly/field-bitmap": {
- "resolved": "plugins/field-bitmap",
- "link": true
- },
- "node_modules/@blockly/field-colour": {
- "resolved": "plugins/field-colour",
- "link": true
- },
- "node_modules/@blockly/field-colour-hsv-sliders": {
- "resolved": "plugins/field-colour-hsv-sliders",
- "link": true
- },
- "node_modules/@blockly/field-date": {
- "resolved": "plugins/field-date",
- "link": true
- },
- "node_modules/@blockly/field-dependent-dropdown": {
- "resolved": "plugins/field-dependent-dropdown",
- "link": true
- },
- "node_modules/@blockly/field-grid-dropdown": {
- "resolved": "plugins/field-grid-dropdown",
- "link": true
- },
- "node_modules/@blockly/field-multilineinput": {
- "resolved": "plugins/field-multilineinput",
- "link": true
- },
- "node_modules/@blockly/field-slider": {
- "resolved": "plugins/field-slider",
- "link": true
- },
- "node_modules/@blockly/fixed-edges": {
- "resolved": "plugins/fixed-edges",
- "link": true
- },
- "node_modules/@blockly/migrate": {
- "resolved": "plugins/migration",
- "link": true
- },
- "node_modules/@blockly/plugin-cross-tab-copy-paste": {
- "resolved": "plugins/cross-tab-copy-paste",
- "link": true
- },
- "node_modules/@blockly/plugin-modal": {
- "resolved": "plugins/modal",
- "link": true
- },
- "node_modules/@blockly/plugin-scroll-options": {
- "resolved": "plugins/scroll-options",
- "link": true
- },
- "node_modules/@blockly/plugin-strict-connection-checker": {
- "resolved": "plugins/strict-connection-checker",
- "link": true
- },
- "node_modules/@blockly/plugin-typed-variable-modal": {
- "resolved": "plugins/typed-variable-modal",
- "link": true
- },
- "node_modules/@blockly/plugin-workspace-search": {
- "resolved": "plugins/workspace-search",
- "link": true
- },
- "node_modules/@blockly/shadow-block-converter": {
- "resolved": "plugins/shadow-block-converter",
- "link": true
- },
- "node_modules/@blockly/suggested-blocks": {
- "resolved": "plugins/suggested-blocks",
- "link": true
- },
- "node_modules/@blockly/theme-dark": {
- "resolved": "plugins/theme-dark",
- "link": true
- },
- "node_modules/@blockly/theme-deuteranopia": {
- "resolved": "plugins/theme-deuteranopia",
- "link": true
- },
- "node_modules/@blockly/theme-hackermode": {
- "resolved": "plugins/theme-hackermode",
- "link": true
- },
- "node_modules/@blockly/theme-highcontrast": {
- "resolved": "plugins/theme-highcontrast",
- "link": true
- },
- "node_modules/@blockly/theme-modern": {
- "resolved": "plugins/theme-modern",
- "link": true
- },
- "node_modules/@blockly/theme-tritanopia": {
- "resolved": "plugins/theme-tritanopia",
- "link": true
- },
- "node_modules/@blockly/toolbox-search": {
- "resolved": "plugins/toolbox-search",
- "link": true
- },
- "node_modules/@blockly/workspace-backpack": {
- "resolved": "plugins/workspace-backpack",
- "link": true
- },
- "node_modules/@blockly/workspace-content-highlight": {
- "resolved": "plugins/content-highlight",
- "link": true
- },
- "node_modules/@blockly/workspace-minimap": {
- "resolved": "plugins/workspace-minimap",
- "link": true
- },
- "node_modules/@blockly/zoom-to-fit": {
- "resolved": "plugins/zoom-to-fit",
- "link": true
- },
- "node_modules/@bramus/specificity": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz",
- "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==",
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
+ "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "css-tree": "^3.0.0"
+ "balanced-match": "^4.0.2"
},
- "bin": {
- "specificity": "bin/cli.js"
+ "engines": {
+ "node": "20 || >=22"
}
},
- "node_modules/@csstools/color-helpers": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz",
- "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==",
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT-0",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
"engines": {
- "node": ">=20.19.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz",
+ "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
"engines": {
- "node": ">=20.19.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
},
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@csstools/css-color-parser": {
- "version": "4.1.7",
- "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.7.tgz",
- "integrity": "sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ==",
+ "node_modules/@eslint/eslintrc": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.7.tgz",
+ "integrity": "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==",
"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.0.2",
- "@csstools/css-calc": "^3.2.1"
+ "ajv": "^6.14.0",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.3.2",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
},
"engines": {
- "node": ">=20.19.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "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==",
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "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",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
"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": ">=18"
},
- "peerDependencies": {
- "@csstools/css-tokenizer": "^4.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@csstools/css-syntax-patches-for-csstree": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz",
- "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==",
+ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
+ "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,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT-0",
+ "license": "MIT"
+ },
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
"peerDependencies": {
- "css-tree": "^3.2.1"
+ "eslint": "^10.0.0"
},
"peerDependenciesMeta": {
- "css-tree": {
+ "eslint": {
"optional": true
}
}
},
- "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==",
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=20.19.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "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==",
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz",
+ "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
"engines": {
- "node": ">=10.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@emnapi/core": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz",
- "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==",
+ "node_modules/@gar/promise-retry": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz",
+ "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@emnapi/wasi-threads": "1.0.4",
- "tslib": "^2.4.0"
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@emnapi/runtime": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz",
- "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==",
+ "node_modules/@gar/promisify": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.4.0"
- }
+ "license": "MIT"
},
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz",
- "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==",
+ "node_modules/@gulpjs/messages": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz",
+ "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "tslib": "^2.4.0"
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "node_modules/@es-joy/jsdoccomment": {
- "version": "0.87.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.87.0.tgz",
- "integrity": "sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==",
+ "node_modules/@gulpjs/to-absolute-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz",
+ "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "^1.0.9",
- "@typescript-eslint/types": "^8.59.4",
- "comment-parser": "1.4.7",
- "esquery": "^1.7.0",
- "jsdoc-type-pratt-parser": "~7.2.0"
+ "is-negated-glob": "^1.0.0"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@es-joy/resolve.exports": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
- "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
+ "node": ">=10.13.0"
}
},
- "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==",
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "@humanfs/types": "^0.15.0"
},
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
"engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ "node": ">=18.18.0"
}
},
- "node_modules/@eslint/config-array": {
- "version": "0.23.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
- "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/object-schema": "^3.0.5",
- "debug": "^4.3.1",
- "minimatch": "^10.2.4"
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">=18.18.0"
}
},
- "node_modules/@eslint/config-array/node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": "18 || 20 || >=22"
+ "node": ">=18.18.0"
}
},
- "node_modules/@eslint/config-array/node_modules/brace-expansion": {
- "version": "5.0.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
- "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": "20 || >=22"
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@eslint/config-array/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": "18 || 20 || >=22"
+ "node": ">=18.18"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@eslint/config-helpers": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
- "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
+ "node_modules/@hutson/parse-repository-url": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz",
+ "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==",
"dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^1.2.1"
- },
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">=6.9.0"
}
},
- "node_modules/@eslint/core": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "node_modules/@inquirer/ansi": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
+ "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
+ "license": "MIT",
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">=18"
}
},
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
- "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "node_modules/@inquirer/checkbox": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz",
+ "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ajv": "^6.14.0",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.1",
- "minimatch": "^3.1.5",
- "strip-json-comments": "^3.1.1"
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=18"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@eslint/eslintrc/node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "node_modules/@inquirer/confirm": {
+ "version": "5.1.21",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz",
+ "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=18"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@eslint/eslintrc/node_modules/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "node_modules/@inquirer/core": {
+ "version": "10.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz",
+ "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "acorn": "^8.15.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.3"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": ">=18"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "node_modules/@inquirer/core/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">=18"
+ "node": ">=14"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
- "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/@eslint/js": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
- "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "node_modules/@inquirer/editor": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz",
+ "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/external-editor": "^1.0.3",
+ "@inquirer/type": "^3.0.10"
},
- "funding": {
- "url": "https://eslint.org/donate"
+ "engines": {
+ "node": ">=18"
},
"peerDependencies": {
- "eslint": "^10.0.0"
+ "@types/node": ">=18"
},
"peerDependenciesMeta": {
- "eslint": {
+ "@types/node": {
"optional": true
}
}
},
- "node_modules/@eslint/object-schema": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
- "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
- "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
+ "node_modules/@inquirer/expand": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz",
+ "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@eslint/core": "^1.2.1",
- "levn": "^0.4.1"
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@exodus/bytes": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz",
- "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==",
+ "node_modules/@inquirer/external-editor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
+ "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "chardet": "^2.1.1",
+ "iconv-lite": "^0.7.0"
+ },
"engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ "node": ">=18"
},
"peerDependencies": {
- "@noble/hashes": "^1.8.0 || ^2.0.0"
+ "@types/node": ">=18"
},
"peerDependenciesMeta": {
- "@noble/hashes": {
+ "@types/node": {
"optional": true
}
}
},
- "node_modules/@gar/promise-retry": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz",
- "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==",
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
+ "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=18"
}
},
- "node_modules/@gar/promisify": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
- "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@gulpjs/messages": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz",
- "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==",
+ "node_modules/@inquirer/input": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz",
+ "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
+ },
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@gulpjs/to-absolute-glob": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz",
- "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==",
+ "node_modules/@inquirer/number": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz",
+ "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "is-negated-glob": "^1.0.0"
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@humanfs/core": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
- "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "node_modules/@inquirer/password": {
+ "version": "4.0.23",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz",
+ "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@humanfs/types": "^0.15.0"
+ "@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
+ "@inquirer/type": "^3.0.10"
},
"engines": {
- "node": ">=18.18.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@humanfs/node": {
- "version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
- "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "node_modules/@inquirer/prompts": {
+ "version": "7.10.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz",
+ "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "@humanfs/core": "^0.19.2",
- "@humanfs/types": "^0.15.0",
- "@humanwhocodes/retry": "^0.4.0"
+ "@inquirer/checkbox": "^4.3.2",
+ "@inquirer/confirm": "^5.1.21",
+ "@inquirer/editor": "^4.2.23",
+ "@inquirer/expand": "^4.0.23",
+ "@inquirer/input": "^4.3.1",
+ "@inquirer/number": "^3.0.23",
+ "@inquirer/password": "^4.0.23",
+ "@inquirer/rawlist": "^4.1.11",
+ "@inquirer/search": "^3.2.2",
+ "@inquirer/select": "^4.4.2"
},
"engines": {
- "node": ">=18.18.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@humanfs/types": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
- "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@hutson/parse-repository-url": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz",
- "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@inquirer/ansi": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
- "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/checkbox": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz",
- "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==",
+ "node_modules/@inquirer/rawlist": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz",
+ "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/ansi": "^1.0.2",
"@inquirer/core": "^10.3.2",
- "@inquirer/figures": "^1.0.15",
"@inquirer/type": "^3.0.10",
"yoctocolors-cjs": "^2.1.3"
},
@@ -1739,15 +1564,17 @@
}
}
},
- "node_modules/@inquirer/confirm": {
- "version": "5.1.21",
- "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz",
- "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==",
+ "node_modules/@inquirer/search": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz",
+ "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10"
+ "@inquirer/figures": "^1.0.15",
+ "@inquirer/type": "^3.0.10",
+ "yoctocolors-cjs": "^2.1.3"
},
"engines": {
"node": ">=18"
@@ -1761,20 +1588,17 @@
}
}
},
- "node_modules/@inquirer/core": {
- "version": "10.3.2",
- "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz",
- "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==",
+ "node_modules/@inquirer/select": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz",
+ "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@inquirer/ansi": "^1.0.2",
+ "@inquirer/core": "^10.3.2",
"@inquirer/figures": "^1.0.15",
"@inquirer/type": "^3.0.10",
- "cli-width": "^4.1.0",
- "mute-stream": "^2.0.0",
- "signal-exit": "^4.1.0",
- "wrap-ansi": "^6.2.0",
"yoctocolors-cjs": "^2.1.3"
},
"engines": {
@@ -1789,549 +1613,429 @@
}
}
},
- "node_modules/@inquirer/core/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/@inquirer/type": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
+ "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">=18"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/@inquirer/core/node_modules/cli-width": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
- "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "node_modules/@isaacs/cliui": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
+ "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 12"
+ "node": ">=18"
}
},
- "node_modules/@inquirer/core/node_modules/mute-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
- "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
"dev": true,
"license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@inquirer/core/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
+ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
+ "license": "ISC"
},
- "node_modules/@inquirer/core/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "node_modules/@jest/diff-sequences": {
+ "version": "30.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.5.0.tgz",
+ "integrity": "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
"engines": {
- "node": ">=8"
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/@inquirer/editor": {
- "version": "4.2.23",
- "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz",
- "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==",
+ "node_modules/@jest/get-type": {
+ "version": "30.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.5.0.tgz",
+ "integrity": "sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/external-editor": "^1.0.3",
- "@inquirer/type": "^3.0.10"
- },
"engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/@inquirer/expand": {
- "version": "4.0.23",
- "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz",
- "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==",
+ "node_modules/@jest/react-is-18": {
+ "name": "react-is",
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10",
- "yoctocolors-cjs": "^2.1.3"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
- }
+ "license": "MIT"
},
- "node_modules/@inquirer/external-editor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
- "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
+ "node_modules/@jest/react-is-19": {
+ "name": "react-is",
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.0.tgz",
+ "integrity": "sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jest/schemas": {
+ "version": "30.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.5.0.tgz",
+ "integrity": "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "chardet": "^2.1.1",
- "iconv-lite": "^0.7.0"
+ "@sinclair/typebox": "^0.34.0"
},
"engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/@inquirer/external-editor/node_modules/iconv-lite": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
- "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@inquirer/figures": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
- "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">=6.0.0"
}
},
- "node_modules/@inquirer/input": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz",
- "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==",
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
}
},
- "node_modules/@inquirer/number": {
- "version": "3.0.23",
- "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz",
- "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==",
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10"
- },
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsonjoy.com/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/password": {
- "version": "4.0.23",
- "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz",
- "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==",
+ "node_modules/@jsonjoy.com/buffers": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz",
+ "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/ansi": "^1.0.2",
- "@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/prompts": {
- "version": "7.10.1",
- "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz",
- "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==",
+ "node_modules/@jsonjoy.com/codegen": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz",
+ "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/checkbox": "^4.3.2",
- "@inquirer/confirm": "^5.1.21",
- "@inquirer/editor": "^4.2.23",
- "@inquirer/expand": "^4.0.23",
- "@inquirer/input": "^4.3.1",
- "@inquirer/number": "^3.0.23",
- "@inquirer/password": "^4.0.23",
- "@inquirer/rawlist": "^4.1.11",
- "@inquirer/search": "^3.2.2",
- "@inquirer/select": "^4.4.2"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/rawlist": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz",
- "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==",
+ "node_modules/@jsonjoy.com/fs-core": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.80.0.tgz",
+ "integrity": "sha512-qMKWshnyjbyhm+NbzqGE3w5y1mckFFEMj0aDPU2/JBNh1BzIjVy9esq9lBmRnNVmhMEkxwDzLZ8Gqh5G1P5Dag==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/type": "^3.0.10",
- "yoctocolors-cjs": "^2.1.3"
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "thingies": "^2.5.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/search": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz",
- "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==",
+ "node_modules/@jsonjoy.com/fs-fsa": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.80.0.tgz",
+ "integrity": "sha512-ZBEKl7J6dbkRCfmrFV48Re211A/FHqniTUhsWCsaRteNSOqMgkX3qF1UreVgwB9oSPm81JLAwhIi6Lb/NH/PoA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@inquirer/core": "^10.3.2",
- "@inquirer/figures": "^1.0.15",
- "@inquirer/type": "^3.0.10",
- "yoctocolors-cjs": "^2.1.3"
+ "@jsonjoy.com/fs-core": "4.80.0",
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "thingies": "^2.5.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/select": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz",
- "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==",
+ "node_modules/@jsonjoy.com/fs-node": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.80.0.tgz",
+ "integrity": "sha512-yiBlUfkMMRFFGy8CD/h2zd5rPnrM6bjlF+nx2LRAxNV6hOSiuObQIUEE7m7y2VTMisjxCRtzINH94bFGySWL7g==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@inquirer/ansi": "^1.0.2",
- "@inquirer/core": "^10.3.2",
- "@inquirer/figures": "^1.0.15",
- "@inquirer/type": "^3.0.10",
- "yoctocolors-cjs": "^2.1.3"
+ "@jsonjoy.com/fs-core": "4.80.0",
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "@jsonjoy.com/fs-print": "4.80.0",
+ "@jsonjoy.com/fs-snapshot": "4.80.0",
+ "glob-to-regex.js": "^1.3.1",
+ "thingies": "^2.5.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@inquirer/type": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
- "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==",
+ "node_modules/@jsonjoy.com/fs-node-builtins": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.80.0.tgz",
+ "integrity": "sha512-OIOIhqaWiwUySFMny4epIAoviXsyMaQQ63PTc3zH+5HEOvarl5hpUmZIhp2m5+OfyKAh5ylxXnQIgew1OgJDVw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18"
+ "node": ">=10.0"
},
- "peerDependencies": {
- "@types/node": ">=18"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "license": "ISC",
+ "node_modules/@jsonjoy.com/fs-node-to-fsa": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.80.0.tgz",
+ "integrity": "sha512-ljeaR5xwtX1EyRmB0wvXANUMQZ3mjKcm7z8s2N8D8SLQ04CcAGtUhHFRZQXFb9mhgFyEVMydQGQtSOFS7pcrFQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ "@jsonjoy.com/fs-fsa": "4.80.0",
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0"
},
"engines": {
- "node": ">=12"
- }
- },
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "license": "MIT",
- "engines": {
- "node": ">=12"
+ "node": ">=10.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "license": "MIT"
- },
- "node_modules/@isaacs/cliui/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "license": "MIT",
+ "node_modules/@jsonjoy.com/fs-node-utils": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.80.0.tgz",
+ "integrity": "sha512-xwHeVVi3f+Khg/Fmb8i5qoYVmQ08QznE5TWhQokUmIZjz4KBPzU+zt/+bahBI6G1ghtqajt27lWuAciIxApuzA==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "glob-to-regex.js": "^1.3.1"
},
"engines": {
- "node": ">=12"
+ "node": ">=10.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "license": "MIT",
+ "node_modules/@jsonjoy.com/fs-print": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.80.0.tgz",
+ "integrity": "sha512-1ocZLJw/m/xlq0moaIHO7HV9nHRVBUvdc2zMzhsJGkFOrqfwWvexfCv5cYCPPLRhP+9p3yunoi4Ep5YhRORC9Q==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "tree-dump": "^1.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=10.0"
},
"funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "license": "MIT",
+ "node_modules/@jsonjoy.com/fs-snapshot": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.80.0.tgz",
+ "integrity": "sha512-3AV23Q1H228KTtJKTUE0nNq8FCtxSvtENOLrEat80wkAJCKHuqQEv8yjhpS8Bei2OEFJAnluGXp9Ri2SWBlROw==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
+ "@jsonjoy.com/buffers": "^17.65.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "@jsonjoy.com/json-pack": "^17.65.0",
+ "@jsonjoy.com/util": "^17.65.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=10.0"
},
"funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
- "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.4"
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@isaacs/fs-minipass/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@isaacs/string-locale-compare": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
- "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/@jest/diff-sequences": {
- "version": "30.4.0",
- "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.4.0.tgz",
- "integrity": "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==",
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz",
+ "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@jest/get-type": {
- "version": "30.1.0",
- "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
- "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz",
+ "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/@jest/schemas": {
- "version": "30.4.1",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.4.1.tgz",
- "integrity": "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==",
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz",
+ "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "@sinclair/typebox": "^0.34.0"
+ "@jsonjoy.com/base64": "17.67.0",
+ "@jsonjoy.com/buffers": "17.67.0",
+ "@jsonjoy.com/codegen": "17.67.0",
+ "@jsonjoy.com/json-pointer": "17.67.0",
+ "@jsonjoy.com/util": "17.67.0",
+ "hyperdyperid": "^1.2.0",
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.1.0"
},
- "engines": {
- "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz",
- "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.12",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
- "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.29",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
- "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@jsonjoy.com/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
- "license": "Apache-2.0",
"engines": {
"node": ">=10.0"
},
@@ -2343,11 +2047,15 @@
"tslib": "2"
}
},
- "node_modules/@jsonjoy.com/buffers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz",
- "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==",
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz",
+ "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==",
+ "dev": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/util": "17.67.0"
+ },
"engines": {
"node": ">=10.0"
},
@@ -2359,11 +2067,16 @@
"tslib": "2"
}
},
- "node_modules/@jsonjoy.com/codegen": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz",
- "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==",
+ "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": {
+ "version": "17.67.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz",
+ "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==",
+ "dev": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/buffers": "17.67.0",
+ "@jsonjoy.com/codegen": "17.67.0"
+ },
"engines": {
"node": ">=10.0"
},
@@ -2376,19 +2089,38 @@
}
},
"node_modules/@jsonjoy.com/json-pack": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.10.0.tgz",
- "integrity": "sha512-PMOU9Sh0baiLZEDewwR/YAHJBV2D8pPIzcFQSU7HQl/k/HNCDyVfO1OvkyDwBGp4dPtvZc7Hl9FFYWwTP1CbZw==",
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz",
+ "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jsonjoy.com/base64": "^1.1.2",
- "@jsonjoy.com/buffers": "^1.0.0",
+ "@jsonjoy.com/buffers": "^1.2.0",
"@jsonjoy.com/codegen": "^1.0.0",
- "@jsonjoy.com/json-pointer": "^1.0.1",
+ "@jsonjoy.com/json-pointer": "^1.0.2",
"@jsonjoy.com/util": "^1.9.0",
"hyperdyperid": "^1.2.0",
- "thingies": "^2.5.0"
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz",
+ "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": ">=10.0"
},
@@ -2401,12 +2133,14 @@
}
},
"node_modules/@jsonjoy.com/json-pointer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.1.tgz",
- "integrity": "sha512-tJpwQfuBuxqZlyoJOSZcqf7OUmiYQ6MiPNmOv4KbZdXE/DdvBSSAwhos0zIlJU/AXxC8XpuO8p08bh2fIl+RKA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz",
+ "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@jsonjoy.com/util": "^1.3.0"
+ "@jsonjoy.com/codegen": "^1.0.0",
+ "@jsonjoy.com/util": "^1.9.0"
},
"engines": {
"node": ">=10.0"
@@ -2423,6 +2157,7 @@
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz",
"integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jsonjoy.com/buffers": "^1.0.0",
@@ -2439,18 +2174,69 @@
"tslib": "2"
}
},
+ "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz",
+ "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@keyv/bigmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz",
+ "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hashery": "^1.4.0",
+ "hookified": "^1.15.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "keyv": "^5.6.0"
+ }
+ },
+ "node_modules/@keyv/serialize": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
+ "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
"integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@lit-labs/ssr-dom-shim": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.0.tgz",
- "integrity": "sha512-HLomZXMmrCFHSRKESF5vklAKsDY7/fsT/ZhqCu3V0UoW/Qbv8wxmO4W9bx4KnCCF2Zak4yuk+AGraK/bPmI4kA==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.6.0.tgz",
+ "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==",
"license": "BSD-3-Clause"
},
+ "node_modules/@lit/context": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz",
+ "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^1.6.2 || ^2.1.0"
+ }
+ },
"node_modules/@lit/reactive-element": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz",
@@ -2461,14 +2247,15 @@
}
},
"node_modules/@material/web": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@material/web/-/web-2.4.1.tgz",
- "integrity": "sha512-0sk9t25acJ72Qv3r0n9r0lgDbPaAKnpm0p+QmEAAwYyZomHxuVbgrrAdtNXaRm7jFyGh+WsTr8bhtvCnpPRFjw==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@material/web/-/web-2.5.0.tgz",
+ "integrity": "sha512-x2Uovyq8E/Zc1xHXd9s1eBMXF5pMHVAt70pISKd0fL3Ajj4L6zQaQUY/awcfR2RDAMKXC7i4+vr0arv1YaOR/g==",
"license": "Apache-2.0",
"workspaces": [
"catalog"
],
"dependencies": {
+ "@lit/context": "^1.1.6",
"lit": "^2.8.0 || ^3.0.0",
"tslib": "^2.4.0"
}
@@ -2486,12 +2273,13 @@
}
},
"node_modules/@noble/hashes": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
- "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 16"
+ "node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
@@ -2536,9 +2324,9 @@
}
},
"node_modules/@npmcli/agent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz",
- "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz",
+ "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -2552,55 +2340,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/agent/node_modules/agent-base": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
- "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@npmcli/agent/node_modules/https-proxy-agent": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
- "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/@npmcli/agent/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
- "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "agent-base": "^7.1.2",
- "debug": "^4.3.4",
- "socks": "^2.8.3"
- },
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/@npmcli/arborist": {
"version": "9.1.6",
"resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.1.6.tgz",
@@ -2672,60 +2411,14 @@
"node": "20 || >=22"
}
},
- "node_modules/@npmcli/arborist/node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "node_modules/@npmcli/arborist/node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
"dev": true,
"license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/fs-minipass": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
- "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
- "dev": true,
- "license": "ISC",
"dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^11.1.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
+ "brace-expansion": "^5.0.8"
},
"engines": {
"node": "18 || 20 || >=22"
@@ -2734,29 +2427,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@npmcli/arborist/node_modules/minipass": {
- "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"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
"node_modules/@npmcli/arborist/node_modules/npm-bundled": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz",
@@ -2780,61 +2450,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/arborist/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/npm-package-arg/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/npm-pick-manifest": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz",
- "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-install-checks": "^8.0.0",
- "npm-normalize-package-bin": "^5.0.0",
- "npm-package-arg": "^13.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/npm-pick-manifest/node_modules/npm-install-checks": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz",
- "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/@npmcli/arborist/node_modules/pacote": {
"version": "21.5.1",
"resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz",
@@ -2907,43 +2522,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/arborist/node_modules/tar": {
- "version": "7.5.16",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz",
- "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/validate-npm-package-name": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz",
- "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/arborist/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@npmcli/fs": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz",
@@ -2977,19 +2555,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/git/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^11.1.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/@npmcli/git/node_modules/ini": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz",
@@ -3010,71 +2575,6 @@
"node": ">=20"
}
},
- "node_modules/@npmcli/git/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@npmcli/git/node_modules/npm-install-checks": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz",
- "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/git/node_modules/npm-normalize-package-bin": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz",
- "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/git/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/git/node_modules/npm-pick-manifest": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz",
- "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-install-checks": "^8.0.0",
- "npm-normalize-package-bin": "^5.0.0",
- "npm-package-arg": "^13.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/@npmcli/git/node_modules/proc-log": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
@@ -3085,16 +2585,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/git/node_modules/validate-npm-package-name": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz",
- "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/@npmcli/git/node_modules/which": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
@@ -3177,34 +2667,6 @@
"node": "20 || >=22"
}
},
- "node_modules/@npmcli/map-workspaces/node_modules/glob": {
- "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",
- "minipass": "^7.1.3",
- "path-scurry": "^2.0.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@npmcli/map-workspaces/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
"node_modules/@npmcli/map-workspaces/node_modules/minimatch": {
"version": "10.2.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
@@ -3221,33 +2683,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@npmcli/map-workspaces/node_modules/minipass": {
- "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"
- }
- },
- "node_modules/@npmcli/map-workspaces/node_modules/path-scurry": {
- "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",
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@npmcli/metavuln-calculator": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.3.tgz",
@@ -3265,266 +2700,21 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/metavuln-calculator/node_modules/@npmcli/installed-package-contents": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz",
- "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-bundled": "^5.0.0",
- "npm-normalize-package-bin": "^5.0.0"
- },
- "bin": {
- "installed-package-contents": "bin/index.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/fs-minipass": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
- "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^11.1.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/json-parse-even-better-errors": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz",
- "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/minipass": {
- "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"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/npm-bundled": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz",
- "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-normalize-package-bin": "^5.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/npm-install-checks": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz",
- "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "semver": "^7.1.1"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/npm-normalize-package-bin": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz",
- "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/npm-pick-manifest": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz",
- "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-install-checks": "^8.0.0",
- "npm-normalize-package-bin": "^5.0.0",
- "npm-package-arg": "^13.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/pacote": {
- "version": "21.5.1",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz",
- "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@gar/promise-retry": "^1.0.0",
- "@npmcli/git": "^7.0.0",
- "@npmcli/installed-package-contents": "^4.0.0",
- "@npmcli/package-json": "^7.0.0",
- "@npmcli/promise-spawn": "^9.0.0",
- "@npmcli/run-script": "^10.0.0",
- "cacache": "^20.0.0",
- "fs-minipass": "^3.0.0",
- "minipass": "^7.0.2",
- "npm-package-arg": "^13.0.0",
- "npm-packlist": "^10.0.1",
- "npm-pick-manifest": "^11.0.1",
- "npm-registry-fetch": "^19.0.0",
- "proc-log": "^6.0.0",
- "sigstore": "^4.0.0",
- "ssri": "^13.0.0",
- "tar": "^7.4.3"
- },
- "bin": {
- "pacote": "bin/index.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/ssri": {
- "version": "13.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz",
- "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/tar": {
- "version": "7.5.16",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz",
- "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@npmcli/metavuln-calculator/node_modules/validate-npm-package-name": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz",
- "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==",
+ "node_modules/@npmcli/metavuln-calculator/node_modules/proc-log": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
+ "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
"dev": true,
"license": "ISC",
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/metavuln-calculator/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@npmcli/move-file": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
- "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+ "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+ "deprecated": "This functionality has been moved to @npmcli/fs",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3532,26 +2722,36 @@
"rimraf": "^3.0.2"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "node": ">=10"
}
},
- "node_modules/@npmcli/move-file/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "node_modules/@npmcli/move-file/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@npmcli/move-file/node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -3603,16 +2803,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@npmcli/package-json/node_modules/@isaacs/cliui": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz",
- "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@npmcli/package-json/node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
@@ -3640,6 +2830,7 @@
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
"integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
+ "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": "BlueOak-1.0.0",
"dependencies": {
@@ -3660,55 +2851,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@npmcli/package-json/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^11.1.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/jackspeak": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
- "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^9.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz",
- "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
"node_modules/@npmcli/package-json/node_modules/minimatch": {
"version": "10.2.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
@@ -3725,33 +2867,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@npmcli/package-json/node_modules/minipass": {
- "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"
- }
- },
- "node_modules/@npmcli/package-json/node_modules/path-scurry": {
- "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",
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@npmcli/package-json/node_modules/proc-log": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
@@ -3889,9 +3004,9 @@
}
},
"node_modules/@nx/devkit": {
- "version": "22.7.5",
- "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.7.5.tgz",
- "integrity": "sha512-/63ziS7kdHXYTLLhwWBu9hFwoFFT8xf+PkcQjsNdPqc5JmkYkSew0cE/vp5ORgBpGLWWnFPJgmfqjbJoO2C7jA==",
+ "version": "22.7.12",
+ "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.7.12.tgz",
+ "integrity": "sha512-/etFiGyWL1Ad9ZuMUBCqgsEXe5hTxxenb8LLVar4VdQBGWYvwLw/T2ZmeZnNvc0Vi8cjhNC/HF7lR1bTsXDRNw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3930,19 +3045,6 @@
"node": "20 || >=22"
}
},
- "node_modules/@nx/devkit/node_modules/ejs": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.1.tgz",
- "integrity": "sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "ejs": "bin/cli.js"
- },
- "engines": {
- "node": ">=0.12.18"
- }
- },
"node_modules/@nx/devkit/node_modules/minimatch": {
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
@@ -3959,16 +3061,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@nx/devkit/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/@nx/nx-darwin-arm64": {
"version": "22.7.12",
"resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.7.12.tgz",
@@ -4284,135 +3376,176 @@
}
},
"node_modules/@peculiar/asn1-cms": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz",
- "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.11.0.tgz",
+ "integrity": "sha512-SlAiDoT/Cd8qaNmbTt78gqyaEvu2fQd6ML6KWJkdjXGrgDKnHHrusVkfQUelkfinL2p665IIADb0JBixtT8W1g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
- "@peculiar/asn1-x509-attr": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
+ "@peculiar/asn1-x509-attr": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-csr": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz",
- "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.11.0.tgz",
+ "integrity": "sha512-M/ED0yJ05qMK+UADPKnIa8vhAeewOJALSxTAZB7RQ/batRHhIJZkwznCcWAbFO5saHJ1yEQ+m4lncEcG9RnQSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-ecc": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz",
- "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.11.0.tgz",
+ "integrity": "sha512-jj1alGEKev7/un+cI+exyVK9m31lmP7cCBMCZuCb0wkFQH2zmKmJzNiG4wqXFNzlcP8timHLnzf3lV3OxBpb/Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-pfx": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz",
- "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.11.0.tgz",
+ "integrity": "sha512-ykSAWRu8KkmzU8LRpk9ZQC3zuLmBEtoSMjIv9XHVamD5W7amqreV5wttKqnvtjWOzzSJQxA/HVT8/tHwpEEGSQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-cms": "^2.8.0",
- "@peculiar/asn1-pkcs8": "^2.8.0",
- "@peculiar/asn1-rsa": "^2.8.0",
- "@peculiar/asn1-schema": "^2.8.0",
+ "@peculiar/asn1-cms": "^2.11.0",
+ "@peculiar/asn1-pkcs8": "^2.11.0",
+ "@peculiar/asn1-rsa": "^2.11.0",
+ "@peculiar/asn1-schema": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-pkcs8": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz",
- "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.11.0.tgz",
+ "integrity": "sha512-lragjkjQGnQ5luxC+sxoAfAO/jBiQ7hOEGlDKJUk7MC5zY3AzjB2DU0GyPUH1Sswdv10t7DurY0zylOYMLb88w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-pkcs9": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz",
- "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.11.0.tgz",
+ "integrity": "sha512-gDdFjpqV0weJjgNUvueUVf4D8uVbpq+VbG0TsxLAY2QGljAkJyL9qwQ7avol9j0jaYSJ7Ey7v7RZp0M3GTcQSA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-cms": "^2.8.0",
- "@peculiar/asn1-pfx": "^2.8.0",
- "@peculiar/asn1-pkcs8": "^2.8.0",
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
- "@peculiar/asn1-x509-attr": "^2.8.0",
+ "@peculiar/asn1-cms": "^2.11.0",
+ "@peculiar/asn1-pfx": "^2.11.0",
+ "@peculiar/asn1-pkcs8": "^2.11.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
+ "@peculiar/asn1-x509-attr": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-rsa": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz",
- "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.11.0.tgz",
+ "integrity": "sha512-S2sBJmbfI09Kzdt9cEhE6pDNjHpVTkURs+811+PxS8AvsTLxC4woMNRhxHYaIbClkkNfAVt0tZxJdINVfUmzuA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-schema": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz",
- "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.11.0.tgz",
+ "integrity": "sha512-8xh4avo53/vXO6UEv9yaoJ83hY581geaLTygf61NPIXP5AeIZCPjJhpTaYU23IZkG+NpLN/C9FYzWp7hphIT9A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@peculiar/utils": "^2.0.2",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-x509": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz",
- "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.11.0.tgz",
+ "integrity": "sha512-J1sHAwGNlk+8J+FeR1eLVc6Gq0T9f9ITc3HWyPYgJraoW6U8AJuQiWVJ3SCEpltfTdpOY7fHdHT5oKAsbK/jww==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
"@peculiar/utils": "^2.0.2",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/asn1-x509-attr": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz",
- "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.11.0.tgz",
+ "integrity": "sha512-Fgvnd9REmLxEj/4cbDP54dNUNUXkzUksXLqEHqs1mHBuSRjSTCUSPM/WQIZYSvrdG7ND9CX1AQtPoIBekhgQSA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.8.0",
- "@peculiar/asn1-x509": "^2.8.0",
+ "@peculiar/asn1-schema": "^2.11.0",
+ "@peculiar/asn1-x509": "^2.11.0",
"asn1js": "^3.0.10",
"tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14"
}
},
"node_modules/@peculiar/utils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
"integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.8.1"
@@ -4422,6 +3555,7 @@
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz",
"integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@peculiar/asn1-cms": "^2.6.0",
@@ -4444,6 +3578,7 @@
"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": {
@@ -4474,9 +3609,9 @@
}
},
"node_modules/@sigstore/protobuf-specs": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz",
- "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.2.tgz",
+ "integrity": "sha512-SQqvFMt4V78fdjcDdYX6HbiVSOR4QK3ZgwCa2KOsopAgPIHy1rU5UDUmzLl02r5oyyaYcYHR1hpwDRk/yUe+Mw==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -4511,24 +3646,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@sigstore/sign/node_modules/iconv-lite": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
- "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/@sigstore/sign/node_modules/make-fetch-happen": {
"version": "15.0.6",
"resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz",
@@ -4553,16 +3670,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@sigstore/sign/node_modules/minipass": {
- "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"
- }
- },
"node_modules/@sigstore/sign/node_modules/minipass-fetch": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz",
@@ -4594,29 +3701,6 @@
"node": ">=8"
}
},
- "node_modules/@sigstore/sign/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/@sigstore/sign/node_modules/negotiator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/@sigstore/sign/node_modules/proc-log": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
@@ -4670,9 +3754,9 @@
}
},
"node_modules/@sinclair/typebox": {
- "version": "0.34.49",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz",
- "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==",
+ "version": "0.34.52",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz",
+ "integrity": "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==",
"dev": true,
"license": "MIT"
},
@@ -4689,121 +3773,53 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
"node_modules/@sinonjs/commons": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
- "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"type-detect": "4.0.8"
}
},
- "node_modules/@sinonjs/commons/node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@sinonjs/fake-timers": {
"version": "15.4.0",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.4.0.tgz",
"integrity": "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.1"
}
},
- "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/fake-timers/node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@sinonjs/samsam": {
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-10.0.2.tgz",
"integrity": "sha512-8lVwD1Df1BmzoaOLhMcGGcz/Jyr5QY2KSB75/YK1QgKzoabTeLdIVyhXNZK9ojfSKSdirbXqdbsXXqP9/Ve8+A==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.1",
"type-detect": "^4.1.0"
}
},
- "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
- "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons/node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "node_modules/@sinonjs/samsam/node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
- "node_modules/@sinonjs/text-encoding": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz",
- "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==",
- "deprecated": "Deprecated: no longer maintained and no longer used by Sinon packages. See\n https://github.com/sinonjs/nise/issues/243 for replacement details.",
- "dev": true,
- "license": "(Unlicense OR Apache-2.0)"
- },
"node_modules/@socket.io/component-emitter": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
"license": "MIT"
},
- "node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/@tootallnate/once": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
@@ -4891,6 +3907,7 @@
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
"integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/connect": "*",
@@ -4901,28 +3918,17 @@
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
"integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
- "node_modules/@types/cacheable-request": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "^3.1.4",
- "@types/node": "*",
- "@types/responselike": "^1.0.0"
- }
- },
"node_modules/@types/connect": {
"version": "3.4.38",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
"integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -4932,6 +3938,7 @@
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
"integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/express-serve-static-core": "*",
@@ -4947,13 +3954,6 @@
"@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/esrecurse": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
@@ -4965,6 +3965,7 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
"integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/expect": {
@@ -4978,6 +3979,7 @@
"version": "4.17.25",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
"integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/body-parser": "*",
@@ -4987,9 +3989,10 @@
}
},
"node_modules/@types/express-serve-static-core": {
- "version": "4.19.6",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
- "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "version": "4.19.9",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz",
+ "integrity": "sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
@@ -5005,23 +4008,18 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/http-errors": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
"integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/http-proxy": {
- "version": "1.17.16",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
- "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "version": "1.17.17",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz",
+ "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -5031,22 +4029,14 @@
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "license": "MIT"
- },
- "node_modules/@types/keyv": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
+ "license": "MIT"
},
"node_modules/@types/mime": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/minimatch": {
@@ -5057,26 +4047,19 @@
"license": "MIT"
},
"node_modules/@types/minimist": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz",
- "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/mocha": {
- "version": "10.0.10",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz",
- "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==",
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.1.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz",
- "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==",
+ "version": "26.6.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz",
+ "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==",
"license": "MIT",
"dependencies": {
- "undici-types": "~6.13.0"
+ "undici-types": "~8.9.0"
}
},
"node_modules/@types/normalize-package-data": {
@@ -5086,48 +4069,34 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "version": "6.15.1",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz",
+ "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/range-parser": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
"integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
- "license": "MIT"
- },
- "node_modules/@types/responselike": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
+ "license": "MIT"
},
"node_modules/@types/retry": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
"integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/send": {
- "version": "0.17.5",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz",
- "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@types/mime": "^1",
"@types/node": "*"
}
},
@@ -5135,26 +4104,40 @@
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
"integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/serve-static": {
- "version": "1.15.8",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz",
- "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==",
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/http-errors": "*",
"@types/node": "*",
- "@types/send": "*"
+ "@types/send": "<1"
+ }
+ },
+ "node_modules/@types/serve-static/node_modules/@types/send": {
+ "version": "0.17.6",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
}
},
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
"integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -5178,26 +4161,26 @@
}
},
"node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "version": "8.18.2",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz",
+ "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz",
- "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.2.tgz",
+ "integrity": "sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.61.1",
- "@typescript-eslint/type-utils": "8.61.1",
- "@typescript-eslint/utils": "8.61.1",
- "@typescript-eslint/visitor-keys": "8.61.1",
+ "@typescript-eslint/scope-manager": "8.71.2",
+ "@typescript-eslint/type-utils": "8.71.2",
+ "@typescript-eslint/utils": "8.71.2",
+ "@typescript-eslint/visitor-keys": "8.71.2",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -5210,15 +4193,15 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.61.1",
+ "@typescript-eslint/parser": "^8.71.2",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.12.tgz",
+ "integrity": "sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5226,16 +4209,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz",
- "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.71.2.tgz",
+ "integrity": "sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.61.1",
- "@typescript-eslint/types": "8.61.1",
- "@typescript-eslint/typescript-estree": "8.61.1",
- "@typescript-eslint/visitor-keys": "8.61.1",
+ "@typescript-eslint/scope-manager": "8.71.2",
+ "@typescript-eslint/types": "8.71.2",
+ "@typescript-eslint/typescript-estree": "8.71.2",
+ "@typescript-eslint/visitor-keys": "8.71.2",
"debug": "^4.4.3"
},
"engines": {
@@ -5251,14 +4234,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
- "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.71.2.tgz",
+ "integrity": "sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.61.1",
- "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/tsconfig-utils": "^8.71.2",
+ "@typescript-eslint/types": "^8.71.2",
"debug": "^4.4.3"
},
"engines": {
@@ -5273,14 +4256,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
- "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.71.2.tgz",
+ "integrity": "sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.61.1",
- "@typescript-eslint/visitor-keys": "8.61.1"
+ "@typescript-eslint/types": "8.71.2",
+ "@typescript-eslint/visitor-keys": "8.71.2"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5291,9 +4274,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
- "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.2.tgz",
+ "integrity": "sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5308,15 +4291,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz",
- "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.71.2.tgz",
+ "integrity": "sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.61.1",
- "@typescript-eslint/typescript-estree": "8.61.1",
- "@typescript-eslint/utils": "8.61.1",
+ "@typescript-eslint/types": "8.71.2",
+ "@typescript-eslint/typescript-estree": "8.71.2",
+ "@typescript-eslint/utils": "8.71.2",
"debug": "^4.4.3",
"ts-api-utils": "^2.5.0"
},
@@ -5333,9 +4316,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
- "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.71.2.tgz",
+ "integrity": "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5347,16 +4330,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
- "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.2.tgz",
+ "integrity": "sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.61.1",
- "@typescript-eslint/tsconfig-utils": "8.61.1",
- "@typescript-eslint/types": "8.61.1",
- "@typescript-eslint/visitor-keys": "8.61.1",
+ "@typescript-eslint/project-service": "8.71.2",
+ "@typescript-eslint/tsconfig-utils": "8.71.2",
+ "@typescript-eslint/types": "8.71.2",
+ "@typescript-eslint/visitor-keys": "8.71.2",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -5413,60 +4396,17 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/picomatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
- "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
"node_modules/@typescript-eslint/utils": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
- "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.71.2.tgz",
+ "integrity": "sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.61.1",
- "@typescript-eslint/types": "8.61.1",
- "@typescript-eslint/typescript-estree": "8.61.1"
+ "@typescript-eslint/scope-manager": "8.71.2",
+ "@typescript-eslint/types": "8.71.2",
+ "@typescript-eslint/typescript-estree": "8.71.2"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5481,13 +4421,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.61.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
- "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
+ "version": "8.71.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.2.tgz",
+ "integrity": "sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/types": "8.71.2",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -5498,19 +4438,6 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
"node_modules/@vscode/sqlite3": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/@vscode/sqlite3/-/sqlite3-5.1.2.tgz",
@@ -5525,6 +4452,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/helper-numbers": "1.13.2",
@@ -5535,24 +4463,28 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
@@ -5564,12 +4496,14 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5582,6 +4516,7 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
@@ -5591,6 +4526,7 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"@xtuc/long": "4.2.2"
@@ -5600,12 +4536,14 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5622,6 +4560,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5635,6 +4574,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5647,6 +4587,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5661,6 +4602,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
@@ -5742,12 +4684,14 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
"license": "Apache-2.0"
},
"node_modules/@yarnpkg/lockfile": {
@@ -5770,20 +4714,15 @@
"js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "dev": true,
- "license": "BSD-3-Clause"
- },
"node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
+ "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
"dev": true,
- "license": "ISC"
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
"node_modules/abort-controller": {
"version": "3.0.0",
@@ -5821,9 +4760,10 @@
}
},
"node_modules/acorn": {
- "version": "8.17.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
- "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
+ "version": "8.19.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz",
+ "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==",
+ "dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -5832,18 +4772,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/acorn-import-phases": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
- "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- },
- "peerDependencies": {
- "acorn": "^8.14.0"
- }
- },
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -5862,16 +4790,13 @@
"license": "MIT"
},
"node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "debug": "4"
- },
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 14"
}
},
"node_modules/agentkeepalive": {
@@ -5905,6 +4830,7 @@
"version": "8.20.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
@@ -5918,9 +4844,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"
@@ -5938,6 +4865,7 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
@@ -5989,6 +4917,7 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
"integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true,
"engines": [
"node >= 0.8.0"
],
@@ -6001,18 +4930,23 @@
"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/ansi-styles": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
- "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
@@ -6022,6 +4956,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
@@ -6049,9 +4984,10 @@
}
},
"node_modules/are-we-there-yet": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
- "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -6059,28 +4995,14 @@
"readable-stream": "^3.6.0"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/are-we-there-yet/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": ">=10"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
"license": "Python-2.0"
},
"node_modules/array-differ": {
@@ -6103,20 +5025,11 @@
"node": ">=0.10.0"
}
},
- "node_modules/array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/array-ify": {
@@ -6167,6 +5080,7 @@
"version": "3.0.10",
"resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
"integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"pvtsutils": "^1.3.6",
@@ -6177,25 +5091,12 @@
"node": ">=12.0.0"
}
},
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.14"
- }
+ "license": "MIT"
},
"node_modules/async-done": {
"version": "2.0.0",
@@ -6245,29 +5146,56 @@
"proxy-from-env": "^2.1.0"
}
},
- "node_modules/b4a": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
- "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
+ "node_modules/axios/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
- "license": "Apache-2.0",
- "peerDependencies": {
- "react-native-b4a": "*"
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
},
- "peerDependenciesMeta": {
- "react-native-b4a": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 6.0.0"
}
},
- "node_modules/bach": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz",
- "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==",
+ "node_modules/axios/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "async-done": "^2.0.0",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz",
+ "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bach": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz",
+ "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-done": "^2.0.0",
"async-settle": "^2.0.0",
"now-and-later": "^3.0.0"
},
@@ -6279,12 +5207,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/bare-events": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz",
- "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==",
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz",
+ "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==",
"dev": true,
"license": "Apache-2.0",
"peerDependencies": {
@@ -6318,9 +5247,10 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.11.26",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.26.tgz",
- "integrity": "sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==",
+ "version": "2.11.28",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.28.tgz",
+ "integrity": "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA==",
+ "dev": true,
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.cjs"
@@ -6346,6 +5276,7 @@
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/before-after-hook": {
@@ -6355,26 +5286,6 @@
"dev": true,
"license": "Apache-2.0"
},
- "node_modules/bidi-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
- "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "require-from-string": "^2.0.2"
- }
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/bin-links": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz",
@@ -6443,6 +5354,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -6476,31 +5388,16 @@
"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": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/blockly/-/blockly-13.2.0.tgz",
- "integrity": "sha512-n8o9UCHea5CYKi5gtPJszxqeRwWFkf2m/BZfHMPNDHvKhvUUlWiuYnF3Q1Ri6GqPA4f2a+DFzAJoCMZLJiFL3Q==",
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/blockly/-/blockly-13.4.0.tgz",
+ "integrity": "sha512-cWZJV5nocL+VWOG9Vfm6j8shdOLGyvKkyoGOS2bk9u6PKb4qqLp50NeL8YoNMTEi7fHmY37eBYT1yC6Y7/yZ7w==",
"license": "Apache-2.0",
"engines": {
"node": ">=22"
},
"peerDependencies": {
- "jsdom": ">=27.4.0 <30.0.0"
+ "jsdom": ">=27.4.0 <31.0.0"
}
},
"node_modules/blockly-backpack-demo": {
@@ -6579,6 +5476,7 @@
"version": "1.20.8",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz",
"integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"bytes": "~3.1.2",
@@ -6599,10 +5497,21 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
+ "node_modules/body-parser/node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/body-parser/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -6612,6 +5521,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
@@ -6624,12 +5534,14 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
"license": "MIT"
},
"node_modules/bonjour-service": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
- "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz",
+ "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
@@ -6647,6 +5559,7 @@
"version": "1.1.21",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz",
"integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -6657,6 +5570,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
@@ -6669,12 +5583,14 @@
"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.29.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.2.tgz",
- "integrity": "sha512-/u9r8k8ue4ZhHCw9ovDtltpWdXeXzjhdxCGj6vm1RGLPXb8lu33EMdoCHF5Sx8oYBS+Q/FYYNmAqlHncxR3RmA==",
+ "version": "4.29.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.3.tgz",
+ "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -6692,7 +5608,7 @@
"license": "MIT",
"dependencies": {
"baseline-browser-mapping": "^2.11.26",
- "caniuse-lite": "^1.0.30001812",
+ "caniuse-lite": "^1.0.30001813",
"electron-to-chromium": "^1.5.439",
"node-releases": "^2.0.57",
"update-browserslist-db": "^1.3.3"
@@ -6733,6 +5649,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/builtins": {
@@ -6743,9 +5660,10 @@
"license": "MIT"
},
"node_modules/bundle-name": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
- "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz",
+ "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"run-applescript": "^7.0.0"
@@ -6771,6 +5689,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -6780,15 +5699,16 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
"integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==",
+ "dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/cacache": {
- "version": "20.0.3",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.3.tgz",
- "integrity": "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==",
+ "version": "20.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz",
+ "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -6801,8 +5721,7 @@
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"p-map": "^7.0.2",
- "ssri": "^13.0.0",
- "unique-filename": "^5.0.0"
+ "ssri": "^13.0.0"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
@@ -6821,113 +5740,10 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/cacache/node_modules/balanced-match": {
- "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"
- }
- },
- "node_modules/cacache/node_modules/brace-expansion": {
- "version": "5.0.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
- "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/cacache/node_modules/fs-minipass": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
- "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/cacache/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/cacache/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/cacache/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/cacache/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/cacache/node_modules/minipass-collect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
- "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
"node_modules/cacache/node_modules/p-map": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz",
- "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.1.1.tgz",
+ "integrity": "sha512-6Lh3jQPLthYujSrlw6ccWXBGZTkoTCz27Hd92g79LH/kjAbgoEu0t442cCCNbegPSJsA0lwDX8z0bcKtkpA32g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -6937,27 +5753,10 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cacache/node_modules/path-scurry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
- "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "lru-cache": "^11.0.0",
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/cacache/node_modules/ssri": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.0.tgz",
- "integrity": "sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==",
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz",
+ "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -6967,81 +5766,25 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/cacache/node_modules/unique-filename": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-5.0.0.tgz",
- "integrity": "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "unique-slug": "^6.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/cacache/node_modules/unique-slug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-6.0.0.tgz",
- "integrity": "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.6.0"
- }
- },
- "node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/cacheable": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz",
+ "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "@cacheable/memory": "^2.2.0",
+ "@cacheable/utils": "^2.5.0",
+ "hookified": "^1.15.0",
+ "keyv": "^5.6.0",
+ "qified": "^0.10.1"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -7055,6 +5798,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
@@ -7071,6 +5815,7 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -7116,9 +5861,10 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001813",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001813.tgz",
- "integrity": "sha512-zfjJo4rM0+fUomGDBW/xcDjhIwz/210DGvip2MAMDZ8KHcRPnOHmEgHPZP0UHlZoxr8fYKVJOqcORhYQcG4FKQ==",
+ "version": "1.0.30001816",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001816.tgz",
+ "integrity": "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -7135,51 +5881,35 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/chai": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
- "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
"engines": {
- "node": ">=18"
- }
- },
- "node_modules/chalk": {
- "version": "5.6.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
- "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
- "license": "MIT",
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/chardet": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
- "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
"dev": true,
"license": "MIT"
},
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
@@ -7200,20 +5930,34 @@
"fsevents": "~2.3.2"
}
},
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
"engines": {
- "node": ">=10"
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0"
@@ -7248,16 +5992,6 @@
"node": ">= 10.0"
}
},
- "node_modules/clean-css/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -7307,31 +6041,52 @@
}
},
"node_modules/cli-width": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
- "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
"dev": true,
"license": "ISC",
"engines": {
- "node": ">= 10"
+ "node": ">= 12"
}
},
"node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
+ "strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "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",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -7342,6 +6097,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
"integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
"dev": true,
"license": "MIT",
"engines": {
@@ -7352,6 +6108,7 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-plain-object": "^2.0.4",
@@ -7366,6 +6123,7 @@
"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"
@@ -7374,19 +6132,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/clone-response": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/clone-stats": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
@@ -7406,6 +6151,32 @@
"readable-stream": "^2.3.5"
}
},
+ "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/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/cmd-shim": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz",
@@ -7420,6 +6191,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -7432,6 +6204,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/color-support": {
@@ -7448,6 +6221,7 @@
"version": "2.0.20",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
"license": "MIT"
},
"node_modules/colors": {
@@ -7517,7 +6291,7 @@
"node_modules/commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true,
"license": "MIT"
},
@@ -7532,23 +6306,11 @@
"dot-prop": "^5.1.0"
}
},
- "node_modules/compare-func/node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/compressible": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
"integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"mime-db": ">= 1.43.0 < 2"
@@ -7558,14 +6320,16 @@
}
},
"node_modules/compression": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
- "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.2.tgz",
+ "integrity": "sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"compressible": "~2.0.18",
"debug": "2.6.9",
+ "destroy": "1.2.0",
"negotiator": "~0.6.4",
"on-headers": "~1.1.0",
"safe-buffer": "5.2.1",
@@ -7573,12 +6337,17 @@
},
"engines": {
"node": ">= 0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -7588,12 +6357,24 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/compression/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"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==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -7613,7 +6394,8 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/concat-stream": {
@@ -7632,21 +6414,6 @@
"typedarray": "^0.0.6"
}
},
- "node_modules/concat-stream/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/concat-with-sourcemaps": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
@@ -7657,26 +6424,16 @@
"source-map": "^0.6.1"
}
},
- "node_modules/concat-with-sourcemaps/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/concurrently": {
- "version": "10.0.5",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.5.tgz",
- "integrity": "sha512-JaP/CoftUrCcAFW/g//RbgEGwlelnEae6cfBLgH6ZdO6s8jPkn6p9SB9u6pdVxYXoiSnFqseOlHfrEfF82TVOg==",
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-10.0.6.tgz",
+ "integrity": "sha512-qgICXXFp2/3nAebRLmxcINKEXM1mLK3ij/y31P02VTs/KIkddIeC05n73DxOXsXMB9LFSqNU1/na3lDlOhcbIw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "5.6.2",
"rxjs": "7.8.2",
- "shell-quote": "1.9.0",
+ "shell-quote": "1.12.0",
"supports-color": "10.2.2",
"tree-kill": "1.2.2",
"yargs": "18.0.0"
@@ -7705,6 +6462,32 @@
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
+ "node_modules/concurrently/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/concurrently/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
"node_modules/concurrently/node_modules/cliui": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
@@ -7824,6 +6607,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
"integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
@@ -7840,6 +6624,7 @@
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "5.2.1"
@@ -7852,6 +6637,7 @@
"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",
@@ -7869,12 +6655,17 @@
"license": "MIT"
},
"node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz",
+ "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/conventional-changelog-angular": {
@@ -7907,6 +6698,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz",
"integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==",
+ "deprecated": "Deprecated and no longer maintained. Please use conventional-changelog instead.",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7926,117 +6718,30 @@
"node": ">=14"
}
},
- "node_modules/conventional-changelog-core/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "node_modules/conventional-changelog-preset-loader": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz",
+ "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "locate-path": "^2.0.0"
- },
"engines": {
- "node": ">=4"
+ "node": ">=14"
}
},
- "node_modules/conventional-changelog-core/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "node_modules/conventional-changelog-writer": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz",
+ "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-preset-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz",
- "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/conventional-changelog-writer": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz",
- "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "conventional-commits-filter": "^3.0.0",
- "dateformat": "^3.0.3",
- "handlebars": "^4.7.7",
- "json-stringify-safe": "^5.0.1",
- "meow": "^8.1.2",
- "semver": "^7.0.0",
- "split": "^1.0.1"
+ "conventional-commits-filter": "^3.0.0",
+ "dateformat": "^3.0.3",
+ "handlebars": "^4.7.7",
+ "json-stringify-safe": "^5.0.1",
+ "meow": "^8.1.2",
+ "semver": "^7.0.0",
+ "split": "^1.0.1"
},
"bin": {
"conventional-changelog-writer": "cli.js"
@@ -8100,6 +6805,13 @@
"node": ">=14"
}
},
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/cookie": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
@@ -8113,6 +6825,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
"integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/copy-props": {
@@ -8153,33 +6866,11 @@
"webpack": "^5.1.0"
}
},
- "node_modules/copy-webpack-plugin/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.2.tgz",
- "integrity": "sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/cors": {
@@ -8210,15 +6901,16 @@
}
},
"node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
+ "env-paths": "^2.2.1",
"import-fresh": "^3.3.0",
"js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
+ "parse-json": "^5.2.0"
},
"engines": {
"node": ">=14"
@@ -8239,6 +6931,7 @@
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -8250,9 +6943,9 @@
}
},
"node_modules/css-loader": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz",
- "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==",
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.5.tgz",
+ "integrity": "sha512-Q7iAfQkU2twNBryKX/vGAlE+GAmkF7quhSzAGNK8fBimxk3+tqg245rH52UPb9dioBolBc8rP0ihmHBaDTJQBA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8302,20 +6995,6 @@
"url": "https://github.com/sponsors/fb55"
}
},
- "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/css-what": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
@@ -8352,35 +7031,6 @@
"node": ">=8"
}
},
- "node_modules/dat.gui": {
- "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==",
- "license": "Apache-2.0"
- },
- "node_modules/data-uri-to-buffer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
- "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
- "license": "MIT",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/data-urls": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz",
- "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-mimetype": "^5.0.0",
- "whatwg-url": "^16.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
"node_modules/dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
@@ -8412,6 +7062,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
"integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
"dev": true,
"license": "MIT",
"engines": {
@@ -8421,7 +7072,7 @@
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -8455,42 +7106,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/decimal.js": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
- "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/dedent": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
@@ -8506,19 +7121,6 @@
}
}
},
- "node_modules/deep-eql": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
- "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-detect": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -8536,19 +7138,11 @@
"dev": true,
"license": "MIT"
},
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/default-browser": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
- "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz",
+ "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"bundle-name": "^4.1.0",
@@ -8562,9 +7156,10 @@
}
},
"node_modules/default-browser-id": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
- "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -8586,26 +7181,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/defaults/node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -8637,6 +7212,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -8653,6 +7229,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8",
@@ -8673,6 +7250,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
"license": "MIT"
},
"node_modules/developer-tools": {
@@ -8691,9 +7269,9 @@
}
},
"node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "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": {
@@ -8717,6 +7295,7 @@
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
"integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
@@ -8750,16 +7329,6 @@
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
"node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
@@ -8789,15 +7358,6 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
- "node_modules/dompurify": {
- "version": "3.4.15",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz",
- "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==",
- "license": "(MPL-2.0 OR Apache-2.0)",
- "optionalDependencies": {
- "@types/trusted-types": "^2.0.7"
- }
- },
"node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
@@ -8824,6 +7384,19 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
@@ -8857,6 +7430,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
@@ -8885,34 +7459,34 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
"license": "MIT"
},
"node_modules/ejs": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
- "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.1.tgz",
+ "integrity": "sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==",
"dev": true,
"license": "Apache-2.0",
- "dependencies": {
- "jake": "^10.8.5"
- },
"bin": {
"ejs": "bin/cli.js"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.12.18"
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.439",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.439.tgz",
- "integrity": "sha512-qu6QIPXhsb+CRcAiTMNjR4A1y/7tCYKkKjr5CZXRVih6qkDf79peZ2BpEU3qoDBNCRrcy3Mra3X9nG5oruuA7Q==",
+ "version": "1.5.456",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.456.tgz",
+ "integrity": "sha512-8hboqI6xesozteFb8aa7OGknvxUtTeRJLz0FoePysUEh/oWbddykIGdgpEJRbPRg/nIMfBf2DFos+H2MtvJl2A==",
+ "dev": true,
"license": "ISC"
},
"node_modules/email-addresses": {
@@ -8926,22 +7500,14 @@
"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/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -8958,6 +7524,20 @@
"iconv-lite": "^0.6.2"
}
},
+ "node_modules/encoding/node_modules/iconv-lite": {
+ "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",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -9011,9 +7591,10 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.24.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz",
- "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==",
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz",
+ "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
@@ -9037,14 +7618,11 @@
}
},
"node_modules/entities": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
- "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
"dev": true,
"license": "BSD-2-Clause",
- "engines": {
- "node": ">=20.19.0"
- },
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
@@ -9060,9 +7638,10 @@
}
},
"node_modules/envinfo": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz",
- "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==",
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
+ "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
+ "dev": true,
"license": "MIT",
"bin": {
"envinfo": "dist/cli.js"
@@ -9085,9 +7664,10 @@
"dev": true
},
"node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
@@ -9097,6 +7677,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -9106,21 +7687,24 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-module-lexer": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz",
- "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz",
+ "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/es-object-atoms": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
- "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -9149,6 +7733,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -9158,22 +7743,26 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
"license": "MIT"
},
"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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=0.8.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz",
- "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==",
+ "version": "10.12.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.12.0.tgz",
+ "integrity": "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==",
"dev": true,
"license": "MIT",
"workspaces": [
@@ -9183,9 +7772,9 @@
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2",
"@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.6.0",
+ "@eslint/config-helpers": "^0.7.0",
"@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.2",
+ "@eslint/plugin-kit": "^0.7.3",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -9200,14 +7789,14 @@
"esquery": "^1.7.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
+ "file-entry-cache": "11.1.5 || >11.1.6 <12",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "minimatch": "^10.2.4",
+ "minimatch": "^10.2.5",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
@@ -9259,13 +7848,13 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "63.0.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.5.tgz",
- "integrity": "sha512-AzI9bgKhV9li049/mIblX0c41DeWMMfH9qNsRasc+fAxwURRKChIp03Pk57M7UTf+Y6hifTJ89kQyCOoOLtEDw==",
+ "version": "63.3.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.3.tgz",
+ "integrity": "sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "@es-joy/jsdoccomment": "~0.87.0",
+ "@es-joy/jsdoccomment": "~0.91.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.7",
@@ -9276,8 +7865,8 @@
"html-entities": "^2.6.0",
"object-deep-merge": "^2.0.1",
"parse-imports-exports": "^0.2.4",
- "semver": "^7.8.2",
- "spdx-expression-parse": "^4.0.0",
+ "semver": "^7.8.5",
+ "spdx-expression-parse": "^5.0.0",
"to-valid-identifier": "^1.0.0"
},
"engines": {
@@ -9287,32 +7876,6 @@
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
"node_modules/eslint-plugin-jsdoc/node_modules/espree": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
@@ -9331,51 +7894,33 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint-plugin-jsdoc/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
- "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
"node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
"esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=8.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -9421,30 +7966,16 @@
"node": "20 || >=22"
}
},
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
- "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "node_modules/eslint/node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "@types/esrecurse": "^4.3.1",
- "@types/estree": "^1.0.8",
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=24"
@@ -9453,246 +7984,114 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
- "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "node_modules/eslint/node_modules/json-schema-traverse": {
+ "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": "Apache-2.0",
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/eslint/node_modules/espree": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
- "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "acorn": "^8.16.0",
+ "acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^5.0.1"
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=4.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=4"
}
},
- "node_modules/eslint/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "estraverse": "^5.1.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10"
}
},
- "node_modules/eslint/node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=16"
+ "node": ">=4.0"
}
},
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=10.13.0"
+ "node": ">=4.0"
}
},
- "node_modules/eslint/node_modules/json-schema-traverse": {
- "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/eslint/node_modules/locate-path": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/eslint/node_modules/p-limit": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-locate": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
- "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
@@ -9703,6 +8102,7 @@
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -9722,12 +8122,14 @@
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.x"
@@ -9791,6 +8193,7 @@
"version": "4.22.3",
"resolved": "https://registry.npmjs.org/express/-/express-4.22.3.tgz",
"integrity": "sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
@@ -9833,10 +8236,21 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/express/node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -9846,18 +8260,14 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/express/node_modules/path-to-regexp": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
- "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
+ "dev": true,
"license": "MIT"
},
"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==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -9874,15 +8284,6 @@
],
"license": "MIT"
},
- "node_modules/express/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -9894,6 +8295,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
"license": "MIT"
},
"node_modules/fast-fifo": {
@@ -9920,10 +8322,24 @@
"node": ">=8.6.0"
}
},
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
@@ -9937,6 +8353,7 @@
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
"integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -9960,9 +8377,9 @@
}
},
"node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz",
+ "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -9973,6 +8390,7 @@
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"websocket-driver": ">=0.5.1"
@@ -9999,29 +8417,6 @@
}
}
},
- "node_modules/fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
- },
- "engines": {
- "node": "^12.20 || >= 14.13"
- }
- },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -10038,10 +8433,30 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/figures/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/file-entry-cache": {
+ "version": "11.1.5",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz",
+ "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^6.1.23"
+ }
+ },
"node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz",
+ "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -10074,7 +8489,7 @@
"node_modules/filename-reserved-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -10103,6 +8518,7 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -10115,6 +8531,7 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
"integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
@@ -10133,6 +8550,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -10142,17 +8560,9 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/finalhandler/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
@@ -10172,16 +8582,20 @@
}
},
"node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "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": "^5.0.0",
+ "locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-yarn-workspace-root2": {
@@ -10241,6 +8655,32 @@
"node": ">=0.10.0"
}
},
+ "node_modules/first-chunk-stream/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/first-chunk-stream/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/flagged-respawn": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz",
@@ -10255,22 +8695,36 @@
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
"integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
"license": "BSD-3-Clause",
"bin": {
"flat": "cli.js"
}
},
- "node_modules/flatted": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
- "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "node_modules/flat-cache": {
+ "version": "6.1.23",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz",
+ "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==",
"dev": true,
- "license": "ISC"
+ "license": "MIT",
+ "dependencies": {
+ "cacheable": "^2.5.0",
+ "flatted": "^3.4.2",
+ "hookified": "^1.15.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz",
+ "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/follow-redirects": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
- "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.1.tgz",
+ "integrity": "sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==",
+ "dev": true,
"funding": [
{
"type": "individual",
@@ -10314,6 +8768,7 @@
"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",
@@ -10330,6 +8785,7 @@
"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"
@@ -10338,167 +8794,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/fork-ts-checker-webpack-plugin": {
- "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==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.16.7",
- "chalk": "^4.1.2",
- "chokidar": "^4.0.1",
- "cosmiconfig": "^8.2.0",
- "deepmerge": "^4.2.2",
- "fs-extra": "^10.0.0",
- "memfs": "^3.4.1",
- "minimatch": "^3.0.4",
- "node-abort-controller": "^3.0.1",
- "schema-utils": "^3.1.1",
- "semver": "^7.3.5",
- "tapable": "^2.2.1"
- },
- "engines": {
- "node": ">=14.21.3"
- },
- "peerDependencies": {
- "typescript": ">3.6.0",
- "webpack": "^5.11.0"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
- "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==",
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": {
- "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==",
- "license": "MIT"
- },
- "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==",
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
- "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==",
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/form-data": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
@@ -10516,22 +8811,11 @@
"node": ">= 6"
}
},
- "node_modules/formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "license": "MIT",
- "dependencies": {
- "fetch-blob": "^3.1.2"
- },
- "engines": {
- "node": ">=12.20.0"
- }
- },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -10541,6 +8825,7 @@
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -10554,9 +8839,10 @@
"license": "MIT"
},
"node_modules/fs-extra": {
- "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
- "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
+ "version": "11.4.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz",
+ "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
@@ -10568,16 +8854,16 @@
}
},
"node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "minipass": "^3.0.0"
+ "minipass": "^7.0.3"
},
"engines": {
- "node": ">= 8"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/fs-mkdirp-stream": {
@@ -10594,16 +8880,10 @@
"node": ">=10.13.0"
}
},
- "node_modules/fs-monkey": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz",
- "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==",
- "license": "Unlicense"
- },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true,
"license": "ISC"
},
@@ -10611,6 +8891,8 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
@@ -10624,97 +8906,39 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gauge": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
- "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
"dependencies": {
"aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.3",
- "console-control-strings": "^1.1.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
"has-unicode": "^2.0.1",
- "signal-exit": "^3.0.7",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
"string-width": "^4.2.3",
"strip-ansi": "^6.0.1",
- "wide-align": "^1.1.5"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
- }
- },
- "node_modules/gaxios": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz",
- "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "extend": "^3.0.2",
- "https-proxy-agent": "^5.0.0",
- "is-stream": "^2.0.0",
- "node-fetch": "^2.6.9"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/gaxios/node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
+ "wide-align": "^1.1.2"
},
"engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/gaxios/node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/gaxios/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/gaxios/node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
+ "node": ">=10"
}
},
"node_modules/get-caller-file": {
"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.*"
@@ -10733,20 +8957,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
@@ -10786,21 +9001,81 @@
"node": ">=6.9.0"
}
},
- "node_modules/get-pkg-repo/node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "node_modules/get-pkg-repo/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/get-pkg-repo/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/get-pkg-repo/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/get-pkg-repo/node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/get-pkg-repo/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
@@ -10846,17 +9121,11 @@
"node": ">=10"
}
},
- "node_modules/gh-pages/node_modules/async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/git-raw-commits": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz",
"integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==",
+ "deprecated": "Deprecated and no longer maintained. Use @conventional-changelog/git-client instead.",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10889,6 +9158,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz",
"integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==",
+ "deprecated": "Deprecated and no longer maintained. Use @conventional-changelog/git-client instead.",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11093,89 +9363,41 @@
"@octokit/openapi-types": "^12.11.0"
}
},
- "node_modules/github-username/node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/github-username/node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/github-username/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/github-username/node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
"node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
},
"engines": {
- "node": "*"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10.13.0"
}
},
"node_modules/glob-stream": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.3.tgz",
- "integrity": "sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.4.tgz",
+ "integrity": "sha512-7uzFVQ1ZUBr0nYexxubOvocZXQ4HcHv6WO3TOiYUPaCda7BASuKgOw/NB4Pc9gHM3tK0Jrekq7el8pKhb8kx5w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11192,25 +9414,23 @@
"node": ">=10.13.0"
}
},
- "node_modules/glob-stream/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/glob-to-regex.js": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.3.1.tgz",
+ "integrity": "sha512-zhWhMRsgnOym+1txhUmYJGD6eUsbUdrZv55gCYKuJX8t2p3+M8My23PD09bEIsreGUs5pnSa/idmcfp2/IlqGg==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10.13.0"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "license": "BSD-2-Clause"
- },
"node_modules/glob-watcher": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz",
@@ -11225,10 +9445,94 @@
"node": ">= 10.13.0"
}
},
+ "node_modules/glob/node_modules/balanced-match": {
+ "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"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
+ "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
+ "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.8"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
"node_modules/globals": {
- "version": "17.6.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
- "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
+ "version": "17.13.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz",
+ "integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11276,6 +9580,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -11284,36 +9589,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/grouped-queue": {
"version": "2.1.0",
@@ -11371,56 +9652,10 @@
"node": ">=10.13.0"
}
},
- "node_modules/gulp-cli/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/gulp-cli/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/gulp-cli/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gulp-header": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-2.0.12.tgz",
- "integrity": "sha512-7PFW56tRISOroZ3N5R+f1Bn4wvdtE5LZXfZqz4ubEAXLEsLS7kSifgsk/lF26hSqnYO786GniQCxCuLxQZ0SoA==",
+ "node_modules/gulp-header": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-2.0.12.tgz",
+ "integrity": "sha512-7PFW56tRISOroZ3N5R+f1Bn4wvdtE5LZXfZqz4ubEAXLEsLS7kSifgsk/lF26hSqnYO786GniQCxCuLxQZ0SoA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11447,16 +9682,17 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
"integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/handlebars": {
- "version": "4.7.9",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
- "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
+ "version": "4.7.10",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.10.tgz",
+ "integrity": "sha512-P5VJMVM7qgBn6vjXMw8WG9uVI+ncf2pi72j4de4yz5ZULLj2RGqLYaKOYGsgyrViQ0tePOVlN1tDCCXXtFqXKg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minimist": "^1.2.5",
+ "minimist": "^1.2.8",
"neo-async": "^2.6.2",
"source-map": "^0.6.1",
"wordwrap": "^1.0.0"
@@ -11471,16 +9707,6 @@
"uglify-js": "^3.1.4"
}
},
- "node_modules/handlebars/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/hard-rejection": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
@@ -11495,6 +9721,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -11504,6 +9731,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -11535,10 +9763,24 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/hashery": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz",
+ "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hookified": "^1.15.0"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
"node_modules/hasown": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
"integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -11551,6 +9793,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
"license": "MIT",
"bin": {
"he": "bin/he"
@@ -11569,23 +9812,31 @@
"node": ">=0.10.0"
}
},
+ "node_modules/hookified": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz",
+ "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
+ "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
"dev": true,
"license": "ISC",
"dependencies": {
- "lru-cache": "^6.0.0"
+ "lru-cache": "^11.1.0"
},
"engines": {
- "node": ">=10"
+ "node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
"integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
@@ -11594,6 +9845,32 @@
"wbuf": "^1.1.0"
}
},
+ "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==",
+ "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/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==",
+ "dev": true,
+ "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",
@@ -11657,9 +9934,9 @@
}
},
"node_modules/html-webpack-plugin": {
- "version": "5.6.7",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz",
- "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==",
+ "version": "5.6.8",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz",
+ "integrity": "sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11677,7 +9954,7 @@
"url": "https://opencollective.com/html-webpack-plugin"
},
"peerDependencies": {
- "@rspack/core": "0.x || 1.x",
+ "@rspack/core": "0.x || 1.x || 2.x",
"webpack": "^5.20.0"
},
"peerDependenciesMeta": {
@@ -11709,20 +9986,10 @@
"entities": "^2.0.0"
}
},
- "node_modules/htmlparser2/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
"node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz",
+ "integrity": "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==",
"dev": true,
"license": "BSD-2-Clause"
},
@@ -11730,12 +9997,14 @@
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
"integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"depd": "~2.0.0",
@@ -11752,25 +10021,18 @@
"url": "https://opencollective.com/express"
}
},
- "node_modules/http-errors/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/http-parser-js": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
"integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"eventemitter3": "^4.0.0",
@@ -11795,20 +10057,11 @@
"node": ">= 14"
}
},
- "node_modules/http-proxy-agent/node_modules/agent-base": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
- "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14"
- }
- },
"node_modules/http-proxy-middleware": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz",
"integrity": "sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/http-proxy": "^1.17.8",
@@ -11833,6 +10086,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -11869,91 +10123,18 @@
"node": ">=12"
}
},
- "node_modules/http-server/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/http-server/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/http-server/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/http2-wrapper/node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "agent-base": "6",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
"node_modules/human-signals": {
@@ -11980,21 +10161,27 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
"integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10.18"
}
},
"node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz",
+ "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/icss-utils": {
@@ -12032,9 +10219,9 @@
"license": "BSD-3-Clause"
},
"node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -12094,9 +10281,10 @@
}
},
"node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
@@ -12110,9 +10298,10 @@
}
},
"node_modules/import-local": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
- "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"pkg-dir": "^4.2.0",
@@ -12131,7 +10320,7 @@
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -12158,7 +10347,8 @@
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -12170,6 +10360,7 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
"license": "ISC"
},
"node_modules/ini": {
@@ -12198,97 +10389,47 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/init-package-json/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
+ "node_modules/inquirer": {
+ "version": "12.9.6",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz",
+ "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^11.1.0"
+ "@inquirer/ansi": "^1.0.0",
+ "@inquirer/core": "^10.2.2",
+ "@inquirer/prompts": "^7.8.6",
+ "@inquirer/type": "^3.0.8",
+ "mute-stream": "^2.0.0",
+ "run-async": "^4.0.5",
+ "rxjs": "^7.8.2"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/init-package-json/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
+ "node_modules/interpret": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/init-package-json/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/init-package-json/node_modules/npm-package-arg/node_modules/validate-npm-package-name": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz",
- "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/init-package-json/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/init-package-json/node_modules/validate-npm-package-name": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz",
- "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/install": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz",
- "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/interpret": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
- "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
- "license": "MIT",
+ "license": "MIT",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/ip-address": {
- "version": "10.7.2",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz",
- "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==",
+ "version": "10.7.4",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.4.tgz",
+ "integrity": "sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -12296,9 +10437,10 @@
}
},
"node_modules/ipaddr.js": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
- "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.5.0.tgz",
+ "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
@@ -12321,13 +10463,15 @@
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
@@ -12366,12 +10510,13 @@
}
},
"node_modules/is-core-module": {
- "version": "2.16.2",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
- "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz",
+ "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.3"
+ "hasown": "^2.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -12399,7 +10544,8 @@
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -12409,6 +10555,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -12418,6 +10565,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
@@ -12430,6 +10578,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-docker": "^3.0.0"
@@ -12448,6 +10597,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
"license": "MIT",
"bin": {
"is-docker": "cli.js"
@@ -12487,9 +10637,10 @@
}
},
"node_modules/is-network-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz",
- "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz",
+ "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
@@ -12502,6 +10653,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
@@ -12521,6 +10673,7 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -12537,22 +10690,15 @@
}
},
"node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.1.0.tgz",
+ "integrity": "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
@@ -12632,6 +10778,7 @@
"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"
@@ -12683,7 +10830,8 @@
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/isbinaryfile": {
@@ -12702,31 +10850,34 @@
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
"license": "ISC"
},
"node_modules/isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz",
+ "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==",
+ "dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
+ "@isaacs/cliui": "^9.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jake": {
@@ -12747,79 +10898,27 @@
"node": ">=10"
}
},
- "node_modules/jake/node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/jest-diff": {
- "version": "30.4.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz",
- "integrity": "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==",
+ "version": "30.5.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.2.tgz",
+ "integrity": "sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/diff-sequences": "30.4.0",
- "@jest/get-type": "30.1.0",
+ "@jest/diff-sequences": "30.5.0",
+ "@jest/get-type": "30.5.0",
"chalk": "^4.1.2",
- "pretty-format": "30.4.1"
+ "pretty-format": "30.5.1"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/jest-diff/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-diff/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jest-diff/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
@@ -12830,79 +10929,44 @@
"node": ">= 10.13.0"
}
},
- "node_modules/js-green-licenses": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-green-licenses/-/js-green-licenses-4.0.0.tgz",
- "integrity": "sha512-kcgTOaZmpDpINcRAOKKhjHtBN6zibMVTC8qfPUOpowQtI/6fUgdmwJLJ0ycCb0pUO3ZYKn++56sy8IlG60p5mg==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "gaxios": "^5.0.0",
- "meow": "^9.0.0",
- "npm-package-arg": "^8.0.0",
- "package-json": "^7.0.0",
- "semver": "^7.3.2",
- "spdx-correct": "^3.0.0",
- "spdx-satisfies": "^5.0.0",
- "strip-json-comments": "^3.0.0"
- },
- "bin": {
- "jsgl": "build/src/cli.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/js-green-licenses/node_modules/meow": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
- "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "node_modules/jest-worker/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": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize": "^1.2.0",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
- },
- "engines": {
- "node": ">=10"
+ "has-flag": "^4.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/js-green-licenses/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -12912,106 +10976,15 @@
}
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
- "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz",
+ "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=20.0.0"
}
},
- "node_modules/jsdom": {
- "version": "29.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz",
- "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@asamuzakjp/css-color": "^5.1.11",
- "@asamuzakjp/dom-selector": "^7.1.1",
- "@bramus/specificity": "^2.4.2",
- "@csstools/css-syntax-patches-for-csstree": "^1.1.3",
- "@exodus/bytes": "^1.15.0",
- "css-tree": "^3.2.1",
- "data-urls": "^7.0.0",
- "decimal.js": "^10.6.0",
- "html-encoding-sniffer": "^6.0.0",
- "is-potential-custom-element-name": "^1.0.1",
- "lru-cache": "^11.3.5",
- "parse5": "^8.0.1",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^6.0.1",
- "undici": "^7.25.0",
- "w3c-xmlserializer": "^5.0.0",
- "webidl-conversions": "^8.0.1",
- "whatwg-mimetype": "^5.0.0",
- "whatwg-url": "^16.0.1",
- "xml-name-validator": "^5.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24.0.0"
- },
- "peerDependencies": {
- "canvas": "^3.0.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
- }
- },
- "node_modules/jsdom-global": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz",
- "integrity": "sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "jsdom": ">=10.0.0"
- }
- },
- "node_modules/jsdom/node_modules/html-encoding-sniffer": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz",
- "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@exodus/bytes": "^1.6.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/jsdom/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/jsdom/node_modules/undici": {
- "version": "7.30.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz",
- "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20.18.1"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -13020,21 +10993,26 @@
"license": "MIT"
},
"node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "license": "MIT"
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz",
+ "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
},
"node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true,
"license": "MIT"
},
@@ -13059,6 +11037,7 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
@@ -13075,9 +11054,11 @@
"license": "MIT"
},
"node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
@@ -13126,27 +11107,21 @@
"dev": true,
"license": "MIT"
},
- "node_modules/just-extend": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
- "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz",
+ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "json-buffer": "3.0.1"
+ "@keyv/serialize": "^1.1.1"
}
},
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -13163,13 +11138,14 @@
}
},
"node_modules/launch-editor": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz",
- "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==",
+ "version": "2.14.2",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.2.tgz",
+ "integrity": "sha512-NHJEb30MGBCkmZXLZwz25t37QR4aY03ZzPYUJXOJaOa92uWwExI9SBQUuIznBYc1xkD7cJNGX7oc3Nl3sq2kQQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"picocolors": "^1.1.1",
- "shell-quote": "^1.8.4"
+ "shell-quote": "^1.10.0"
}
},
"node_modules/lead": {
@@ -13263,1930 +11239,1634 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
- "node_modules/lerna/node_modules/@npmcli/git": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz",
- "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==",
+ "node_modules/lerna/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "@npmcli/promise-spawn": "^8.0.0",
- "ini": "^5.0.0",
- "lru-cache": "^10.0.1",
- "npm-pick-manifest": "^10.0.0",
- "proc-log": "^5.0.0",
- "promise-retry": "^2.0.1",
- "semver": "^7.3.5",
- "which": "^5.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
- "node_modules/lerna/node_modules/@npmcli/git/node_modules/ini": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
- "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/lerna/node_modules/@npmcli/git/node_modules/lru-cache": {
- "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/lerna/node_modules/@npmcli/promise-spawn": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz",
- "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==",
+ "node_modules/lerna/node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "which": "^5.0.0"
+ "argparse": "^2.0.1"
},
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/lerna/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/lerna/node_modules/minimatch": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz",
+ "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "color-convert": "^2.0.1"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": "*"
}
},
- "node_modules/lerna/node_modules/chalk": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
- "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "node_modules/lerna/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/lerna/node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/lerna/node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "node_modules/lerna/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
"license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=12"
+ "node": ">=10"
}
},
- "node_modules/lerna/node_modules/cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "node_modules/lerna/node_modules/tinyglobby": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+ "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "env-paths": "^2.2.1",
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0"
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2"
},
"engines": {
- "node": ">=14"
+ "node": ">=12.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/lerna/node_modules/envinfo": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
- "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
+ "node_modules/lerna/node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"bin": {
- "envinfo": "dist/cli.js"
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=4"
+ "node": ">=14.17"
}
},
- "node_modules/lerna/node_modules/fs-minipass": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
- "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "node_modules/lerna/node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "minipass": "^7.0.3"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": ">=12"
}
},
- "node_modules/lerna/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.3"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">= 0.8.0"
}
},
- "node_modules/lerna/node_modules/hosted-git-info": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
- "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==",
+ "node_modules/libnpmaccess": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-10.0.3.tgz",
+ "integrity": "sha512-JPHTfWJxIK+NVPdNMNGnkz4XGX56iijPbe0qFWbdt68HL+kIvSzh+euBL8npLZvl2fpaxo+1eZSdoG15f5YdIQ==",
"dev": true,
"license": "ISC",
"dependencies": {
- "lru-cache": "^11.1.0"
+ "npm-package-arg": "^13.0.0",
+ "npm-registry-fetch": "^19.0.0"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/lerna/node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "node_modules/libnpmpublish": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-11.1.2.tgz",
+ "integrity": "sha512-tNcU3cLH7toloAzhOOrBDhjzgbxpyuYvkf+BPPnnJCdc5EIcdJ8JcT+SglvCQKKyZ6m9dVXtCVlJcA6csxKdEA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
+ "@npmcli/package-json": "^7.0.0",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^13.0.0",
+ "npm-registry-fetch": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7",
+ "sigstore": "^4.0.0",
+ "ssri": "^12.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/lerna/node_modules/inquirer": {
- "version": "12.9.6",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz",
- "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==",
+ "node_modules/liftoff": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.1.tgz",
+ "integrity": "sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@inquirer/ansi": "^1.0.0",
- "@inquirer/core": "^10.2.2",
- "@inquirer/prompts": "^7.8.6",
- "@inquirer/type": "^3.0.8",
- "mute-stream": "^2.0.0",
- "run-async": "^4.0.5",
- "rxjs": "^7.8.2"
+ "extend": "^3.0.2",
+ "findup-sync": "^5.0.0",
+ "fined": "^2.0.0",
+ "flagged-respawn": "^2.0.0",
+ "is-plain-object": "^5.0.0",
+ "rechoir": "^0.8.0",
+ "resolve": "^1.20.0"
},
"engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@types/node": ">=18"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- }
+ "node": ">=10.13.0"
}
},
- "node_modules/lerna/node_modules/isexe": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
- "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "node_modules/lines-and-columns": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz",
+ "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
- "node_modules/lerna/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
+ "node_modules/lit": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.3.tgz",
+ "integrity": "sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
}
},
- "node_modules/lerna/node_modules/minimatch": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz",
- "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==",
- "dev": true,
- "license": "ISC",
+ "node_modules/lit-element": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz",
+ "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
+ "@lit-labs/ssr-dom-shim": "^1.5.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
}
},
- "node_modules/lerna/node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "node_modules/lit-html": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.3.tgz",
+ "integrity": "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz",
+ "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "parse-json": "^5.0.0",
+ "strip-bom": "^4.0.0",
+ "type-fest": "^0.6.0"
+ },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=8"
}
},
- "node_modules/lerna/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "node_modules/load-yaml-file": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz",
+ "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minipass": "^7.1.2"
+ "graceful-fs": "^4.1.5",
+ "js-yaml": "^3.13.0",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0"
},
"engines": {
- "node": ">= 18"
+ "node": ">=6"
}
},
- "node_modules/lerna/node_modules/mute-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
- "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "node_modules/load-yaml-file/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
}
},
- "node_modules/lerna/node_modules/npm-package-arg": {
- "version": "13.0.1",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.1.tgz",
- "integrity": "sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==",
+ "node_modules/load-yaml-file/node_modules/js-yaml": {
+ "version": "3.15.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz",
+ "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^5.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^6.0.0"
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
},
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/load-yaml-file/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=6"
}
},
- "node_modules/lerna/node_modules/npm-pick-manifest": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz",
- "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==",
+ "node_modules/load-yaml-file/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "npm-install-checks": "^7.1.0",
- "npm-normalize-package-bin": "^4.0.0",
- "npm-package-arg": "^12.0.0",
- "semver": "^7.3.5"
- },
+ "license": "MIT",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=4"
}
},
- "node_modules/lerna/node_modules/npm-pick-manifest/node_modules/hosted-git-info": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz",
- "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==",
+ "node_modules/locate-path": {
+ "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": "ISC",
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^10.0.1"
+ "p-locate": "^5.0.0"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lerna/node_modules/npm-pick-manifest/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"dev": true,
- "license": "ISC"
+ "license": "MIT"
},
- "node_modules/lerna/node_modules/npm-pick-manifest/node_modules/npm-package-arg": {
- "version": "12.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz",
- "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==",
+ "node_modules/lodash.ismatch": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
+ "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
"dev": true,
- "license": "ISC",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "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": {
- "hosted-git-info": "^8.0.0",
- "proc-log": "^5.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^6.0.0"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lerna/node_modules/pacote": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.1.tgz",
- "integrity": "sha512-LHGIUQUrcDIJUej53KJz1BPvUuHrItrR2yrnN0Kl9657cJ0ZT6QJHk9wWPBnQZhYT5KLyZWrk9jaYc2aKDu4yw==",
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "@npmcli/git": "^6.0.0",
- "@npmcli/installed-package-contents": "^3.0.0",
- "@npmcli/package-json": "^7.0.0",
- "@npmcli/promise-spawn": "^8.0.0",
- "@npmcli/run-script": "^10.0.0",
- "cacache": "^20.0.0",
- "fs-minipass": "^3.0.0",
- "minipass": "^7.0.2",
- "npm-package-arg": "^13.0.0",
- "npm-packlist": "^10.0.1",
- "npm-pick-manifest": "^10.0.0",
- "npm-registry-fetch": "^19.0.0",
- "proc-log": "^5.0.0",
- "promise-retry": "^2.0.1",
- "sigstore": "^4.0.0",
- "ssri": "^12.0.0",
- "tar": "^7.4.3"
- },
- "bin": {
- "pacote": "bin/index.js"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "tslib": "^2.0.3"
}
},
- "node_modules/lerna/node_modules/run-async": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz",
- "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==",
+ "node_modules/lru-cache": {
+ "version": "11.5.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz",
+ "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=0.12.0"
+ "node": "20 || >=22"
}
},
- "node_modules/lerna/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "semver": "^6.0.0"
},
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lerna/node_modules/tar": {
- "version": "7.5.11",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
- "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/lerna/node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "node_modules/make-fetch-happen": {
+ "version": "15.0.2",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.2.tgz",
+ "integrity": "sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ==",
"dev": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^4.0.0",
+ "cacache": "^20.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
},
"engines": {
- "node": ">=14.17"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/lerna/node_modules/validate-npm-package-name": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz",
- "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==",
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/lerna/node_modules/which": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
- "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^3.1.1"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
+ "license": "MIT",
"engines": {
- "node": "^18.17.0 || >=20.5.0"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lerna/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "node_modules/map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">= 0.4"
}
},
- "node_modules/lerna/node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
"engines": {
- "node": ">=12"
+ "node": ">= 0.6"
}
},
- "node_modules/lerna/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==",
+ "node_modules/mem-fs": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-2.3.0.tgz",
+ "integrity": "sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "^15.6.2",
+ "@types/vinyl": "^2.0.4",
+ "vinyl": "^2.0.1",
+ "vinyl-file": "^3.0.0"
+ },
"engines": {
"node": ">=12"
}
},
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "node_modules/mem-fs-editor": {
+ "version": "9.7.0",
+ "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-9.7.0.tgz",
+ "integrity": "sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
+ "binaryextensions": "^4.16.0",
+ "commondir": "^1.0.1",
+ "deep-extend": "^0.6.0",
+ "ejs": "^3.1.8",
+ "globby": "^11.1.0",
+ "isbinaryfile": "^5.0.0",
+ "minimatch": "^7.2.0",
+ "multimatch": "^5.0.0",
+ "normalize-path": "^3.0.0",
+ "textextensions": "^5.13.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=12.10.0"
+ },
+ "peerDependencies": {
+ "mem-fs": "^2.1.0"
+ },
+ "peerDependenciesMeta": {
+ "mem-fs": {
+ "optional": true
+ }
}
},
- "node_modules/libnpmaccess": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-10.0.3.tgz",
- "integrity": "sha512-JPHTfWJxIK+NVPdNMNGnkz4XGX56iijPbe0qFWbdt68HL+kIvSzh+euBL8npLZvl2fpaxo+1eZSdoG15f5YdIQ==",
+ "node_modules/mem-fs-editor/node_modules/brace-expansion": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
+ "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "npm-package-arg": "^13.0.0",
- "npm-registry-fetch": "^19.0.0"
- },
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/libnpmaccess/node_modules/hosted-git-info": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
- "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==",
+ "node_modules/mem-fs-editor/node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
- "license": "ISC",
+ "license": "Apache-2.0",
"dependencies": {
- "lru-cache": "^11.1.0"
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/libnpmaccess/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
+ "node_modules/mem-fs-editor/node_modules/isbinaryfile": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
+ "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "MIT",
"engines": {
- "node": "20 || >=22"
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
}
},
- "node_modules/libnpmaccess/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
+ "node_modules/mem-fs-editor/node_modules/minimatch": {
+ "version": "7.4.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.9.tgz",
+ "integrity": "sha512-Brg/fp/iAVDOQoHxkuN5bEYhyQlZhxddI78yWsCbeEwTHXQjlNLtiJDUsp1GIptVqMI7/gkJMz4vVAc01mpoBw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
+ "brace-expansion": "^2.0.2"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/libnpmaccess/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
+ "node_modules/mem-fs/node_modules/@types/node": {
+ "version": "15.14.9",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz",
+ "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
+ "license": "MIT"
},
- "node_modules/libnpmaccess/node_modules/validate-npm-package-name": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.1.tgz",
- "integrity": "sha512-BM0Upcemlce8/9+HE+/VpWqn3u3mYh6Om/FEC8yPMnEHwf710fW5Q6fhjT1SQyRlZD1G9CJbgfH+rWgAcIvjlQ==",
+ "node_modules/mem-fs/node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=0.8"
}
},
- "node_modules/libnpmpublish": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-11.1.2.tgz",
- "integrity": "sha512-tNcU3cLH7toloAzhOOrBDhjzgbxpyuYvkf+BPPnnJCdc5EIcdJ8JcT+SglvCQKKyZ6m9dVXtCVlJcA6csxKdEA==",
+ "node_modules/mem-fs/node_modules/replace-ext": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "@npmcli/package-json": "^7.0.0",
- "ci-info": "^4.0.0",
- "npm-package-arg": "^13.0.0",
- "npm-registry-fetch": "^19.0.0",
- "proc-log": "^5.0.0",
- "semver": "^7.3.7",
- "sigstore": "^4.0.0",
- "ssri": "^12.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">= 0.10"
}
},
- "node_modules/libnpmpublish/node_modules/hosted-git-info": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz",
- "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==",
+ "node_modules/mem-fs/node_modules/vinyl": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+ "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^11.1.0"
+ "clone": "^2.1.1",
+ "clone-buffer": "^1.0.0",
+ "clone-stats": "^1.0.0",
+ "cloneable-readable": "^1.0.0",
+ "remove-trailing-separator": "^1.0.1",
+ "replace-ext": "^1.0.0"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">= 0.10"
}
},
- "node_modules/libnpmpublish/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
+ "node_modules/memfs": {
+ "version": "4.80.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.80.0.tgz",
+ "integrity": "sha512-N70W2isi44XdGn7uPo9NJ4zRukcdkwSFHlnYx42SWOH/+hzqNc8P7+tVoA2up4z7faHvNi1RSNCFjxoYQ71VPQ==",
"dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/fs-core": "4.80.0",
+ "@jsonjoy.com/fs-fsa": "4.80.0",
+ "@jsonjoy.com/fs-node": "4.80.0",
+ "@jsonjoy.com/fs-node-builtins": "4.80.0",
+ "@jsonjoy.com/fs-node-to-fsa": "4.80.0",
+ "@jsonjoy.com/fs-node-utils": "4.80.0",
+ "@jsonjoy.com/fs-print": "4.80.0",
+ "@jsonjoy.com/fs-snapshot": "4.80.0",
+ "@jsonjoy.com/json-pack": "^1.11.0",
+ "@jsonjoy.com/util": "^1.9.0",
+ "glob-to-regex.js": "^1.3.1",
+ "thingies": "^2.5.0",
+ "tree-dump": "^1.0.3",
+ "tslib": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
}
},
- "node_modules/libnpmpublish/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
+ "node_modules/meow": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+ "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/libnpmpublish/node_modules/npm-package-arg/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
+ "node_modules/meow/node_modules/find-up": {
+ "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": "ISC",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": ">=8"
}
},
- "node_modules/libnpmpublish/node_modules/validate-npm-package-name": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz",
- "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==",
+ "node_modules/meow/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
+ "license": "ISC"
},
- "node_modules/liftoff": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.1.tgz",
- "integrity": "sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==",
+ "node_modules/meow/node_modules/locate-path": {
+ "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": {
- "extend": "^3.0.2",
- "findup-sync": "^5.0.0",
- "fined": "^2.0.0",
- "flagged-respawn": "^2.0.0",
- "is-plain-object": "^5.0.0",
- "rechoir": "^0.8.0",
- "resolve": "^1.20.0"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=8"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "license": "MIT"
- },
- "node_modules/lit": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz",
- "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==",
- "license": "BSD-3-Clause",
+ "node_modules/meow/node_modules/p-limit": {
+ "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": {
- "@lit/reactive-element": "^2.1.0",
- "lit-element": "^4.2.0",
- "lit-html": "^3.3.0"
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lit-element": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz",
- "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==",
- "license": "BSD-3-Clause",
+ "node_modules/meow/node_modules/p-locate": {
+ "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": {
- "@lit-labs/ssr-dom-shim": "^1.5.0",
- "@lit/reactive-element": "^2.1.0",
- "lit-html": "^3.3.0"
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/lit-html": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz",
- "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==",
- "license": "BSD-3-Clause",
+ "node_modules/meow/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/trusted-types": "^2.0.2"
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/load-json-file": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz",
- "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==",
+ "node_modules/meow/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.1.15",
- "parse-json": "^5.0.0",
- "strip-bom": "^4.0.0",
- "type-fest": "^0.6.0"
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
},
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/load-json-file/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=8"
}
},
- "node_modules/load-yaml-file": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz",
- "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==",
+ "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-2-Clause",
"dependencies": {
- "graceful-fs": "^4.1.5",
- "js-yaml": "^3.13.0",
- "pify": "^4.0.1",
- "strip-bom": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
}
},
- "node_modules/load-yaml-file/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/load-yaml-file/node_modules/js-yaml": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
- "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "node_modules/meow/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
+ "license": "ISC",
"bin": {
- "js-yaml": "bin/js-yaml.js"
+ "semver": "bin/semver"
}
},
- "node_modules/load-yaml-file/node_modules/pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
"dev": true,
- "license": "MIT",
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/load-yaml-file/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "node_modules/meow/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">=4"
+ "node": ">=10"
}
},
- "node_modules/loader-runner": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz",
- "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==",
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6.11.5"
- },
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
"engines": {
- "node": ">=8.9.0"
+ "node": ">= 8"
}
},
- "node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.6"
}
},
- "node_modules/lodash": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
- "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.assign": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
- "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==",
- "license": "MIT"
- },
- "node_modules/lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
- "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.ismatch": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
- "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "license": "MIT"
- },
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"license": "MIT",
"dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8.6"
}
},
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
+ "bin": {
+ "mime": "cli.js"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=4"
}
},
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 0.6"
}
},
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-func-name": "^2.0.1"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tslib": "^2.0.3"
+ "node": ">= 0.6"
}
},
- "node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=4"
}
},
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.10.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz",
+ "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "semver": "^6.0.0"
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 12.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
+ "license": "ISC"
},
- "node_modules/make-fetch-happen": {
- "version": "15.0.2",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.2.tgz",
- "integrity": "sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ==",
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
- "@npmcli/agent": "^4.0.0",
- "cacache": "^20.0.1",
- "http-cache-semantics": "^4.1.1",
- "minipass": "^7.0.2",
- "minipass-fetch": "^4.0.0",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^1.0.0",
- "proc-log": "^5.0.0",
- "promise-retry": "^2.0.1",
- "ssri": "^12.0.0"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": "^20.17.0 || >=22.9.0"
+ "node": "*"
}
},
- "node_modules/make-fetch-happen/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/make-fetch-happen/node_modules/minipass-fetch": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz",
- "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==",
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^1.0.3",
- "minizlib": "^3.0.1"
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
},
"engines": {
- "node": "^18.17.0 || >=20.5.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
+ "node": ">= 6"
}
},
- "node_modules/make-fetch-happen/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "node_modules/minimizer-webpack-plugin": {
+ "version": "5.13.0",
+ "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.13.0.tgz",
+ "integrity": "sha512-OO1NF2zHj6sf4CNv2AsUWYcS8WEwkVKQDXxxKzlOxx1Xl+WlqYtVC+oNlGNwGkLAOnpj277BSHypWwRtd9w4JQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "minipass": "^7.1.2"
+ "@jridgewell/trace-mapping": "^0.3.31",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.3",
+ "terser": "^5.51.0"
},
"engines": {
- "node": ">= 18"
- }
- },
- "node_modules/make-fetch-happen/node_modules/negotiator": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
- "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/map-obj": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
- "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node": ">= 10.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/map-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
- "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/marked": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz",
- "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==",
- "license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
},
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@minify-html/node": {
+ "optional": true
+ },
+ "@napi-rs/image": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/css": {
+ "optional": true
+ },
+ "@swc/html": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "cssnano": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "html-minifier-terser": {
+ "optional": true
+ },
+ "imagemin": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "sharp": {
+ "optional": true
+ },
+ "svgo": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
}
},
- "node_modules/mdn-data": {
- "version": "2.27.1",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
- "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 0.6"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/mem-fs": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-2.3.0.tgz",
- "integrity": "sha512-GftCCBs6EN8sz3BoWO1bCj8t7YBtT713d8bUgbhg9Iel5kFSqnSvCK06TYIDJAtJ51cSiWkM/YemlT0dfoFycw==",
+ "node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@types/node": "^15.6.2",
- "@types/vinyl": "^2.0.4",
- "vinyl": "^2.0.1",
- "vinyl-file": "^3.0.0"
+ "minipass": "^7.0.3"
},
"engines": {
- "node": ">=12"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/mem-fs-editor": {
- "version": "9.7.0",
- "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-9.7.0.tgz",
- "integrity": "sha512-ReB3YD24GNykmu4WeUL/FDIQtkoyGB6zfJv60yfCo3QjKeimNcTqv2FT83bP0ccs6uu+sm5zyoBlspAzigmsdg==",
+ "node_modules/minipass-fetch": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz",
+ "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "binaryextensions": "^4.16.0",
- "commondir": "^1.0.1",
- "deep-extend": "^0.6.0",
- "ejs": "^3.1.8",
- "globby": "^11.1.0",
- "isbinaryfile": "^5.0.0",
- "minimatch": "^7.2.0",
- "multimatch": "^5.0.0",
- "normalize-path": "^3.0.0",
- "textextensions": "^5.13.0"
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
},
"engines": {
- "node": ">=12.10.0"
- },
- "peerDependencies": {
- "mem-fs": "^2.1.0"
+ "node": "^18.17.0 || >=20.5.0"
},
- "peerDependenciesMeta": {
- "mem-fs": {
- "optional": true
- }
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "node_modules/mem-fs-editor/node_modules/brace-expansion": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
- "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
+ "node_modules/minipass-flush": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz",
+ "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/mem-fs-editor/node_modules/isbinaryfile": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
- "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 18.0.0"
+ "minipass": "^3.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/mem-fs-editor/node_modules/minimatch": {
- "version": "7.4.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.9.tgz",
- "integrity": "sha512-Brg/fp/iAVDOQoHxkuN5bEYhyQlZhxddI78yWsCbeEwTHXQjlNLtiJDUsp1GIptVqMI7/gkJMz4vVAc01mpoBw==",
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "brace-expansion": "^2.0.2"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/mem-fs/node_modules/@types/node": {
- "version": "15.14.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz",
- "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==",
+ "node_modules/minipass-flush/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
- "license": "MIT"
+ "license": "ISC"
},
- "node_modules/mem-fs/node_modules/replace-ext": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
- "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+ "node_modules/minipass-json-stream": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz",
+ "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==",
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.10"
+ "dependencies": {
+ "jsonparse": "^1.3.1",
+ "minipass": "^3.0.0"
}
},
- "node_modules/mem-fs/node_modules/vinyl": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
- "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
+ "node_modules/minipass-json-stream/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 0.10"
+ "node": ">=8"
}
},
- "node_modules/memfs": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
- "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
- "license": "Unlicense",
+ "node_modules/minipass-json-stream/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "fs-monkey": "^1.0.4"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">= 4.0.0"
+ "node": ">=8"
}
},
- "node_modules/meow": {
- "version": "8.1.2",
- "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
- "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@types/minimist": "^1.2.0",
- "camelcase-keys": "^6.2.2",
- "decamelize-keys": "^1.1.0",
- "hard-rejection": "^2.1.0",
- "minimist-options": "4.1.0",
- "normalize-package-data": "^3.0.0",
- "read-pkg-up": "^7.0.1",
- "redent": "^3.0.0",
- "trim-newlines": "^3.0.0",
- "type-fest": "^0.18.0",
- "yargs-parser": "^20.2.3"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/meow/node_modules/type-fest": {
- "version": "0.18.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
- "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "node_modules/minipass-pipeline/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "ISC"
},
- "node_modules/merge-descriptors": {
+ "node_modules/minipass-sized": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "license": "MIT"
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
"engines": {
- "node": ">= 8"
+ "node": ">=8"
}
},
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "license": "MIT",
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=8"
}
},
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "node_modules/minipass-sized/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=8.6"
+ "node": ">= 18"
}
},
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
"license": "MIT",
"bin": {
- "mime": "cli.js"
+ "mkdirp": "bin/cmd.js"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
+ "node": ">=10"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "license": "MIT",
+ "node_modules/mkdirp-infer-owner": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz",
+ "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "mime-db": "1.52.0"
+ "chownr": "^2.0.0",
+ "infer-owner": "^1.0.4",
+ "mkdirp": "^1.0.3"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=10"
}
},
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "node_modules/mkdirp-infer-owner/node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"engines": {
- "node": ">=6"
+ "node": ">=10"
}
},
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "node_modules/mocha": {
+ "version": "11.8.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.8.0.tgz",
+ "integrity": "sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^4.0.1",
+ "debug": "^4.3.5",
+ "diff": "^7.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^10.4.5",
+ "he": "^1.2.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^9.0.5",
+ "ms": "^2.1.3",
+ "picocolors": "^1.1.1",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^9.2.0",
+ "yargs": "^17.7.2",
+ "yargs-parser": "^21.1.1",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "node_modules/mocha/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
- "node_modules/mini-css-extract-plugin": {
- "version": "2.10.2",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz",
- "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==",
+ "node_modules/mocha/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "schema-utils": "^4.0.0",
- "tapable": "^2.2.1"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">=12"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "license": "ISC"
- },
- "node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "node_modules/mocha/node_modules/ansi-regex": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "node_modules/mocha/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/minimist-options": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
- "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "node_modules/mocha/node_modules/brace-expansion": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
+ "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0",
- "kind-of": "^6.0.3"
- },
- "engines": {
- "node": ">= 6"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/mocha/node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "readdirp": "^4.0.1"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
+ "node": ">= 14.16.0"
},
- "engines": {
- "node": ">= 8"
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/minipass-fetch": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
- "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
+ "node_modules/mocha/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
- "license": "MIT",
+ "license": "MIT"
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "10.5.0",
+ "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": {
- "minipass": "^3.1.6",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
},
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
- "optionalDependencies": {
- "encoding": "^0.1.13"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "node_modules/mocha/node_modules/jackspeak": {
+ "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": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "minipass": "^3.0.0"
+ "@isaacs/cliui": "^8.0.2"
},
- "engines": {
- "node": ">= 8"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
- "node_modules/minipass-json-stream": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz",
- "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==",
+ "node_modules/mocha/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "jsonparse": "^1.3.1",
- "minipass": "^3.0.0"
- }
+ "license": "ISC"
},
- "node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "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": {
- "minipass": "^3.0.0"
+ "brace-expansion": "^2.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/minipass-sized": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
- "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "node_modules/mocha/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "minipass": "^3.0.0"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "node_modules/mocha/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",
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
"engines": {
- "node": ">= 8"
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "node_modules/mocha/node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "randombytes": "^2.1.0"
}
},
- "node_modules/mkdirp-infer-owner": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz",
- "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==",
+ "node_modules/mocha/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": "ISC",
+ "license": "MIT",
"dependencies": {
- "chownr": "^2.0.0",
- "infer-owner": "^1.0.4",
- "mkdirp": "^1.0.3"
+ "ansi-regex": "^6.2.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/mkdirp-infer-owner/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "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",
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "dependencies": {
+ "has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/mocha": {
- "version": "11.7.6",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz",
- "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==",
+ "node_modules/mocha/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "browser-stdout": "^1.3.1",
- "chokidar": "^4.0.1",
- "debug": "^4.3.5",
- "diff": "^7.0.0",
- "escape-string-regexp": "^4.0.0",
- "find-up": "^5.0.0",
- "glob": "^10.4.5",
- "he": "^1.2.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "log-symbols": "^4.1.0",
- "minimatch": "^9.0.5",
- "ms": "^2.1.3",
- "picocolors": "^1.1.1",
- "serialize-javascript": "^6.0.2",
- "strip-json-comments": "^3.1.1",
- "supports-color": "^8.1.1",
- "workerpool": "^9.2.0",
- "yargs": "^17.7.2",
- "yargs-parser": "^21.1.1",
- "yargs-unparser": "^2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/mocha/node_modules/brace-expansion": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
- "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/mocha/node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "node_modules/mocha/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "readdirp": "^4.0.1"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">= 14.16.0"
+ "node": ">=12"
},
"funding": {
- "url": "https://paulmillr.com/funding/"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mocha/node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "license": "ISC",
+ "node_modules/mocha/node_modules/yargs": {
+ "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": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
- "node_modules/mocha/node_modules/diff": {
- "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"
- }
- },
- "node_modules/mocha/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/node_modules/glob": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
- "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mocha/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.2"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/mocha/node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mocha/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/node_modules/p-locate": {
- "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==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/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==",
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/mocha/node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "license": "MIT",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/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==",
- "license": "ISC",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/modify-values": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
- "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
- "dev": true,
- "license": "MIT",
+ "node_modules/modify-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/monaco-editor": {
- "version": "0.57.0",
- "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.57.0.tgz",
- "integrity": "sha512-5BkI9KGoqrNvBGUe15/QlZq3OooZ8WLg1AxTpaqHRCP3HNpzPPZKE2EDz8M7c+VRmCeUw1Brp4cx/PWm3kI/5A==",
- "license": "MIT",
- "dependencies": {
- "dompurify": "3.4.15",
- "marked": "14.0.0"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -15197,6 +12877,7 @@
"version": "7.2.5",
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
"integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"dns-packet": "^5.2.2",
@@ -15247,16 +12928,19 @@
}
},
"node_modules/mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
"dev": true,
- "license": "ISC"
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
"node_modules/nanoid": {
- "version": "3.3.19",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
- "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
+ "version": "3.3.20",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz",
+ "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==",
"dev": true,
"funding": [
{
@@ -15275,48 +12959,33 @@
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true,
"license": "MIT"
},
"node_modules/negotiator": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
- "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz",
+ "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "content-type": "^2.1.0"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "license": "MIT"
- },
- "node_modules/nise": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz",
- "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==",
"dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@sinonjs/commons": "^1.7.0",
- "@sinonjs/fake-timers": "^6.0.0",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "path-to-regexp": "^1.7.0"
- }
- },
- "node_modules/nise/node_modules/@sinonjs/fake-timers": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
- "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "@sinonjs/commons": "^1.7.0"
- }
+ "license": "MIT"
},
"node_modules/no-case": {
"version": "3.0.4",
@@ -15329,53 +12998,31 @@
"tslib": "^2.0.3"
}
},
- "node_modules/node-abort-controller": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
- "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
- "license": "MIT"
- },
"node_modules/node-addon-api": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
"license": "MIT"
},
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=10.5.0"
- }
- },
"node_modules/node-fetch": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
- "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "whatwg-url": "^5.0.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": "4.x || >=6.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
}
},
"node_modules/node-gyp": {
@@ -15413,16 +13060,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/node-gyp/node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/node-gyp/node_modules/isexe": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
@@ -15433,33 +13070,10 @@
"node": ">=20"
}
},
- "node_modules/node-gyp/node_modules/minipass": {
- "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"
- }
- },
- "node_modules/node-gyp/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
- "node_modules/node-gyp/node_modules/nopt": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
- "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
+ "node_modules/node-gyp/node_modules/nopt": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -15482,23 +13096,6 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/node-gyp/node_modules/tar": {
- "version": "7.5.16",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz",
- "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/node-gyp/node_modules/which": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
@@ -15515,20 +13112,11 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/node-gyp/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/node-releases": {
- "version": "2.0.57",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.57.tgz",
- "integrity": "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==",
+ "version": "2.0.58",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.58.tgz",
+ "integrity": "sha512-BdiKAgbfRlvfMq/XzO/AF9NPmaA8a+YpLAyAFTVFBj3gARrAIfWvNq7Q7NE4se3KgFu0KkrvQMxTS0XVnsGzHg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -15550,16 +13138,6 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/nopt/node_modules/abbrev": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz",
- "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/normalize-package-data": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
@@ -15576,26 +13154,47 @@
"node": ">=10"
}
},
+ "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
"node_modules/now-and-later": {
@@ -15648,18 +13247,19 @@
}
},
"node_modules/npm-package-arg": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
- "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.1.tgz",
+ "integrity": "sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==",
"dev": true,
"license": "ISC",
"dependencies": {
- "hosted-git-info": "^4.0.1",
- "semver": "^7.3.4",
- "validate-npm-package-name": "^3.0.0"
+ "hosted-git-info": "^9.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/npm-packlist": {
@@ -15686,126 +13286,65 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/npm-registry-fetch": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.0.tgz",
- "integrity": "sha512-xyZLfs7TxPu/WKjHUs0jZOPinzBAI32kEUel6za0vH+JUTnFZ5zbHI1ZoGZRDm6oMjADtrli6FxtMlk/5ABPNw==",
+ "node_modules/npm-pick-manifest": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz",
+ "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==",
"dev": true,
"license": "ISC",
"dependencies": {
- "@npmcli/redact": "^3.0.0",
- "jsonparse": "^1.3.1",
- "make-fetch-happen": "^15.0.0",
- "minipass": "^7.0.2",
- "minipass-fetch": "^4.0.0",
- "minizlib": "^3.0.1",
+ "npm-install-checks": "^8.0.0",
+ "npm-normalize-package-bin": "^5.0.0",
"npm-package-arg": "^13.0.0",
- "proc-log": "^5.0.0"
+ "semver": "^7.3.5"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/npm-registry-fetch/node_modules/hosted-git-info": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
- "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==",
+ "node_modules/npm-pick-manifest/node_modules/npm-install-checks": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz",
+ "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==",
"dev": true,
- "license": "ISC",
+ "license": "BSD-2-Clause",
"dependencies": {
- "lru-cache": "^11.1.0"
+ "semver": "^7.1.1"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/npm-registry-fetch/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/npm-registry-fetch/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz",
+ "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==",
"dev": true,
"license": "ISC",
"engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/npm-registry-fetch/node_modules/minipass-fetch": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz",
- "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^1.0.3",
- "minizlib": "^3.0.1"
- },
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/npm-registry-fetch/node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/npm-registry-fetch/node_modules/npm-package-arg": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.2.tgz",
- "integrity": "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==",
+ "node_modules/npm-registry-fetch": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.0.tgz",
+ "integrity": "sha512-xyZLfs7TxPu/WKjHUs0jZOPinzBAI32kEUel6za0vH+JUTnFZ5zbHI1ZoGZRDm6oMjADtrli6FxtMlk/5ABPNw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "hosted-git-info": "^9.0.0",
- "proc-log": "^6.0.0",
- "semver": "^7.3.5",
- "validate-npm-package-name": "^7.0.0"
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^15.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^13.0.0",
+ "proc-log": "^5.0.0"
},
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/npm-registry-fetch/node_modules/npm-package-arg/node_modules/proc-log": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
- "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
- "node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.1.tgz",
- "integrity": "sha512-BM0Upcemlce8/9+HE+/VpWqn3u3mYh6Om/FEC8yPMnEHwf710fW5Q6fhjT1SQyRlZD1G9CJbgfH+rWgAcIvjlQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^20.17.0 || >=22.9.0"
- }
- },
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -15820,19 +13359,17 @@
}
},
"node_modules/npmlog": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
- "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
"dependencies": {
- "are-we-there-yet": "^3.0.0",
+ "are-we-there-yet": "^2.0.0",
"console-control-strings": "^1.1.0",
- "gauge": "^4.0.3",
+ "gauge": "^3.0.0",
"set-blocking": "^2.0.0"
- },
- "engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/nth-check": {
@@ -16010,20 +13547,17 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
- "node_modules/nx/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/nx/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "debug": "4"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 6.0.0"
}
},
"node_modules/nx/node_modules/balanced-match": {
@@ -16049,72 +13583,49 @@
"node": "20 || >=22"
}
},
- "node_modules/nx/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/nx/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": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=0.8.0"
}
},
- "node_modules/nx/node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/nx/node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "node_modules/nx/node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
"license": "MIT",
"engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/nx/node_modules/ejs": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.1.tgz",
- "integrity": "sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "ejs": "bin/cli.js"
+ "node": ">=4.0"
},
- "engines": {
- "node": ">=0.12.18"
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/nx/node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "node_modules/nx/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0"
+ "agent-base": "6",
+ "debug": "4"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 6"
}
},
"node_modules/nx/node_modules/ignore": {
@@ -16127,16 +13638,6 @@
"node": ">= 4"
}
},
- "node_modules/nx/node_modules/lines-and-columns": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz",
- "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
"node_modules/nx/node_modules/minimatch": {
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
@@ -16153,62 +13654,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/nx/node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nx/node_modules/ora": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz",
- "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bl": "^4.0.3",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "log-symbols": "^4.0.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nx/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/nx/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -16243,16 +13688,6 @@
"node": ">=10"
}
},
- "node_modules/nx/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/nx/node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -16263,33 +13698,22 @@
"node": ">=4"
}
},
- "node_modules/nx/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/nx/node_modules/wrap-ansi": {
+ "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": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/nx/node_modules/yaml": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
- "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">= 14.6"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/eemeli"
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/nx/node_modules/yargs": {
@@ -16311,20 +13735,10 @@
"node": ">=12"
}
},
- "node_modules/nx/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/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -16341,6 +13755,7 @@
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -16382,12 +13797,14 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
@@ -16400,6 +13817,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
"integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -16408,7 +13826,7 @@
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -16431,6 +13849,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
@@ -16442,37 +13878,36 @@
}
},
"node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/ora": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz",
+ "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bl": "^4.1.0",
+ "bl": "^4.0.3",
"chalk": "^4.1.0",
"cli-cursor": "^3.1.0",
"cli-spinners": "^2.5.0",
"is-interactive": "^1.0.0",
- "is-unicode-supported": "^0.1.0",
- "log-symbols": "^4.1.0",
+ "log-symbols": "^4.0.0",
"strip-ansi": "^6.0.0",
"wcwidth": "^1.0.1"
},
@@ -16483,62 +13918,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ora/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ora/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/ora/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -16550,30 +13929,35 @@
}
},
"node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "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": {
- "p-try": "^2.0.0"
+ "yocto-queue": "^0.1.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "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": "^2.2.0"
+ "p-limit": "^3.0.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-map": {
@@ -16646,6 +14030,7 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
"integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/retry": "0.12.2",
@@ -16663,6 +14048,7 @@
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
"integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -16699,6 +14085,7 @@
"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"
@@ -16720,30 +14107,165 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/package-json": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-7.0.0.tgz",
- "integrity": "sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==",
+ "node_modules/package-json-from-dist": {
+ "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": "MIT",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/pacote": {
+ "version": "21.0.1",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.1.tgz",
+ "integrity": "sha512-LHGIUQUrcDIJUej53KJz1BPvUuHrItrR2yrnN0Kl9657cJ0ZT6QJHk9wWPBnQZhYT5KLyZWrk9jaYc2aKDu4yw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^7.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^10.0.0",
+ "cacache": "^20.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^13.0.0",
+ "npm-packlist": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^4.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/pacote/node_modules/@npmcli/git": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz",
+ "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/pacote/node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz",
+ "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/pacote/node_modules/hosted-git-info": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.1.0.tgz",
+ "integrity": "sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/pacote/node_modules/ini": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
+ "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/pacote/node_modules/isexe": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
+ "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/pacote/node_modules/lru-cache": {
+ "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/pacote/node_modules/npm-pick-manifest": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz",
+ "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "got": "^11.8.2",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
"semver": "^7.3.5"
},
"engines": {
- "node": ">=12"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/pacote/node_modules/npm-pick-manifest/node_modules/npm-package-arg": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz",
+ "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/package-json-from-dist": {
- "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==",
- "license": "BlueOak-1.0.0"
+ "node_modules/pacote/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
"node_modules/param-case": {
"version": "3.0.4",
@@ -16760,6 +14282,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
@@ -16822,6 +14345,7 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
@@ -16836,6 +14360,20 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse-json/node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
@@ -16873,23 +14411,11 @@
"parse-path": "^7.0.0"
}
},
- "node_modules/parse5": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz",
- "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "entities": "^8.0.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -16910,6 +14436,7 @@
"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"
@@ -16918,7 +14445,7 @@
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -16929,6 +14456,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -16938,6 +14466,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/path-root": {
@@ -16964,50 +14493,26 @@
}
},
"node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "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": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=16 || 14 >=14.18"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "license": "ISC"
- },
- "node_modules/path-scurry/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
"node_modules/path-to-regexp": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz",
- "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "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==",
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
"dev": true,
"license": "MIT"
},
@@ -17015,31 +14520,24 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=8"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -17062,6 +14560,7 @@
"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"
@@ -17070,53 +14569,102 @@
"node": ">=8"
}
},
- "node_modules/pkijs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz",
- "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==",
- "license": "BSD-3-Clause",
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "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": {
- "@noble/hashes": "1.4.0",
- "asn1js": "^3.0.6",
- "bytestreamjs": "^2.0.1",
- "pvtsutils": "^1.3.6",
- "pvutils": "^1.1.3",
- "tslib": "^2.8.1"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=8"
}
},
- "node_modules/portfinder": {
- "version": "1.0.32",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz",
- "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==",
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "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": {
- "async": "^2.6.4",
- "debug": "^3.2.7",
- "mkdirp": "^0.5.6"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">= 0.12.0"
+ "node": ">=8"
}
},
- "node_modules/portfinder/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "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": {
- "ms": "^2.1.1"
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/postcss": {
- "version": "8.5.28",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
- "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
- "dev": true,
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkijs": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.1.tgz",
+ "integrity": "sha512-Oo/NZcSWccq8KyoG7gLE9fnltgHns+pNCjCAp/WmjsUySi+sX7y4z4Xqu4fVb42CDHzRPl33fjzT15V1wvcyhA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "workspaces": [
+ "website"
+ ],
+ "dependencies": {
+ "@noble/hashes": "1.8.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/portfinder": {
+ "version": "1.0.38",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz",
+ "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^3.2.6",
+ "debug": "^4.3.6"
+ },
+ "engines": {
+ "node": ">= 10.12"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.30",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.30.tgz",
+ "integrity": "sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -17133,9 +14681,9 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.18",
+ "nanoid": "^3.3.20",
"picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
+ "source-map-js": "^1.2.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
@@ -17241,71 +14789,6 @@
"node": ">=10"
}
},
- "node_modules/preferred-pm/node_modules/find-up": {
- "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",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/preferred-pm/node_modules/locate-path": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/preferred-pm/node_modules/p-limit": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/preferred-pm/node_modules/p-locate": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -17317,9 +14800,9 @@
}
},
"node_modules/prettier": {
- "version": "3.8.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz",
- "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==",
+ "version": "3.9.10",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz",
+ "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==",
"dev": true,
"license": "MIT",
"bin": {
@@ -17357,16 +14840,16 @@
}
},
"node_modules/pretty-format": {
- "version": "30.4.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz",
- "integrity": "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==",
+ "version": "30.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.5.1.tgz",
+ "integrity": "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jest/schemas": "30.4.1",
- "ansi-styles": "^5.2.0",
- "react-is-18": "npm:react-is@^18.3.1",
- "react-is-19": "npm:react-is@^19.2.5"
+ "@jest/react-is-18": "npm:react-is@^18.3.1",
+ "@jest/react-is-19": "npm:react-is@^19.2.5",
+ "@jest/schemas": "30.5.0",
+ "ansi-styles": "^5.2.0"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
@@ -17409,6 +14892,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
"license": "MIT"
},
"node_modules/proggy": {
@@ -17483,9 +14967,10 @@
"license": "MIT"
},
"node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz",
+ "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"forwarded": "0.2.0",
@@ -17493,12 +14978,17 @@
},
"engines": {
"node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/proxy-addr/node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
@@ -17514,21 +15004,11 @@
"node": ">=10"
}
},
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -17538,24 +15018,47 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
"integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.8.1"
}
},
"node_modules/pvutils": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
- "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz",
+ "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=16.0.0"
}
},
+ "node_modules/qified": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz",
+ "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hookified": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/qified/node_modules/hookified": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz",
+ "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/qs": {
"version": "6.16.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz",
"integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"es-define-property": "^1.0.1",
@@ -17603,6 +15106,7 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.1.0"
@@ -17612,6 +15116,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -17621,6 +15126,7 @@
"version": "2.5.3",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
"integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"bytes": "~3.1.2",
@@ -17636,6 +15142,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
@@ -17644,48 +15151,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dev": true,
- "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/rc/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-is-18": {
- "name": "react-is",
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/react-is-19": {
- "name": "react-is",
- "version": "19.2.7",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz",
- "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/read": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/read/-/read-4.1.0.tgz",
@@ -17713,6 +15178,7 @@
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz",
"integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==",
+ "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -17739,6 +15205,13 @@
"node": ">=10"
}
},
+ "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/read-package-json-fast/node_modules/npm-normalize-package-bin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
@@ -17746,6 +15219,50 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/read-package-json/node_modules/@isaacs/cliui": {
+ "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",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/read-package-json/node_modules/ansi-regex": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/read-package-json/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/read-package-json/node_modules/brace-expansion": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
@@ -17756,10 +15273,18 @@
"balanced-match": "^1.0.0"
}
},
+ "node_modules/read-package-json/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/read-package-json/node_modules/glob": {
"version": "10.5.0",
"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": {
@@ -17790,6 +15315,22 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/read-package-json/node_modules/jackspeak": {
+ "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"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/read-package-json/node_modules/json-parse-even-better-errors": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
@@ -17826,16 +15367,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/read-package-json/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
"node_modules/read-package-json/node_modules/normalize-package-data": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz",
@@ -17862,103 +15393,182 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "node_modules/read-package-json/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/read-package-json/node_modules/path-scurry/node_modules/lru-cache": {
+ "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/read-package-json/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/read-pkg-up/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "node_modules/read-package-json/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": "ISC"
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
},
- "node_modules/read-pkg-up/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "node_modules/read-package-json/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/read-pkg-up/node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "node_modules/read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "node_modules/read-pkg-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
+ "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/read-pkg-up/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
"dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/read-pkg-up/node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "node_modules/read-pkg-up/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
"node_modules/read-pkg/node_modules/hosted-git-info": {
@@ -18054,35 +15664,26 @@
"node": ">=4"
}
},
- "node_modules/read/node_modules/mute-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
- "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^18.17.0 || >=20.5.0"
- }
- },
"node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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": {
- "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"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
"node_modules/readdir-scoped-modules": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
"integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
+ "deprecated": "This functionality has been moved to @npmcli/fs",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -18096,6 +15697,7 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
@@ -18108,6 +15710,7 @@
"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"
@@ -18134,33 +15737,8 @@
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
- "license": "Apache-2.0"
- },
- "node_modules/registry-auth-token": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz",
- "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "rc": "1.2.8"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=8"
- }
+ "license": "Apache-2.0"
},
"node_modules/relateurl": {
"version": "0.2.7",
@@ -18216,7 +15794,8 @@
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -18226,6 +15805,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -18235,6 +15815,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/reserved-identifiers": {
@@ -18251,33 +15832,32 @@
}
},
"node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.13",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.13.tgz",
+ "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "is-core-module": "^2.9.0",
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.17.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/resolve-cwd": {
"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"
@@ -18290,6 +15870,7 @@
"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"
@@ -18309,71 +15890,27 @@
"node": ">=0.10.0"
}
},
- "node_modules/resolve-dir/node_modules/global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=4"
}
},
- "node_modules/resolve-dir/node_modules/global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
+ "node_modules/resolve-options": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz",
+ "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
+ "value-or-function": "^4.0.0"
},
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve-dir/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/resolve-options": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz",
- "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "value-or-function": "^4.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
+ "node": ">= 10.13.0"
}
},
"node_modules/resolve.exports": {
@@ -18386,19 +15923,6 @@
"node": ">=10"
}
},
- "node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -18424,9 +15948,9 @@
}
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -18438,6 +15962,7 @@
"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",
@@ -18453,97 +15978,11 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rimraf/node_modules/balanced-match": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
- "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
- "license": "MIT",
- "engines": {
- "node": "18 || 20 || >=22"
- }
- },
- "node_modules/rimraf/node_modules/brace-expansion": {
- "version": "5.0.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz",
- "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^4.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/rimraf/node_modules/glob": {
- "version": "13.0.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
- "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.2.2",
- "minipass": "^7.1.3",
- "path-scurry": "^2.0.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/lru-cache": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
- "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/rimraf/node_modules/minimatch": {
- "version": "10.2.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz",
- "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "brace-expansion": "^5.0.8"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/rimraf/node_modules/path-scurry": {
- "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==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "lru-cache": "^11.0.0",
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": "18 || 20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/run-applescript": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
- "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -18553,9 +15992,9 @@
}
},
"node_modules/run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz",
+ "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -18600,12 +16039,14 @@
"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/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/sample-app": {
@@ -18616,28 +16057,16 @@
"resolved": "examples/sample-app-ts",
"link": true
},
- "node_modules/saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "xmlchars": "^2.2.0"
- },
- "engines": {
- "node": ">=v12.22.7"
- }
- },
"node_modules/schema-utils": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
- "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz",
+ "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^8.20.0",
+ "ajv-formats": "^3.0.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
@@ -18669,12 +16098,14 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
"integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/selfsigned": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz",
"integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@peculiar/x509": "^1.14.2",
@@ -18685,9 +16116,10 @@
}
},
"node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -18713,6 +16145,7 @@
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
"integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
@@ -18737,6 +16170,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -18746,48 +16180,47 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/send/node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.2.tgz",
+ "integrity": "sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==",
+ "dev": true,
"license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
+ "engines": {
+ "node": ">=20.0.0"
}
},
"node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz",
+ "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "accepts": "~1.3.4",
+ "accepts": "~1.3.8",
"batch": "0.6.1",
"debug": "2.6.9",
"escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
+ "http-errors": "~1.8.0",
+ "mime-types": "~2.1.35",
+ "parseurl": "~1.3.3"
},
"engines": {
"node": ">= 0.8.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/serve-index/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -18797,48 +16230,51 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "license": "ISC"
- },
"node_modules/serve-index/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "license": "ISC"
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
"node_modules/serve-static": {
"version": "1.16.3",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
"integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"encodeurl": "~2.0.0",
@@ -18861,12 +16297,14 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
"license": "ISC"
},
"node_modules/shallow-clone": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"kind-of": "^6.0.2"
@@ -18879,6 +16317,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -18891,15 +16330,17 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/shell-quote": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz",
- "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==",
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz",
+ "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -18926,6 +16367,28 @@
"node": ">=4"
}
},
+ "node_modules/shelljs/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/shelljs/node_modules/interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
@@ -18979,6 +16442,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
"integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -18998,6 +16462,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
"integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
@@ -19014,6 +16479,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -19032,6 +16498,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
@@ -19077,9 +16544,10 @@
"link": true
},
"node_modules/sinon": {
- "version": "22.0.0",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-22.0.0.tgz",
- "integrity": "sha512-sq/6DpdXOrLyfbKlXLg/Usc7xu8YXPeLkOFZRvA3bNUSA2lhbrZ06yuXbH1fkzBPCbz9O10+7hznzUsjaYNm0Q==",
+ "version": "22.1.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-22.1.0.tgz",
+ "integrity": "sha512-n1ajF2rBWMTtEwbKcw4UdFg4nCnDdq/U6RDoxtOd7oapOlRoJ5ynwFx60owROyhDpA9QhMZi0pCO/xtmwFjG7w==",
+ "dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.1",
@@ -19092,33 +16560,16 @@
"url": "https://opencollective.com/sinon"
}
},
- "node_modules/sinon/node_modules/@sinonjs/commons": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "type-detect": "4.0.8"
- }
- },
"node_modules/sinon/node_modules/diff": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz",
"integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==",
+ "dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
}
},
- "node_modules/sinon/node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -19212,6 +16663,7 @@
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
"integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"faye-websocket": "^0.11.3",
@@ -19219,23 +16671,14 @@
"websocket-driver": "^0.7.4"
}
},
- "node_modules/sockjs/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "license": "MIT",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/socks": {
- "version": "2.8.7",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
- "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "version": "2.8.10",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz",
+ "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ip-address": "^10.0.1",
+ "ip-address": "^10.1.1",
"smart-buffer": "^4.2.0"
},
"engines": {
@@ -19244,33 +16687,61 @@
}
},
"node_modules/socks-proxy-agent": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
- "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "agent-base": "^6.0.2",
- "debug": "^4.3.3",
- "socks": "^2.6.2"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
},
"engines": {
- "node": ">= 10"
+ "node": ">= 14"
+ }
+ },
+ "node_modules/sort-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz",
+ "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/sort-keys/node_modules/is-plain-obj": {
+ "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/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
"license": "BSD-3-Clause",
"engines": {
- "node": ">= 8"
+ "node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==",
+ "dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -19280,6 +16751,7 @@
"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",
@@ -19296,25 +16768,30 @@
"webpack": "^5.72.1"
}
},
+ "node_modules/source-map-loader/node_modules/iconv-lite": {
+ "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"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/sparkles": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz",
@@ -19325,40 +16802,39 @@
"node": ">= 10.13.0"
}
},
- "node_modules/spdx-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz",
- "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==",
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "array-find-index": "^1.0.2",
"spdx-expression-parse": "^3.0.0",
- "spdx-ranges": "^2.0.0"
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"dependencies": {
- "spdx-expression-parse": "^3.0.0",
+ "spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
}
},
"node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
"dev": true,
"license": "CC-BY-3.0"
},
"node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz",
+ "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -19367,35 +16843,17 @@
}
},
"node_modules/spdx-license-ids": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
- "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==",
+ "version": "3.0.24",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.24.tgz",
+ "integrity": "sha512-cLS9TtWkIQFyLkJ3/5aFQAOHOSKTlOs/7WDut/XPSdjom1fJhUdkepeJAKXa9Y05+FabHd0sti+Et559vDtkpQ==",
"dev": true,
"license": "CC0-1.0"
},
- "node_modules/spdx-ranges": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz",
- "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==",
- "dev": true,
- "license": "(MIT AND CC-BY-3.0)"
- },
- "node_modules/spdx-satisfies": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz",
- "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-compare": "^1.0.0",
- "spdx-expression-parse": "^3.0.0",
- "spdx-ranges": "^2.0.0"
- }
- },
"node_modules/spdy": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
"integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
@@ -19412,6 +16870,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
"integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
@@ -19422,20 +16881,6 @@
"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/split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
@@ -19459,21 +16904,6 @@
"readable-stream": "^3.0.0"
}
},
- "node_modules/split2/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/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -19494,23 +16924,14 @@
"node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/ssri/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
"node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/stream-composer": {
@@ -19531,9 +16952,9 @@
"license": "MIT"
},
"node_modules/streamx": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz",
- "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==",
+ "version": "2.28.1",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz",
+ "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -19543,18 +16964,41 @@
}
},
"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==",
+ "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.1.0"
+ "safe-buffer": "~5.2.0"
}
},
+ "node_modules/string_decoder/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/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",
@@ -19570,6 +17014,7 @@
"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",
@@ -19584,6 +17029,7 @@
"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"
@@ -19597,6 +17043,7 @@
"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"
@@ -19682,6 +17129,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -19703,6 +17151,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/strip-outer/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/style-loader": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz",
@@ -19721,24 +17179,23 @@
}
},
"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==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "node": ">=8"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -19768,17 +17225,11 @@
"semver": "bin/semver.js"
}
},
- "node_modules/symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tapable": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
"integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -19789,21 +17240,20 @@
}
},
"node_modules/tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "version": "7.5.11",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz",
+ "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/tar-stream": {
@@ -19823,58 +17273,21 @@
"node": ">=6"
}
},
- "node_modules/tar-stream/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==",
+ "node_modules/teex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
+ "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "streamx": "^2.12.5"
}
},
- "node_modules/tar/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "node_modules/terser": {
+ "version": "5.51.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz",
+ "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tar/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/teex": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
- "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "streamx": "^2.12.5"
- }
- },
- "node_modules/terser": {
- "version": "5.44.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz",
- "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -19889,70 +17302,11 @@
"node": ">=10"
}
},
- "node_modules/terser-webpack-plugin": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz",
- "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.25",
- "jest-worker": "^27.4.5",
- "schema-utils": "^4.3.0",
- "terser": "^5.31.1"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@minify-html/node": {
- "optional": true
- },
- "@swc/core": {
- "optional": true
- },
- "@swc/css": {
- "optional": true
- },
- "@swc/html": {
- "optional": true
- },
- "clean-css": {
- "optional": true
- },
- "cssnano": {
- "optional": true
- },
- "csso": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "html-minifier-terser": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "postcss": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/text-decoder": {
@@ -19978,7 +17332,7 @@
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true,
"license": "MIT"
},
@@ -19996,9 +17350,10 @@
}
},
"node_modules/thingies": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz",
- "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.1.tgz",
+ "integrity": "sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10.18"
@@ -20028,36 +17383,22 @@
"readable-stream": "3"
}
},
- "node_modules/through2/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/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
- "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fdir": "^6.4.3",
- "picomatch": "^4.0.2"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
},
"engines": {
"node": ">=12.0.0"
@@ -20079,26 +17420,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/tldts": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.3.tgz",
- "integrity": "sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tldts-core": "^7.4.3"
- },
- "bin": {
- "tldts": "bin/cli.js"
- }
- },
- "node_modules/tldts-core": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.3.tgz",
- "integrity": "sha512-27ep5H9PzdBrNd5OFM/j3WCU8F3kPwM9D0BOaOf7uYfxMJfyr0K5Tjj69Gri+sZlh2WXd5buIm47NuPF29CDiw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/tmp": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
@@ -20113,6 +17434,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
@@ -20155,41 +17477,24 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.6"
}
},
- "node_modules/tough-cookie": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz",
- "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tldts": "^7.0.5"
- },
- "engines": {
- "node": ">=16"
- }
- },
"node_modules/tr46": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz",
- "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==",
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.3.1"
- },
- "engines": {
- "node": ">=20"
- }
+ "license": "MIT"
},
"node_modules/tree-dump": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz",
- "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz",
+ "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==",
+ "dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=10.0"
@@ -20235,7 +17540,7 @@
"node_modules/trim-repeated": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -20245,6 +17550,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/trim-repeated/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/ts-api-utils": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
@@ -20259,15 +17574,14 @@
}
},
"node_modules/ts-loader": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.1.tgz",
- "integrity": "sha512-8FMHnmxtpncUAu0ZjkqpXnOTlwc9eY95esH8WVN94guTPPdkg2ofVdiVM5j8L2lmjiGerXd56zXb/D2JyVQPLg==",
+ "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",
- "enhanced-resolve": "^5.0.0",
- "micromatch": "^4.0.0",
- "semver": "^7.3.4",
+ "picomatch": "^4.0.0",
"source-map": "^0.7.4"
},
"engines": {
@@ -20284,47 +17598,27 @@
}
}
},
- "node_modules/ts-loader/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ts-loader/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/ts-loader/node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/ts-loader/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "node_modules/ts-loader/node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=8"
+ "node": ">= 12"
}
},
"node_modules/tsconfig-paths": {
@@ -20362,6 +17656,7 @@
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz",
"integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^1.9.3"
@@ -20374,6 +17669,7 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
"license": "0BSD"
},
"node_modules/tuf-js": {
@@ -20405,18 +17701,30 @@
}
},
"node_modules/type-detect": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
- "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
+ "node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
@@ -20518,9 +17826,9 @@
}
},
"node_modules/undici-types": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz",
- "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==",
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz",
+ "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==",
"license": "MIT"
},
"node_modules/union": {
@@ -20536,29 +17844,23 @@
}
},
"node_modules/unique-filename": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
- "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
"dev": true,
"license": "ISC",
"dependencies": {
- "unique-slug": "^4.0.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "unique-slug": "^2.0.0"
}
},
"node_modules/unique-slug": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
- "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
"dev": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
"node_modules/universal-user-agent": {
@@ -20572,6 +17874,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
@@ -20580,6 +17884,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -20607,9 +17912,10 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz",
- "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz",
+ "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==",
+ "dev": true,
"funding": [
{
"type": "opencollective",
@@ -20640,6 +17946,7 @@
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
@@ -20655,7 +17962,8 @@
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
"license": "MIT"
},
"node_modules/utila": {
@@ -20669,11 +17977,23 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8flags": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz",
@@ -20695,15 +18015,26 @@
"spdx-expression-parse": "^3.0.0"
}
},
- "node_modules/validate-npm-package-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
- "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
+ "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "builtins": "^1.0.3"
- }
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-name": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz",
+ "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
"node_modules/value-or-function": {
"version": "4.0.0",
@@ -20724,6 +18055,19 @@
"node": ">= 0.8"
}
},
+ "node_modules/verkit": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz",
+ "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
"node_modules/vinyl": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz",
@@ -20791,21 +18135,6 @@
"ieee754": "^1.2.1"
}
},
- "node_modules/vinyl-contents/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/vinyl-file": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz",
@@ -20823,6 +18152,16 @@
"node": ">=4"
}
},
+ "node_modules/vinyl-file/node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/vinyl-file/node_modules/replace-ext": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
@@ -20877,6 +18216,19 @@
"node": ">=10.13.0"
}
},
+ "node_modules/vinyl-fs/node_modules/iconv-lite": {
+ "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"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/vinyl-sourcemap": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz",
@@ -20895,24 +18247,14 @@
"node": ">=10.13.0"
}
},
- "node_modules/vinyl-sourcemap/node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/w3c-xmlserializer": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
- "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
+ "node_modules/vinyl/node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "xml-name-validator": "^5.0.0"
- },
"engines": {
- "node": ">=18"
+ "node": ">=0.8"
}
},
"node_modules/walk-up-path": {
@@ -20926,9 +18268,10 @@
}
},
"node_modules/watchpack": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz",
- "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.6.1.tgz",
+ "integrity": "sha512-8mk/LnXpQAiM2xKZhTkxikwly5GhL2Z+DWiLTkMa/E1Nfv9zURhHgiFyWvM4BWqW+LjIgL2AIS7JntEUx6v3vQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.1.2"
@@ -20941,6 +18284,7 @@
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
"integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"minimalistic-assert": "^1.0.0"
@@ -20956,29 +18300,18 @@
"defaults": "^1.0.3"
}
},
- "node_modules/web-streams-polyfill": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
- "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/webidl-conversions": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz",
- "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=20"
- }
+ "license": "BSD-2-Clause"
},
"node_modules/webpack": {
- "version": "5.107.2",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz",
- "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==",
+ "version": "5.111.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.111.1.tgz",
+ "integrity": "sha512-cNypaz0RP+S4cvQVi1M/3bRUkvNP0xZpL0TjFx+c6jg64VbxD+2weWDgY9UnjRI6dhZgtaj8DU76GGFcJ79xPQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.8",
@@ -20986,24 +18319,18 @@
"@webassemblyjs/ast": "^1.14.1",
"@webassemblyjs/wasm-edit": "^1.14.1",
"@webassemblyjs/wasm-parser": "^1.14.1",
- "acorn": "^8.16.0",
- "acorn-import-phases": "^1.0.3",
"browserslist": "^4.28.1",
"chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.22.0",
+ "enhanced-resolve": "^5.25.0",
"es-module-lexer": "^2.1.0",
- "eslint-scope": "5.1.1",
"events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.11",
- "loader-runner": "^4.3.2",
"mime-db": "^1.54.0",
- "neo-async": "^2.6.2",
- "schema-utils": "^4.3.3",
+ "minimizer-webpack-plugin": "^5.7.0",
+ "schema-utils": "^4.5.0",
"tapable": "^2.3.0",
- "terser-webpack-plugin": "^5.5.0",
- "watchpack": "^2.5.1",
- "webpack-sources": "^3.5.0"
+ "watchpack": "^2.5.2",
+ "webpack-sources": "^3.5.1"
},
"bin": {
"webpack": "bin/webpack.js"
@@ -21077,10 +18404,68 @@
"node": ">=14"
}
},
+ "node_modules/webpack-dev-middleware": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.6.tgz",
+ "integrity": "sha512-yBWCMvIfUmuhAE8vdqUKzH0vg9kuWN0KeG4vBnqRplUFHRU7lMQjkiJWxVQzvo2BTewqhPhDlMB41rAt2jVA9A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^4.43.1",
+ "mime-types": "^3.0.1",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "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",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/webpack-dev-server": {
"version": "5.2.6",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz",
"integrity": "sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/bonjour": "^3.5.13",
@@ -21138,6 +18523,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
"integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -21146,29 +18532,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/webpack-dev-server/node_modules/memfs": {
- "version": "4.36.0",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.36.0.tgz",
- "integrity": "sha512-mfBfzGUdoEw5AZwG8E965ej3BbvW2F9LxEWj4uLxF6BEh1dO2N9eS3AGu9S6vfenuQYrVjsbUOOZK7y3vz4vyQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@jsonjoy.com/json-pack": "^1.0.3",
- "@jsonjoy.com/util": "^1.3.0",
- "tree-dump": "^1.0.1",
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">= 4.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/streamich"
- }
- },
"node_modules/webpack-dev-server/node_modules/open": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
"integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"default-browser": "^5.2.1",
@@ -21183,43 +18551,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
- "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
- "license": "MIT",
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^4.6.0",
- "mime-types": "^2.1.31",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 18.12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- }
- }
- },
"node_modules/webpack-merge": {
- "version": "5.8.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
- "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
"wildcard": "^2.0.0"
},
"engines": {
@@ -21227,9 +18567,10 @@
}
},
"node_modules/webpack-sources": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz",
- "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.6.0.tgz",
+ "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
@@ -21239,6 +18580,7 @@
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -21248,6 +18590,7 @@
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz",
"integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==",
+ "dev": true,
"license": "Apache-2.0",
"dependencies": {
"http-parser-js": ">=0.5.1",
@@ -21262,6 +18605,7 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=0.8.0"
@@ -21271,6 +18615,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -21280,35 +18625,35 @@
"node": ">=12"
}
},
- "node_modules/whatwg-mimetype": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz",
- "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==",
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "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"
+ },
"engines": {
- "node": ">=20"
+ "node": ">=0.10.0"
}
},
"node_modules/whatwg-url": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz",
- "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@exodus/bytes": "^1.11.0",
- "tr46": "^6.0.0",
- "webidl-conversions": "^8.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@@ -21348,8 +18693,19 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
"integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -21361,12 +18717,14 @@
"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": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
@@ -21374,10 +18732,7 @@
"strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "node": ">=8"
}
},
"node_modules/wrap-ansi-cjs": {
@@ -21385,6 +18740,7 @@
"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",
@@ -21398,40 +18754,10 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
"license": "ISC"
},
@@ -21463,9 +18789,9 @@
}
},
"node_modules/ws": {
- "version": "8.21.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
- "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -21487,6 +18813,7 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
"integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-wsl": "^3.1.0"
@@ -21499,9 +18826,10 @@
}
},
"node_modules/wsl-utils/node_modules/is-wsl": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
- "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
+ "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"is-inside-container": "^1.0.0"
@@ -21513,23 +18841,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/xml-name-validator": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
- "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/xmlhttprequest-ssl": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz",
@@ -21552,32 +18863,42 @@
"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"
}
},
"node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
"dev": true,
- "license": "ISC"
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/yaml": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
- "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true,
"license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
- "node": ">= 6"
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz",
+ "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -21594,19 +18915,20 @@
}
},
"node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "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": ">=10"
+ "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",
@@ -21622,6 +18944,7 @@
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -21634,6 +18957,7 @@
"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"
@@ -21646,11 +18970,52 @@
"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/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/yargs/node_modules/wrap-ansi": {
+ "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",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yeoman-environment": {
"version": "3.19.3",
"resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-3.19.3.tgz",
@@ -21811,26 +19176,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/yeoman-environment/node_modules/@npmcli/map-workspaces/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/yeoman-environment/node_modules/@npmcli/map-workspaces/node_modules/minimatch": {
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
@@ -21860,20 +19205,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16"
}
},
- "node_modules/yeoman-environment/node_modules/@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yeoman-environment/node_modules/@npmcli/name-from-folder": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz",
@@ -21921,49 +19252,24 @@
"read-package-json-fast": "^2.0.1"
}
},
- "node_modules/yeoman-environment/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/yeoman-environment/node_modules/are-we-there-yet": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
- "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "node_modules/yeoman-environment/node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
- "license": "ISC",
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=10"
- }
+ "license": "ISC"
},
- "node_modules/yeoman-environment/node_modules/are-we-there-yet/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==",
+ "node_modules/yeoman-environment/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
+ "debug": "4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 6.0.0"
}
},
"node_modules/yeoman-environment/node_modules/arrify": {
@@ -22069,21 +19375,46 @@
"node": ">= 10"
}
},
- "node_modules/yeoman-environment/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/yeoman-environment/node_modules/cacache/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": "MIT",
+ "license": "ISC",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10"
}
},
"node_modules/yeoman-environment/node_modules/cmd-shim": {
@@ -22119,59 +19450,134 @@
"node": "*"
}
},
- "node_modules/yeoman-environment/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/yeoman-environment/node_modules/diff": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz",
+ "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==",
"dev": true,
- "license": "MIT",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.3.1"
}
},
- "node_modules/yeoman-environment/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/yeoman-environment/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 8"
}
},
- "node_modules/yeoman-environment/node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "node_modules/yeoman-environment/node_modules/gauge": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+ "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.3",
+ "console-control-strings": "^1.1.0",
+ "has-unicode": "^2.0.1",
+ "signal-exit": "^3.0.7",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.5"
},
"engines": {
- "node": ">= 6"
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/yeoman-environment/node_modules/ignore-walk": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz",
- "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==",
+ "node_modules/yeoman-environment/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "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": {
- "minimatch": "^3.0.4"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/ignore-walk": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz",
+ "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minimatch": "^3.0.4"
},
"engines": {
"node": ">=10"
@@ -22204,6 +19610,13 @@
"node": ">=12.0.0"
}
},
+ "node_modules/yeoman-environment/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/yeoman-environment/node_modules/just-diff": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.2.0.tgz",
@@ -22211,20 +19624,17 @@
"dev": true,
"license": "MIT"
},
- "node_modules/yeoman-environment/node_modules/locate-path": {
+ "node_modules/yeoman-environment/node_modules/lru-cache": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "p-locate": "^5.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/yeoman-environment/node_modules/make-fetch-happen": {
@@ -22255,6 +19665,32 @@
"node": ">= 10"
}
},
+ "node_modules/yeoman-environment/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/minipass-collect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/yeoman-environment/node_modules/minipass-fetch": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
@@ -22273,17 +19709,35 @@
"encoding": "^0.1.12"
}
},
- "node_modules/yeoman-environment/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "node_modules/yeoman-environment/node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dev": true,
"license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 8"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yeoman-environment/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
"node_modules/yeoman-environment/node_modules/node-gyp": {
@@ -22315,6 +19769,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
"integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -22325,10 +19780,33 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/yeoman-environment/node_modules/node-gyp/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/yeoman-environment/node_modules/node-gyp/node_modules/npmlog": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
"integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -22402,6 +19880,21 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/yeoman-environment/node_modules/npm-package-arg": {
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz",
+ "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "semver": "^7.3.4",
+ "validate-npm-package-name": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yeoman-environment/node_modules/npm-packlist": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz",
@@ -22421,6 +19914,28 @@
"node": ">=10"
}
},
+ "node_modules/yeoman-environment/node_modules/npm-packlist/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/yeoman-environment/node_modules/npm-pick-manifest": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz",
@@ -22470,6 +19985,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
"integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+ "deprecated": "This functionality has been moved to @npmcli/fs",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -22481,9 +19997,9 @@
}
},
"node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz",
+ "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -22520,26 +20036,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/http-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
@@ -22611,19 +20107,6 @@
"encoding": "^0.1.13"
}
},
- "node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/minimatch": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
- "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/socks-proxy-agent": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
@@ -22665,89 +20148,34 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/yeoman-environment/node_modules/npm-registry-fetch/node_modules/unique-slug": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
- "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
+ "node_modules/yeoman-environment/node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "imurmurhash": "^0.1.4"
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
},
"engines": {
- "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/yeoman-environment/node_modules/npmlog": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
- "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "are-we-there-yet": "^2.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^3.0.0",
- "set-blocking": "^2.0.0"
- }
- },
- "node_modules/yeoman-environment/node_modules/npmlog/node_modules/gauge": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
- "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.2",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.1",
- "object-assign": "^4.1.1",
- "signal-exit": "^3.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yeoman-environment/node_modules/p-limit": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yeoman-environment/node_modules/p-locate": {
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yeoman-environment/node_modules/pacote": {
- "version": "12.0.3",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz",
- "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==",
+ "node_modules/yeoman-environment/node_modules/pacote": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz",
+ "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -22821,9 +20249,9 @@
}
},
"node_modules/yeoman-environment/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==",
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.8.0.tgz",
+ "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -22841,6 +20269,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -22853,26 +20282,37 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/yeoman-environment/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==",
+ "node_modules/yeoman-environment/node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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,
- "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"
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/yeoman-environment/node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
},
"node_modules/yeoman-environment/node_modules/socks-proxy-agent": {
"version": "6.2.1",
@@ -22902,25 +20342,31 @@
"node": ">= 8"
}
},
- "node_modules/yeoman-environment/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==",
+ "node_modules/yeoman-environment/node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar 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": "MIT",
+ "license": "ISC",
"dependencies": {
- "safe-buffer": "~5.2.0"
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/yeoman-environment/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/yeoman-environment/node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "license": "ISC",
"engines": {
"node": ">=8"
}
@@ -22932,24 +20378,27 @@
"dev": true,
"license": "ISC"
},
- "node_modules/yeoman-environment/node_modules/unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "node_modules/yeoman-environment/node_modules/unique-slug": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+ "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
"dev": true,
"license": "ISC",
"dependencies": {
- "unique-slug": "^2.0.0"
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/yeoman-environment/node_modules/unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "node_modules/yeoman-environment/node_modules/validate-npm-package-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+ "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "imurmurhash": "^0.1.4"
+ "builtins": "^1.0.3"
}
},
"node_modules/yeoman-environment/node_modules/walk-up-path": {
@@ -22959,21 +20408,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/yeoman-environment/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/yeoman-environment/node_modules/write-file-atomic": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
@@ -22988,6 +20422,13 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/yeoman-environment/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/yeoman-generator": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-5.10.0.tgz",
@@ -23026,6 +20467,24 @@
}
}
},
+ "node_modules/yeoman-generator/node_modules/@isaacs/cliui": {
+ "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",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yeoman-generator/node_modules/@npmcli/fs": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
@@ -23076,6 +20535,21 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/yeoman-generator/node_modules/@npmcli/move-file": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
+ "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+ "deprecated": "This functionality has been moved to @npmcli/fs",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mkdirp": "^1.0.4",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/yeoman-generator/node_modules/@npmcli/node-gyp": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
@@ -23181,6 +20655,16 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/yeoman-generator/node_modules/@sigstore/sign/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yeoman-generator/node_modules/@sigstore/sign/node_modules/minipass-fetch": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
@@ -23200,11 +20684,11 @@
}
},
"node_modules/yeoman-generator/node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
@@ -23224,9 +20708,9 @@
}
},
"node_modules/yeoman-generator/node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz",
+ "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -23257,23 +20741,55 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/yeoman-generator/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/yeoman-generator/node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yeoman-generator/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "debug": "4"
},
"engines": {
- "node": ">=8"
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/yeoman-generator/node_modules/brace-expansion": {
+ "node_modules/yeoman-generator/node_modules/are-we-there-yet": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+ "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+ "deprecated": "This package is no longer supported.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/brace-expansion": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
"integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
@@ -23307,52 +20823,14 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/yeoman-generator/node_modules/cacache/node_modules/glob": {
- "version": "10.5.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
- "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/yeoman-generator/node_modules/cacache/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "node_modules/yeoman-generator/node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"dev": true,
"license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/yeoman-generator/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/yeoman-generator/node_modules/execa": {
@@ -23379,27 +20857,89 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/yeoman-generator/node_modules/fs-minipass": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
- "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "node_modules/yeoman-generator/node_modules/find-up": {
+ "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": "ISC",
+ "license": "MIT",
"dependencies": {
- "minipass": "^7.0.3"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": ">=8"
}
},
- "node_modules/yeoman-generator/node_modules/fs-minipass/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "node_modules/yeoman-generator/node_modules/gauge": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+ "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+ "deprecated": "This package is no longer supported.",
"dev": true,
"license": "ISC",
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.3",
+ "console-control-strings": "^1.1.0",
+ "has-unicode": "^2.0.1",
+ "signal-exit": "^3.0.7",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.5"
+ },
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/gauge/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",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/gauge/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/yeoman-generator/node_modules/glob": {
+ "version": "10.5.0",
+ "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",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/yeoman-generator/node_modules/hosted-git-info": {
@@ -23430,6 +20970,20 @@
"node": ">= 6"
}
},
+ "node_modules/yeoman-generator/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/yeoman-generator/node_modules/ignore-walk": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz",
@@ -23443,14 +20997,20 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/yeoman-generator/node_modules/is-plain-obj": {
- "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==",
+ "node_modules/yeoman-generator/node_modules/jackspeak": {
+ "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": "MIT",
- "engines": {
- "node": ">=8"
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/yeoman-generator/node_modules/json-parse-even-better-errors": {
@@ -23463,6 +21023,19 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/yeoman-generator/node_modules/locate-path": {
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yeoman-generator/node_modules/lru-cache": {
"version": "7.18.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
@@ -23562,6 +21135,7 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "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": {
@@ -23659,87 +21233,234 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/yeoman-generator/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "node_modules/yeoman-generator/node_modules/minipass-collect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
"dev": true,
"license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
- "node_modules/yeoman-generator/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "node_modules/yeoman-generator/node_modules/minipass-collect/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/yeoman-generator/node_modules/node-gyp": {
- "version": "9.4.1",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz",
- "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==",
+ "node_modules/yeoman-generator/node_modules/minipass-fetch": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+ "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "env-paths": "^2.2.0",
- "exponential-backoff": "^3.1.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.6",
- "make-fetch-happen": "^10.0.3",
- "nopt": "^6.0.0",
- "npmlog": "^6.0.0",
- "rimraf": "^3.0.2",
- "semver": "^7.3.5",
- "tar": "^6.1.2",
- "which": "^2.0.2"
- },
- "bin": {
- "node-gyp": "bin/node-gyp.js"
+ "minipass": "^3.1.6",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
},
"engines": {
- "node": "^12.13 || ^14.13 || >=16"
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "node_modules/yeoman-generator/node_modules/node-gyp/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "node_modules/yeoman-generator/node_modules/minipass-fetch/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=8"
}
},
- "node_modules/yeoman-generator/node_modules/nopt": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
- "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+ "node_modules/yeoman-generator/node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "abbrev": "^1.0.0"
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
},
- "bin": {
- "nopt": "bin/nopt.js"
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/node-gyp": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz",
+ "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^10.0.3",
+ "nopt": "^6.0.0",
+ "npmlog": "^6.0.0",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.2",
+ "which": "^2.0.2"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^12.13 || ^14.13 || >=16"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/node-gyp/node_modules/brace-expansion": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz",
+ "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/node-gyp/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/node-gyp/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/node-gyp/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/nopt": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+ "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^1.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/yeoman-generator/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/normalize-package-data/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yeoman-generator/node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
"node_modules/yeoman-generator/node_modules/npm-bundled": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz",
@@ -23867,1866 +21588,701 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass-fetch": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
- "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/yeoman-generator/node_modules/pacote": {
- "version": "15.2.0",
- "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz",
- "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@npmcli/git": "^4.0.0",
- "@npmcli/installed-package-contents": "^2.0.1",
- "@npmcli/promise-spawn": "^6.0.1",
- "@npmcli/run-script": "^6.0.0",
- "cacache": "^17.0.0",
- "fs-minipass": "^3.0.0",
- "minipass": "^5.0.0",
- "npm-package-arg": "^10.0.0",
- "npm-packlist": "^7.0.0",
- "npm-pick-manifest": "^8.0.0",
- "npm-registry-fetch": "^14.0.0",
- "proc-log": "^3.0.0",
- "promise-retry": "^2.0.1",
- "read-package-json": "^6.0.0",
- "read-package-json-fast": "^3.0.0",
- "sigstore": "^1.3.0",
- "ssri": "^10.0.0",
- "tar": "^6.1.11"
- },
- "bin": {
- "pacote": "lib/bin.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/proc-log": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
- "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/read-package-json-fast": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
- "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+ "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
"license": "ISC",
- "dependencies": {
- "json-parse-even-better-errors": "^3.0.0",
- "npm-normalize-package-bin": "^3.0.0"
- },
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/yeoman-generator/node_modules/sigstore": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz",
- "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==",
+ "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
"dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@sigstore/bundle": "^1.1.0",
- "@sigstore/protobuf-specs": "^0.2.0",
- "@sigstore/sign": "^1.0.0",
- "@sigstore/tuf": "^1.0.3",
- "make-fetch-happen": "^11.0.1"
- },
- "bin": {
- "sigstore": "bin/sigstore.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/sigstore/node_modules/make-fetch-happen": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
- "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^17.0.0",
- "http-cache-semantics": "^4.1.1",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^5.0.0",
- "minipass-fetch": "^3.0.0",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^10.0.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/sigstore/node_modules/minipass-fetch": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
- "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/yeoman-generator/node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/yeoman-generator/node_modules/sort-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz",
- "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-plain-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yeoman-generator/node_modules/ssri": {
- "version": "10.0.6",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
- "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/ssri/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/yeoman-generator/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yeoman-generator/node_modules/tuf-js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz",
- "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tufjs/models": "1.0.4",
- "debug": "^4.3.4",
- "make-fetch-happen": "^11.1.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/make-fetch-happen": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
- "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "agentkeepalive": "^4.2.1",
- "cacache": "^17.0.0",
- "http-cache-semantics": "^4.1.1",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.0",
- "is-lambda": "^1.0.1",
- "lru-cache": "^7.7.1",
- "minipass": "^5.0.0",
- "minipass-fetch": "^3.0.0",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "promise-retry": "^2.0.1",
- "socks-proxy-agent": "^7.0.0",
- "ssri": "^10.0.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/minipass-fetch": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
- "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.0.3",
- "minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- },
- "optionalDependencies": {
- "encoding": "^0.1.13"
- }
- },
- "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/yeoman-generator/node_modules/validate-npm-package-name": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
- "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yeoman-generator/node_modules/which": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
- "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/which.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/yoctocolors-cjs": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
- "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "plugins/block-dynamic-connection": {
- "name": "@blockly/block-dynamic-connection",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/block-plus-minus": {
- "name": "@blockly/block-plus-minus",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "sinon": "^22.0.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/block-shareable-procedures": {
- "name": "@blockly/block-shareable-procedures",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/block-test": {
- "name": "@blockly/block-test",
- "version": "13.2.0",
- "license": "Apache 2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/content-highlight": {
- "name": "@blockly/workspace-content-highlight",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/continuous-toolbox": {
- "name": "@blockly/continuous-toolbox",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/cross-tab-copy-paste": {
- "name": "@blockly/plugin-cross-tab-copy-paste",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/dev-create": {
- "name": "@blockly/create-package",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "chalk": "^4.1.2",
- "commander": "^15.0.0",
- "fs-extra": "^11.3.5",
- "install": "^0.13.0"
- },
- "bin": {
- "create-package": "bin/create.js"
- }
- },
- "plugins/dev-create/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "plugins/dev-create/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "plugins/dev-create/node_modules/commander": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz",
- "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==",
- "license": "MIT",
- "engines": {
- "node": ">=22.12.0"
- }
- },
- "plugins/dev-create/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "plugins/dev-scripts": {
- "name": "@blockly/dev-scripts",
- "version": "13.2.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.6"
- },
- "bin": {
- "blockly-scripts": "bin/blockly-scripts.js"
- },
- "devDependencies": {
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "typescript": "^4.3.2 || ^5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "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"
- }
- },
- "plugins/dev-scripts/node_modules/@babel/helper-validator-identifier": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0.tgz",
- "integrity": "sha512-kXxQVZHNOctSJJsqzmcbPSCEkM6oHNnDIkua7g9RCO9xRHj2eCiKvRx2KPdfWR9QxcGWnK/oArrtunmie3rL9g==",
- "license": "MIT",
- "engines": {
- "node": "^22.18.0 || >=24.11.0"
- }
- },
- "plugins/dev-scripts/node_modules/@discoveryjs/json-ext": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz",
- "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==",
- "license": "MIT",
- "engines": {
- "node": ">=14.17.0"
- }
- },
- "plugins/dev-scripts/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "plugins/dev-scripts/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "plugins/dev-scripts/node_modules/commander": {
- "version": "14.0.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
- "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==",
- "license": "MIT",
- "engines": {
- "node": ">=20"
- }
- },
- "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"
- },
- "plugins/dev-scripts/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "plugins/dev-scripts/node_modules/webpack-cli": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.3.tgz",
- "integrity": "sha512-2E2C6A1e2El7791zQgTH7LPIuwLjRliow9OHS/qlJc9pwhZlCoL/uiwqd/1WSlXT83wJfmfDbkcqHXuXoPJZ3g==",
- "license": "MIT",
- "dependencies": {
- "@discoveryjs/json-ext": "^1.1.0",
- "commander": "^14.0.3",
- "cross-spawn": "^7.0.6",
- "envinfo": "^7.14.0",
- "import-local": "^3.0.2",
- "interpret": "^3.1.1",
- "rechoir": "^0.8.0",
- "webpack-merge": "^6.0.1"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
- "engines": {
- "node": ">=20.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.101.0",
- "webpack-bundle-analyzer": "^4.0.0 || ^5.0.0",
- "webpack-dev-server": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "plugins/dev-scripts/node_modules/webpack-merge": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
- "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
- "license": "MIT",
- "dependencies": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.1"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "plugins/dev-tools": {
- "name": "@blockly/dev-tools",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@blockly/block-test": "^13.2.0",
- "@blockly/theme-dark": "^13.2.0",
- "@blockly/theme-deuteranopia": "^13.2.0",
- "@blockly/theme-highcontrast": "^13.2.0",
- "@blockly/theme-tritanopia": "^13.2.0",
- "chai": "^6.2.2",
- "dat.gui": "^0.7.9",
- "lodash.assign": "^4.2.0",
- "lodash.merge": "^4.6.2",
- "monaco-editor": "^0.57.0",
- "sinon": "^22.0.0"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@types/dat.gui": "^0.7.13"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/disable-top-blocks": {
- "name": "@blockly/disable-top-blocks",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-angle": {
- "name": "@blockly/field-angle",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-bitmap": {
- "name": "@blockly/field-bitmap",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-bitmap/node_modules/@blockly/dev-scripts/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "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",
- "extraneous": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "plugins/field-bitmap/node_modules/@blockly/dev-scripts/node_modules/minimatch": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
- "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
- "extraneous": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "plugins/field-bitmap/node_modules/@blockly/dev-scripts/node_modules/mocha": {
- "version": "10.8.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
- "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.3",
- "browser-stdout": "^1.3.1",
- "chokidar": "^3.5.3",
- "debug": "^4.3.5",
- "diff": "^5.2.0",
- "escape-string-regexp": "^4.0.0",
- "find-up": "^5.0.0",
- "glob": "^8.1.0",
- "he": "^1.2.0",
- "js-yaml": "^4.1.0",
- "log-symbols": "^4.1.0",
- "minimatch": "^5.1.6",
- "ms": "^2.1.3",
- "serialize-javascript": "^6.0.2",
- "strip-json-comments": "^3.1.1",
- "supports-color": "^8.1.1",
- "workerpool": "^6.5.1",
- "yargs": "^16.2.0",
- "yargs-parser": "^20.2.9",
- "yargs-unparser": "^2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
- },
- "engines": {
- "node": ">= 14.0.0"
- }
- },
- "plugins/field-bitmap/node_modules/@blockly/dev-tools/node_modules/chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
- "extraneous": true,
- "license": "MIT",
- "dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "plugins/field-colour": {
- "name": "@blockly/field-colour",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@blockly/field-grid-dropdown": "^13.2.0"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "@typescript-eslint/parser": "^8.61.1",
- "chai": "^6.2.2",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-colour-hsv-sliders": {
- "name": "@blockly/field-colour-hsv-sliders",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@blockly/field-colour": "^6.0.12"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-colour-hsv-sliders/node_modules/@blockly/field-colour": {
- "version": "6.0.12",
- "resolved": "https://registry.npmjs.org/@blockly/field-colour/-/field-colour-6.0.12.tgz",
- "integrity": "sha512-sZUlMtn1Bnj3/inayhZAMJ1ZUxFfR8eISBWPgOvWMBlnUIeCWXJDc76a6JVEcZhnjHFjDI+ihOXYdrp5cedShA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@blockly/field-grid-dropdown": "^6.0.10"
- },
- "engines": {
- "node": ">=8.0.0"
- },
- "peerDependencies": {
- "blockly": "^12.0.0"
- }
- },
- "plugins/field-colour-hsv-sliders/node_modules/@blockly/field-grid-dropdown": {
- "version": "6.0.10",
- "resolved": "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-6.0.10.tgz",
- "integrity": "sha512-b54xLznsFb5OyAfpFYCFX52M7vRc9dITbLzTBIsETuXfVX8R4TFj3z0+QbJ1znlqNhr5+dgrfDfkUEm8+8zbxg==",
- "license": "Apache 2.0",
- "engines": {
- "node": ">=8.17.0"
- },
- "peerDependencies": {
- "blockly": "^12.0.0"
- }
- },
- "plugins/field-date": {
- "name": "@blockly/field-date",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-dependent-dropdown": {
- "name": "@blockly/field-dependent-dropdown",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-grid-dropdown": {
- "name": "@blockly/field-grid-dropdown",
- "version": "13.2.0",
- "license": "Apache 2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-multilineinput": {
- "name": "@blockly/field-multilineinput",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/field-slider": {
- "name": "@blockly/field-slider",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/fixed-edges": {
- "name": "@blockly/fixed-edges",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/migration": {
- "name": "@blockly/migrate",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "dependencies": {
- "chalk": "^5.6.2",
- "commander": "^15.0.0",
- "json5": "^2.2.3",
- "node-fetch": "^3.3.2",
- "semver": "^7.8.4"
- },
- "bin": {
- "migrate": "bin/migrate.js"
- },
- "devDependencies": {
- "@types/mocha": "^10.0.10",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "sinon": "^22.0.0"
- }
- },
- "plugins/migration/node_modules/commander": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz",
- "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==",
"license": "MIT",
- "engines": {
- "node": ">=22.12.0"
- }
- },
- "plugins/migration/node_modules/semver": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
- "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "plugins/modal": {
- "name": "@blockly/plugin-modal",
- "version": "13.2.0",
- "license": "Apache 2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "jsdom": "^29.1.1",
- "jsdom-global": "3.0.2",
- "mocha": "^11.7.6",
- "sinon": "22.0.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/scroll-options": {
- "name": "@blockly/plugin-scroll-options",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/shadow-block-converter": {
- "name": "@blockly/shadow-block-converter",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/strict-connection-checker": {
- "name": "@blockly/plugin-strict-connection-checker",
- "version": "13.2.0",
- "license": "Apache 2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2"
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/suggested-blocks": {
- "name": "@blockly/suggested-blocks",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "plugins/theme-dark": {
- "name": "@blockly/theme-dark",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "node_modules/yeoman-generator/node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": {
+ "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"
}
},
- "plugins/theme-deuteranopia": {
- "name": "@blockly/theme-deuteranopia",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
+ "node_modules/yeoman-generator/node_modules/npmlog": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+ "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+ "deprecated": "This package is no longer supported.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "are-we-there-yet": "^3.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^4.0.3",
+ "set-blocking": "^2.0.0"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "plugins/theme-hackermode": {
- "name": "@blockly/theme-hackermode",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^4.0.12",
- "@blockly/dev-tools": "^9.0.9"
+ "node_modules/yeoman-generator/node_modules/p-limit": {
+ "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"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/block-test": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-7.0.6.tgz",
- "integrity": "sha512-o2x9uPWTD4VNqJA6m4lLMzd2ibGB/+jYIkmd+saK/fL2O0azLK/lcy8AVBiHpiOg2eFBOm6cBb5DkdetK6fbTw==",
+ "node_modules/yeoman-generator/node_modules/p-locate": {
+ "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": "Apache 2.0",
- "engines": {
- "node": ">=8.17.0"
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
},
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "engines": {
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/dev-scripts": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/@blockly/dev-scripts/-/dev-scripts-4.0.12.tgz",
- "integrity": "sha512-FM8gm6lOv21PHun6o6dvlU2eOK6bFLz/bJGWVBBB/0jJPgUKYrXm2KJ4trHlTkHoRNInSwiS4UjnrtBCfiEyBg==",
+ "node_modules/yeoman-generator/node_modules/pacote": {
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz",
+ "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
"dependencies": {
- "@babel/code-frame": "^7.8.3",
- "chalk": "^4.0.0",
- "fork-ts-checker-webpack-plugin": "^8.0.0",
- "mocha": "^10.7.0",
- "rimraf": "^3.0.2",
- "source-map-loader": "^1.0.0",
- "ts-loader": "^9.4.1",
- "webpack": "^5.0.0",
- "webpack-cli": "^5.1.4",
- "webpack-dev-server": "^5.0.4"
+ "@npmcli/git": "^4.0.0",
+ "@npmcli/installed-package-contents": "^2.0.1",
+ "@npmcli/promise-spawn": "^6.0.1",
+ "@npmcli/run-script": "^6.0.0",
+ "cacache": "^17.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^5.0.0",
+ "npm-package-arg": "^10.0.0",
+ "npm-packlist": "^7.0.0",
+ "npm-pick-manifest": "^8.0.0",
+ "npm-registry-fetch": "^14.0.0",
+ "proc-log": "^3.0.0",
+ "promise-retry": "^2.0.1",
+ "read-package-json": "^6.0.0",
+ "read-package-json-fast": "^3.0.0",
+ "sigstore": "^1.3.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11"
},
"bin": {
- "blockly-scripts": "bin/blockly-scripts.js"
+ "pacote": "lib/bin.js"
},
"engines": {
- "node": ">=8.0.0"
- },
- "peerDependencies": {
- "typescript": "^4.3.2 || ^5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/dev-tools": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-9.0.9.tgz",
- "integrity": "sha512-wzn8ij4pugvSDJMi5brMhuZlc4Nj91Op184Ez9KpU+Z8uV26Bidp6ZYOYfFKyQaEM9WEhP77RiiZbpiwkD/NsA==",
+ "node_modules/yeoman-generator/node_modules/pacote/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/path-scurry": {
+ "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": {
- "@blockly/block-test": "^7.0.6",
- "@blockly/theme-dark": "^8.0.4",
- "@blockly/theme-deuteranopia": "^7.0.4",
- "@blockly/theme-highcontrast": "^7.0.4",
- "@blockly/theme-tritanopia": "^7.0.4",
- "chai": "^4.2.0",
- "dat.gui": "^0.7.7",
- "lodash.assign": "^4.2.0",
- "lodash.merge": "^4.6.2",
- "monaco-editor": "^0.20.0",
- "sinon": "^9.0.2"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">=16 || 14 >=14.18"
},
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/theme-dark": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-8.0.4.tgz",
- "integrity": "sha512-dfuCBqFbJ8PzNuv3NxUXG9WqWYk16mtpnV3G2sOjr1O4pJdyo0co+LsircKmOSmtcwj9m7G5IHV3mRQka+f8zA==",
+ "node_modules/yeoman-generator/node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC"
+ },
+ "node_modules/yeoman-generator/node_modules/proc-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+ "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+ "dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=8.17.0"
- },
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/theme-deuteranopia": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-7.0.4.tgz",
- "integrity": "sha512-6aKYWleugGRfpunWduk9xqOpgxFMy3pUIRsI/zQEE3+adfcZA9qw4Yr1AnQMeIVML6FXhT1ocT3CGn5lCF5oIQ==",
+ "node_modules/yeoman-generator/node_modules/read-package-json-fast": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+ "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^3.0.0",
+ "npm-normalize-package-bin": "^3.0.0"
+ },
"engines": {
- "node": ">=8.17.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/yeoman-generator/node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
},
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "engines": {
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/theme-highcontrast": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-7.0.4.tgz",
- "integrity": "sha512-2XG9F+V/Sy4BtXy1nEnvqtM1fq+I2czkrHVHbbBx2dZnTUWYl3vhwTGXkYymni7FtvftvmHY1gPWlAZCbLNxKA==",
+ "node_modules/yeoman-generator/node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
"engines": {
- "node": ">=8.17.0"
+ "node": ">=8"
},
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "plugins/theme-hackermode/node_modules/@blockly/theme-tritanopia": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-7.0.4.tgz",
- "integrity": "sha512-frI6VCyIraZkppVNZz3Uw669qzYpIP3cAKVCoIyw2WYudy3ZDgp8o60Jy/cUmsX88qemtJbyD9A/m0uM6cb5gA==",
+ "node_modules/yeoman-generator/node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=8.17.0"
- },
- "peerDependencies": {
- "blockly": "^12.0.0"
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/@sinonjs/fake-timers": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
- "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
+ "node_modules/yeoman-generator/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "@sinonjs/commons": "^1.7.0"
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "plugins/theme-hackermode/node_modules/@sinonjs/samsam": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz",
- "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==",
+ "node_modules/yeoman-generator/node_modules/rimraf/node_modules/brace-expansion": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz",
+ "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^1.6.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "plugins/theme-hackermode/node_modules/ajv": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
- "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "node_modules/yeoman-generator/node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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": "MIT",
+ "license": "ISC",
"dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "plugins/theme-hackermode/node_modules/ajv-keywords": {
- "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"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "plugins/theme-hackermode/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/yeoman-generator/node_modules/rimraf/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "color-convert": "^2.0.1"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": "*"
}
},
- "plugins/theme-hackermode/node_modules/brace-expansion": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
- "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
+ "node_modules/yeoman-generator/node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "engines": {
+ "node": ">=0.12.0"
}
},
- "plugins/theme-hackermode/node_modules/chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "node_modules/yeoman-generator/node_modules/sigstore": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz",
+ "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==",
"dev": true,
- "license": "MIT",
+ "license": "Apache-2.0",
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
+ "@sigstore/bundle": "^1.1.0",
+ "@sigstore/protobuf-specs": "^0.2.0",
+ "@sigstore/sign": "^1.0.0",
+ "@sigstore/tuf": "^1.0.3",
+ "make-fetch-happen": "^11.0.1"
+ },
+ "bin": {
+ "sigstore": "bin/sigstore.js"
},
"engines": {
- "node": ">=4"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/yeoman-generator/node_modules/sigstore/node_modules/make-fetch-happen": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+ "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "agentkeepalive": "^4.2.1",
+ "cacache": "^17.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "is-lambda": "^1.0.1",
+ "lru-cache": "^7.7.1",
+ "minipass": "^5.0.0",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "promise-retry": "^2.0.1",
+ "socks-proxy-agent": "^7.0.0",
+ "ssri": "^10.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/yeoman-generator/node_modules/sigstore/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
+ "license": "ISC",
"engines": {
"node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "node_modules/yeoman-generator/node_modules/sigstore/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
},
"engines": {
- "node": ">=10"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "plugins/theme-hackermode/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "node_modules/yeoman-generator/node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=16 || 14 >=14.17"
}
},
- "plugins/theme-hackermode/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/yeoman-generator/node_modules/socks-proxy-agent": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+ "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "agent-base": "^6.0.2",
+ "debug": "^4.3.3",
+ "socks": "^2.6.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 10"
}
},
- "plugins/theme-hackermode/node_modules/fork-ts-checker-webpack-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
- "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==",
+ "node_modules/yeoman-generator/node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "@babel/code-frame": "^7.16.7",
- "chalk": "^4.1.2",
- "chokidar": "^3.5.3",
- "cosmiconfig": "^7.0.1",
- "deepmerge": "^4.2.2",
- "fs-extra": "^10.0.0",
- "memfs": "^3.4.1",
- "minimatch": "^3.0.4",
- "node-abort-controller": "^3.0.1",
- "schema-utils": "^3.1.1",
- "semver": "^7.3.5",
- "tapable": "^2.2.1"
+ "minipass": "^7.0.3"
},
"engines": {
- "node": ">=12.13.0",
- "yarn": ">=1.0.0"
- },
- "peerDependencies": {
- "typescript": ">3.6.0",
- "webpack": "^5.11.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/fs-extra": {
- "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==",
+ "node_modules/yeoman-generator/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "plugins/theme-hackermode/node_modules/json-schema-traverse": {
- "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==",
+ "node_modules/yeoman-generator/node_modules/string-width/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
"license": "MIT"
},
- "plugins/theme-hackermode/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/yeoman-generator/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": {
- "p-locate": "^5.0.0"
+ "ansi-regex": "^6.2.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "plugins/theme-hackermode/node_modules/mocha": {
- "version": "10.8.2",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
- "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
+ "node_modules/yeoman-generator/node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.3",
- "browser-stdout": "^1.3.1",
- "chokidar": "^3.5.3",
- "debug": "^4.3.5",
- "diff": "^5.2.0",
- "escape-string-regexp": "^4.0.0",
- "find-up": "^5.0.0",
- "glob": "^8.1.0",
- "he": "^1.2.0",
- "js-yaml": "^4.1.0",
- "log-symbols": "^4.1.0",
- "minimatch": "^5.1.6",
- "ms": "^2.1.3",
- "serialize-javascript": "^6.0.2",
- "strip-json-comments": "^3.1.1",
- "supports-color": "^8.1.1",
- "workerpool": "^6.5.1",
- "yargs": "^16.2.0",
- "yargs-parser": "^20.2.9",
- "yargs-unparser": "^2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
- },
- "engines": {
- "node": ">= 14.0.0"
- }
- },
- "plugins/theme-hackermode/node_modules/mocha/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "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": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
"engines": {
"node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "plugins/theme-hackermode/node_modules/mocha/node_modules/minimatch": {
- "version": "5.1.9",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
- "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
+ "node_modules/yeoman-generator/node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar 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": {
- "brace-expansion": "^2.0.1"
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
- "plugins/theme-hackermode/node_modules/monaco-editor": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.20.0.tgz",
- "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==",
- "dev": true,
- "license": "MIT"
- },
- "plugins/theme-hackermode/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "node_modules/yeoman-generator/node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "minipass": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 8"
}
},
- "plugins/theme-hackermode/node_modules/p-locate": {
- "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==",
+ "node_modules/yeoman-generator/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "p-limit": "^3.0.2"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "node_modules/yeoman-generator/node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
"license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/schema-utils": {
- "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==",
+ "node_modules/yeoman-generator/node_modules/tuf-js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz",
+ "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
+ "@tufjs/models": "1.0.4",
+ "debug": "^4.3.4",
+ "make-fetch-happen": "^11.1.1"
},
"engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/sinon": {
- "version": "9.2.4",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz",
- "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==",
- "deprecated": "16.1.1",
+ "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/make-fetch-happen": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+ "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"dependencies": {
- "@sinonjs/commons": "^1.8.1",
- "@sinonjs/fake-timers": "^6.0.1",
- "@sinonjs/samsam": "^5.3.1",
- "diff": "^4.0.2",
- "nise": "^4.0.4",
- "supports-color": "^7.1.0"
+ "agentkeepalive": "^4.2.1",
+ "cacache": "^17.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "is-lambda": "^1.0.1",
+ "lru-cache": "^7.7.1",
+ "minipass": "^5.0.0",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "promise-retry": "^2.0.1",
+ "socks-proxy-agent": "^7.0.0",
+ "ssri": "^10.0.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/sinon/node_modules/diff": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
- "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
+ "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "ISC",
"engines": {
- "node": ">=0.3.1"
+ "node": ">=8"
}
},
- "plugins/theme-hackermode/node_modules/sinon/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
},
"engines": {
- "node": ">=8"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
}
},
- "plugins/theme-hackermode/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/yeoman-generator/node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
"dev": true,
- "license": "BSD-3-Clause",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=16 || 14 >=14.17"
}
},
- "plugins/theme-hackermode/node_modules/source-map-loader": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz",
- "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==",
+ "node_modules/yeoman-generator/node_modules/unique-filename": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
"dependencies": {
- "abab": "^2.0.5",
- "iconv-lite": "^0.6.2",
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0",
- "source-map": "^0.6.1",
- "whatwg-mimetype": "^2.3.0"
+ "unique-slug": "^4.0.0"
},
"engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-hackermode/node_modules/whatwg-mimetype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
- "dev": true,
- "license": "MIT"
- },
- "plugins/theme-hackermode/node_modules/workerpool": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
- "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "node_modules/yeoman-generator/node_modules/unique-slug": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+ "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
"dev": true,
- "license": "Apache-2.0"
- },
- "plugins/theme-highcontrast": {
- "name": "@blockly/theme-highcontrast",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-modern": {
- "name": "@blockly/theme-modern",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "node_modules/yeoman-generator/node_modules/validate-npm-package-name": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/theme-tritanopia": {
- "name": "@blockly/theme-tritanopia",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0"
+ "node_modules/yeoman-generator/node_modules/which": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+ "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/toolbox-search": {
- "name": "@blockly/toolbox-search",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "typescript": "^6.0.3"
+ "bin": {
+ "node-which": "bin/which.js"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
- "plugins/typed-variable-modal": {
- "name": "@blockly/plugin-typed-variable-modal",
- "version": "13.2.0",
- "license": "Apache-2.0",
+ "node_modules/yeoman-generator/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@blockly/plugin-modal": "^13.2.0"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "jsdom": "^29.1.1",
- "jsdom-global": "3.0.2",
- "mocha": "^11.7.6",
- "sinon": "22.0.0"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
- },
- "plugins/workspace-backpack": {
- "name": "@blockly/workspace-backpack",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
+ "engines": {
+ "node": ">=12"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "plugins/workspace-minimap": {
- "name": "@blockly/workspace-minimap",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- }
+ "node_modules/yeoman-generator/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
},
- "plugins/workspace-search": {
- "name": "@blockly/plugin-workspace-search",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "jsdom": "^29.1.1",
- "jsdom-global": "3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
+ "node_modules/yocto-queue": {
+ "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"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "plugins/zoom-to-fit": {
- "name": "@blockly/zoom-to-fit",
- "version": "13.2.0",
- "license": "Apache-2.0",
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
+ "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
- "peerDependencies": {
- "blockly": "^13.2.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
}
}
diff --git a/package.json b/package.json
index aaf7b3082..a476d7218 100644
--- a/package.json
+++ b/package.json
@@ -5,25 +5,16 @@
"author": "Blockly Team",
"license": "Apache-2.0",
"scripts": {
- "build": "lerna run build --scope '@blockly/*'",
- "clean": "lerna run clean --scope '@blockly/*'",
"deploy:prepare": "npm run deploy:prepare:examples && gulp predeploy",
"deploy:prepare:examples": "npm install --workspace=examples && npm run prepare-examples && npm run predeploy --if-present --workspace=examples",
"deploy": "npm run deploy:prepare && gulp deploy",
"deploy:upstream": "npm run deploy:prepare && gulp deployUpstream",
"format": "prettier --write .",
"format:check": "prettier --check .",
- "license": "gulp checkLicenses",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
- "publish:prepare": "gulp prepareForPublish",
- "publish:manual": "gulp publishManual",
- "publish:force": "gulp forcePublish",
- "publish:unpublishedOnly": "gulp publishFromPackage",
- "publish:checkVersions": "gulp checkVersions",
"test:ghpages:beta": "gulp testGhPagesBeta",
"test:ghpages": "gulp testGhPages",
- "test": "lerna run test --scope '@blockly/*'",
"prepare-examples": "node ./scripts/copy-blockly.js"
},
"devDependencies": {
@@ -32,6 +23,8 @@
"@eslint/js": "^10.0.1",
"@typescript-eslint/eslint-plugin": "^8.61.1",
"@typescript-eslint/parser": "^8.61.1",
+ "ajv": "^8.20.0",
+ "ajv-keywords": "^5.1.0",
"blockly": "^13.2.0",
"conventional-changelog-conventionalcommits": "^9.3.1",
"eslint": "^10.5.0",
@@ -43,7 +36,6 @@
"gulp": "^5.0.1",
"gulp-header": "^2.0.12",
"http-server": "^14.1.1",
- "js-green-licenses": "^4.0.0",
"lerna": "^9.0.7",
"prettier": "^3.8.4",
"rimraf": "^6.1.3",
@@ -54,7 +46,6 @@
"access": "public"
},
"workspaces": [
- "plugins/*",
"examples/blockly-**",
"examples/**-demo",
"examples/sample-**",
diff --git a/plugins/.eslintignore b/plugins/.eslintignore
deleted file mode 100644
index 63520da7d..000000000
--- a/plugins/.eslintignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-dist
-build
diff --git a/plugins/.gitignore b/plugins/.gitignore
deleted file mode 100644
index 40b878db5..000000000
--- a/plugins/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
\ No newline at end of file
diff --git a/plugins/README.md b/plugins/README.md
deleted file mode 100644
index 7032f1705..000000000
--- a/plugins/README.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# @blockly Plugins
-
-This directory is where [Blockly](http://github.com/RaspberryPiFoundation/blockly) plugins are
-authored and stored. These plugin packages are released to npm under the
-`@blockly` scope.
-
-A full list of published packages can be found by searching for the `@blockly`
-tag on [npm](https://www.npmjs.com/search?q=%40blockly).
-
-## Plugins
-
-### Fields
-
-- [`@blockly/field-bitmap`](field-bitmap/): A Blockly field that allows for
- user-inputted pixel grids.
-- [`@blockly/field-colour-hsv-sliders`](field-colour-hsv-sliders/): A colour
- picker field that uses HSV sliders.
-- [`@blockly/field-date`](field-date/): A date picker field that uses the
- Google Closure date picker.
-- [`@blockly/field-dependent-dropdown`](field-dependent-dropdown/): A dropdown
- field where the available options depend on the value of a parent field.
-- [`@blockly/field-grid-dropdown`](field-grid-dropdown/): A Blockly dropdown
- field with grid layout.
-- [`@blockly/field-slider`](field-slider/): A slider field.
-
-### Blocks
-
-- [`@blockly/block-plus-minus`](block-plus-minus/): A group of blocks that
- replace the built-in mutator UI with a +/- based UI.
-- [`@blockly/block-dynamic-connection`](block-dynamic-connection/): A group of
- blocks that add connections dynamically.
-- [`@blockly-block-shareable-procedures`](block-shareable-procedures): A group
- of blocks that replace the built-in procedures with ones that can be shared
- between workspaces.
-- [`@blockly/block-test`](block-test/): A group of Blockly test blocks.
-- [`@blockly/renderer-inline-row-separators`](renderer-inline-row-separators/):
- A renderer that allows putting inline value input connectors on separate rows,
- and blocks that demonstrate the feature.
-
-### Dev
-
-- [`@blockly/create-package`](dev-create/): A tool for creating a Blockly
- plugin based on a pre-existing template.
-- [`@blockly/migrate`](migration/): A tool for migrating apps built on Blockly
- to newer versions of Blockly that make breaking changes.
-- [`@blockly/dev-tool`](dev-tools/): A library of common utilities for Blockly
- plugin development.
-- [`@blockly/dev-scripts`](dev-scripts/): Configuration and scripts for Blockly
- plugins.
-
-### Themes
-
-- [`@blockly/theme-modern`](theme-modern/): A Blockly modern theme.
-- [`@blockly/theme-dark`](theme-dark/): A Blockly dark theme.
-- [`@blockly/theme-highcontrast`](theme-highcontrast/): A Blockly high
- contrast theme.
-- [`@blockly/theme-deuteranopia`](theme-deuteranopia/): A Blockly theme for
- people who have deuteranopia.
-- [`@blockly/theme-tritanopia`](theme-tritanopia/): A Blockly theme for people
- who have tritanopia.
-
-### Workspace
-
-- [`@blockly/continuous-toolbox`](continuous-toolbox/): A Blockly plugin
- that adds a continous-scrolling style toolbox and flyout.
-- [`@blockly/workspace-content-highlight`](content-highlight/): A Blockly
- plugin that highlights the content on the workspace.
-- [`@blockly/disable-top-blocks`](disable-top-blocks/): A Blockly plugin that
- shows the 'disable' context menu option only on non-orphan blocks.
-- [`@blockly/fixed-edges`](fixed-edges/): A Blockly MetricsManager for
- configuring fixed sides.
-- [`@blockly/keyboard-navigation`](keyboard-navigation/): A Blockly plugin
- that adds keyboard navigation support.
-- [`@blockly/plugin-strict-connection-checker`](strict-connection-checker/): A
- Blockly plugin that makes connection checks strict.
-- [`@blockly/plugin-workspace-search`](workspace-search/): A plugin that adds
- workspace search support.
-- [`@blockly/zoom-to-fit`](zoom-to-fit/): A Blockly plugin that adds a
- zoom-to-fit control to the workspace.
-- [`@blockly/plugin-scroll-options`](scroll-options/): A Blockly plugin that
- adds additional scrolling features.
-- [`@blockly/plugin-cross-tab-copy-paste`](cross-tab-copy-paste/): A Blockly plugin
- that allows a user to copy and paste blocks between tabs.
-- [`@blockly/shadow-block-converter`](shadow-block-converter/): A Blockly plugin
- that automatically converts shadow blocks to real blocks when the user edits them.
-- [`@blockly/workspace-backpack`](workspace-backpack/): A Blockly plugin that
- adds Backpack support.
-- [`@blockly/workspace-minimap`](workspace-minimap/): A Blockly plugin that
- adds a minimap of the workspace to the workspace. (private; in development)
-
-### Serializers
-
-- [`@blockly/serialize-disabled-interactions`](serialize-disabled-interactions/): A serializer that serializes movable, deltable, and editable attributes.
-
-### Toolbox
-
-- [`@blockly/toolbox-search`](toolbox-search/): A toolbox category that provides a
- search field to filter the available blocks in the toolbox.
-
-### Other
-
-- [`@blockly/plugin-modal`](modal/): A Blockly plugin that creates a modal.
-- [`@blockly/plugin-typed-variable-modal`](typed-variable-modal/): A plugin to
- create a modal for creating typed variables.
-
-## Using Lerna
-
-[Lerna](https://lerna.js.org/) is being used to manage all the packages released
-under the `@blockly` npm scope.
-
-Run `npm install` at the root of blockly-samples, rather than from each individual
-plugin subdirectory. You can also run other commands such as `npm run format` that
-will act on all plugins simultaneously.
diff --git a/plugins/block-dynamic-connection/CHANGELOG.md b/plugins/block-dynamic-connection/CHANGELOG.md
deleted file mode 100644
index 5f2dc61b0..000000000
--- a/plugins/block-dynamic-connection/CHANGELOG.md
+++ /dev/null
@@ -1,720 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Bug Fixes
-
-* **block-dynamic-connection:** recache connection pairs after dynamically adding new ones
-
-
-## [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 the tests for block-dynamic-connection ([#2705](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2705))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [0.8.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.8...@blockly/block-dynamic-connection@0.8.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.7...@blockly/block-dynamic-connection@0.8.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.6...@blockly/block-dynamic-connection@0.8.7) (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))
-
-
-
-## [0.8.6](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.5...@blockly/block-dynamic-connection@0.8.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.5](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.4...@blockly/block-dynamic-connection@0.8.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.4](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.3...@blockly/block-dynamic-connection@0.8.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.2...@blockly/block-dynamic-connection@0.8.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.1...@blockly/block-dynamic-connection@0.8.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.8.0...@blockly/block-dynamic-connection@0.8.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.8.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.16...@blockly/block-dynamic-connection@0.8.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))
-
-
-
-## [0.7.16](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.15...@blockly/block-dynamic-connection@0.7.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.15](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.14...@blockly/block-dynamic-connection@0.7.15) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.14](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.13...@blockly/block-dynamic-connection@0.7.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.13](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.12...@blockly/block-dynamic-connection@0.7.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.12](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.11...@blockly/block-dynamic-connection@0.7.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.11](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.10...@blockly/block-dynamic-connection@0.7.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.10](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.9...@blockly/block-dynamic-connection@0.7.10) (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)
-
-
-
-
-
-## [0.7.9](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.8...@blockly/block-dynamic-connection@0.7.9) (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))
-
-
-
-
-
-## [0.7.8](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.7...@blockly/block-dynamic-connection@0.7.8) (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))
-
-
-
-
-
-## [0.7.7](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.6...@blockly/block-dynamic-connection@0.7.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.6](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.5...@blockly/block-dynamic-connection@0.7.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.5](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.4...@blockly/block-dynamic-connection@0.7.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.4](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.3...@blockly/block-dynamic-connection@0.7.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)
-
-
-
-## [0.7.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.2...@blockly/block-dynamic-connection@0.7.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.1...@blockly/block-dynamic-connection@0.7.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.7.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.7.0...@blockly/block-dynamic-connection@0.7.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))
-
-
-
-## [0.7.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.5...@blockly/block-dynamic-connection@0.7.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
-
-* build for the v11 branch ([#2268](https://github.com/google/blockly-samples/issues/2268)) ([c7a4fc5](https://github.com/google/blockly-samples/commit/c7a4fc5e72c5e8d9e9bc926bbbbadd1eb31792fc))
-* 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)
-* dynamic blocks erroring on workspace dispose ([#2271](https://github.com/google/blockly-samples/issues/2271)) ([ac5086d](https://github.com/google/blockly-samples/commit/ac5086de8439f3e7bfc339189d8000412b0ee7aa))
-* dynamic blocks finalizing connections when children are deleted ([#2192](https://github.com/google/blockly-samples/issues/2192)) ([9a7b924](https://github.com/google/blockly-samples/commit/9a7b9246d71823160e7878f8616d450a09ad7ba1))
-* scroll-options fixes and compatibility with custom draggables ([#2358](https://github.com/google/blockly-samples/issues/2358)) ([2da6080](https://github.com/google/blockly-samples/commit/2da6080e1684edc5fc90cca0ba80c90982b5e4e2))
-
-
-
-## [0.6.5](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.4...@blockly/block-dynamic-connection@0.6.5) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.6.4](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.3...@blockly/block-dynamic-connection@0.6.4) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.6.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.2...@blockly/block-dynamic-connection@0.6.3) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.6.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.1...@blockly/block-dynamic-connection@0.6.2) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.6.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.6.0...@blockly/block-dynamic-connection@0.6.1) (2024-03-28)
-
-
-### Bug Fixes
-
-* readme for the dynamic connection previewer ([#2272](https://github.com/google/blockly-samples/issues/2272)) ([dc1d05d](https://github.com/google/blockly-samples/commit/dc1d05d225c52bf3e3a6ccd73bfa710941ea15a2))
-
-
-
-## [0.6.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.7...@blockly/block-dynamic-connection@0.6.0) (2024-02-16)
-
-
-### ⚠ BREAKING CHANGES
-
-* use new connection previewer in block-dynamic-connection (#2204)
-
-### Features
-
-* use new connection previewer in block-dynamic-connection ([#2204](https://github.com/google/blockly-samples/issues/2204)) ([fb17b94](https://github.com/google/blockly-samples/commit/fb17b943ad5ef8f9db58a9f87d7f7e0dd28bf3d5)), closes [#2190](https://github.com/google/blockly-samples/issues/2190)
-
-
-
-## [0.5.7](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.6...@blockly/block-dynamic-connection@0.5.7) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.5.6](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.5...@blockly/block-dynamic-connection@0.5.6) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.5.5](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.4...@blockly/block-dynamic-connection@0.5.5) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.5.4](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.3...@blockly/block-dynamic-connection@0.5.4) (2023-11-16)
-
-
-### Bug Fixes
-
-* resolved 15 ESLint warnings ([#2065](https://github.com/google/blockly-samples/issues/2065)) ([2436337](https://github.com/google/blockly-samples/commit/243633746542bb1518fe2893c0421a5a6f79fd32))
-
-
-
-## [0.5.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.2...@blockly/block-dynamic-connection@0.5.3) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.5.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.1...@blockly/block-dynamic-connection@0.5.2) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.5.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.5.0...@blockly/block-dynamic-connection@0.5.1) (2023-10-30)
-
-
-### Bug Fixes
-
-* export types for block-dynamic-connection ([#1948](https://github.com/google/blockly-samples/issues/1948)) ([ffa3797](https://github.com/google/blockly-samples/commit/ffa3797112fa0d560835dd56de2d790933cdbc48))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [0.5.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.4.3...@blockly/block-dynamic-connection@0.5.0) (2023-09-28)
-
-
-### ⚠ BREAKING CHANGES
-
-* changes for v10.2.0 (#1989)
-
-### release
-
-* changes for v10.2.0 ([#1989](https://github.com/google/blockly-samples/issues/1989)) ([4d81ea7](https://github.com/google/blockly-samples/commit/4d81ea7254412ef199a270fc740c2f45755a2725)), closes [#1844](https://github.com/google/blockly-samples/issues/1844) [#1845](https://github.com/google/blockly-samples/issues/1845) [#1863](https://github.com/google/blockly-samples/issues/1863) [#1880](https://github.com/google/blockly-samples/issues/1880) [#1885](https://github.com/google/blockly-samples/issues/1885) [#1886](https://github.com/google/blockly-samples/issues/1886) [#1887](https://github.com/google/blockly-samples/issues/1887) [#1888](https://github.com/google/blockly-samples/issues/1888) [#1919](https://github.com/google/blockly-samples/issues/1919) [#1920](https://github.com/google/blockly-samples/issues/1920) [#1983](https://github.com/google/blockly-samples/issues/1983) [#1984](https://github.com/google/blockly-samples/issues/1984) [#1985](https://github.com/google/blockly-samples/issues/1985) [#1991](https://github.com/google/blockly-samples/issues/1991)
-
-
-
-## [0.4.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.4.2...@blockly/block-dynamic-connection@0.4.3) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.4.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.4.1...@blockly/block-dynamic-connection@0.4.2) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.4.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.4.0...@blockly/block-dynamic-connection@0.4.1) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.4.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.3.3...@blockly/block-dynamic-connection@0.4.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))
-
-
-
-## [0.3.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.3.2...@blockly/block-dynamic-connection@0.3.3) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.3.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.3.1...@blockly/block-dynamic-connection@0.3.2) (2023-07-13)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.3.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.3.0...@blockly/block-dynamic-connection@0.3.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.3.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.18...@blockly/block-dynamic-connection@0.3.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))
-
-
-
-## [0.2.18](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.17...@blockly/block-dynamic-connection@0.2.18) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.17](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.16...@blockly/block-dynamic-connection@0.2.17) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.16](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.15...@blockly/block-dynamic-connection@0.2.16) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.15](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.14...@blockly/block-dynamic-connection@0.2.15) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.14](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.13...@blockly/block-dynamic-connection@0.2.14) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.13](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.12...@blockly/block-dynamic-connection@0.2.13) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.12](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.11...@blockly/block-dynamic-connection@0.2.12) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.11](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.10...@blockly/block-dynamic-connection@0.2.11) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.10](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.9...@blockly/block-dynamic-connection@0.2.10) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.9](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.8...@blockly/block-dynamic-connection@0.2.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.8](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.7...@blockly/block-dynamic-connection@0.2.8) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.7](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.6...@blockly/block-dynamic-connection@0.2.7) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.6](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.5...@blockly/block-dynamic-connection@0.2.6) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.5](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.4...@blockly/block-dynamic-connection@0.2.5) (2023-01-19)
-
-
-### Bug Fixes
-
-* block-dynamic-connections insertion marker monkey patch ([#1452](https://github.com/google/blockly-samples/issues/1452)) ([5bf1e79](https://github.com/google/blockly-samples/commit/5bf1e79493de4bc3a7fce4bef6a69b5f4055de7b))
-
-
-
-## [0.2.4](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.3...@blockly/block-dynamic-connection@0.2.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.3](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.2...@blockly/block-dynamic-connection@0.2.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.2](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.1...@blockly/block-dynamic-connection@0.2.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.1](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.2.0...@blockly/block-dynamic-connection@0.2.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## [0.2.0](https://github.com/google/blockly-samples/compare/@blockly/block-dynamic-connection@0.1.36...@blockly/block-dynamic-connection@0.2.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* references to deprecated functions in v9 ([#1313](https://github.com/google/blockly-samples/issues/1313)) ([cb2e679](https://github.com/google/blockly-samples/commit/cb2e67987e0b62a77c26adc660cc6ade1ba67954))
-* Update block-dynamic-connection to use JSON toolbox ([#1238](https://github.com/google/blockly-samples/issues/1238)) ([#1286](https://github.com/google/blockly-samples/issues/1286)) ([428c81c](https://github.com/google/blockly-samples/commit/428c81cef4bb58ce99128cbb78f1930ad238b6e5))
-
-
-### 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))
-
-
-
-## 0.1.36 (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))
-
-
-
-
-
-## 0.1.35 (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))
-
-
-
-
-
-## 0.1.33 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## 0.1.32 (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))
-
-
-
-
-
-## 0.1.31 (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))
-
-
-
-
-
-## 0.1.30 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/block-dynamic-connection
-
-
-
-
-
-## 0.1.29 (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))
-
-
-
-
-
-## 0.1.28 (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/plugins/block-dynamic-connection/GETSTARTED.md b/plugins/block-dynamic-connection/GETSTARTED.md
deleted file mode 100644
index 99e93c7e9..000000000
--- a/plugins/block-dynamic-connection/GETSTARTED.md
+++ /dev/null
@@ -1,24 +0,0 @@
-This package was bootstrapped with [@blockly/create-package](https://www.npmjs.com/package/@blockly/create-package).
-
-## Available Scripts
-
-In this directory, you can run:
-
-### `npm 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.
-
-### `npm run build`
-
-Builds the package into the `dist` directory.
-
-### `npm run lint`
-
-Runs eslint on the `src` and `test` directories.
-
-### `npm run clean`
-
-Deletes the `dist` and `build` directories if they exist.
diff --git a/plugins/block-dynamic-connection/README.md b/plugins/block-dynamic-connection/README.md
deleted file mode 100644
index 7b23547d2..000000000
--- a/plugins/block-dynamic-connection/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# @blockly/block-dynamic-connection [](https://github.com/google/blockly)
-
-A group of [Blockly](https://www.npmjs.com/package/blockly) blocks that
-add and remove connections dynamically.
-
-## Installation
-
-```
-npm install @blockly/block-dynamic-connection --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import * as BlockDynamicConnection from '@blockly/block-dynamic-connection';
-
-const myWorkspace = Blockly.inject({
- // options...
- plugins: {
- connectionPreviewer:
- BlockDynamicConnection.decoratePreviewer(
- // Replace with a custom connection previewer, or remove to decorate
- // the default one.
- Blockly.InsertionMarkerPreviewer,
- ),
- },
- };
-
-// Add the change listener so connections will be finalized on deletion.
-workspace.addChangeListener(BlockDynamicConnection.finalizeConnections);
-```
-
-## API
-
-- `overrideOldBlockDefinitions`: Replaces the Blockly default blocks with the
- dynamic connection blocks. This enables projects to use the dynamic block
- plugin without changing existing XML/JSON.
-
-## Blocks
-
-- `dynamic_text_join` replaces `text_join`
-- `dynamic_list_create` replaces `lists_create_with`
-- `dynamic_if` replaces `controls_if`
-
-## License
-
-Apache 2.0
diff --git a/plugins/block-dynamic-connection/package.json b/plugins/block-dynamic-connection/package.json
deleted file mode 100644
index 85e695a36..000000000
--- a/plugins/block-dynamic-connection/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "name": "@blockly/block-dynamic-connection",
- "version": "13.2.0",
- "description": "A group of blocks that add connections dynamically.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "prepublishOnly": "npm run clean && npm run build",
- "predeploy": "npm run build && blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "block-dynamic-connection"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/block-dynamic-connection#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/block-dynamic-connection"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/block-dynamic-connection/src/connection_previewer.ts b/plugins/block-dynamic-connection/src/connection_previewer.ts
deleted file mode 100644
index e359d05df..000000000
--- a/plugins/block-dynamic-connection/src/connection_previewer.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-interface ConnectionPreviewerConstructor {
- new (draggedBlock: Blockly.BlockSvg): Blockly.IConnectionPreviewer;
-}
-
-type DynamicBlock = Blockly.BlockSvg & {
- onPendingConnection(connection: Blockly.RenderedConnection): void;
- finalizeConnections(): void;
-};
-
-/**
- * A type guard that checks if the given block fulfills the DynamicBlock
- * interface.
- *
- * @param block
- */
-export function blockIsDynamic(block: Blockly.BlockSvg): block is DynamicBlock {
- return (
- (block as DynamicBlock)['onPendingConnection'] !== undefined &&
- (block as DynamicBlock)['finalizeConnections'] !== undefined
- );
-}
-
-/**
- * Returns a connection previewer constructor that decorates the passed
- * constructor to add connection previewing.
- *
- * @param BasePreviewerConstructor The constructor for the base connection
- * previewer class being decorated. If not provided, the default
- * InsertionMarkerPreviewer will be used.
- * @return A decorated connection previewer constructor.
- */
-export function decoratePreviewer(
- BasePreviewerConstructor?: ConnectionPreviewerConstructor,
-): ConnectionPreviewerConstructor {
- return class implements Blockly.IConnectionPreviewer {
- private basePreviewer: Blockly.IConnectionPreviewer;
-
- private pendingBlocks: Set = new Set();
-
- private draggedBlock: Blockly.BlockSvg;
-
- constructor(draggedBlock: Blockly.BlockSvg) {
- const BaseConstructor =
- BasePreviewerConstructor ?? Blockly.InsertionMarkerPreviewer;
- this.basePreviewer = new BaseConstructor(draggedBlock);
- this.draggedBlock = draggedBlock;
- }
-
- previewReplacement(
- draggedConn: Blockly.RenderedConnection,
- staticConn: Blockly.RenderedConnection,
- replacedBlock: Blockly.BlockSvg,
- ): void {
- this.previewDynamism(staticConn);
- this.basePreviewer.previewReplacement(
- draggedConn,
- staticConn,
- replacedBlock,
- );
- }
-
- previewConnection(
- draggedConn: Blockly.RenderedConnection,
- staticConn: Blockly.RenderedConnection,
- ): void {
- this.previewDynamism(staticConn);
- this.basePreviewer.previewConnection(draggedConn, staticConn);
- }
-
- hidePreview(): void {
- this.basePreviewer.hidePreview();
- }
-
- dispose(): void {
- for (const block of this.pendingBlocks) {
- if (block.isDeadOrDying()) return;
- block.finalizeConnections();
- }
- this.pendingBlocks.clear();
- this.basePreviewer.dispose();
- }
-
- /**
- * If the block is a dynamic block, calls onPendingConnection and
- * stores the block to be finalized later. When new inputs are added,
- * refreshes the dragged block's connection-pair cache so constrained
- * / keyboard moves can see the new connections.
- *
- * @param conn The block to trigger onPendingConnection on.
- */
- private previewDynamism(conn: Blockly.RenderedConnection) {
- const block = conn.getSourceBlock();
- if (!blockIsDynamic(block)) {
- return;
- }
-
- // During onPendingConnection, dynamic blocks only grow (append inputs);
- // they never remove or replace them. So an input-count change is enough
- // to detect when the block shape has changed.
- const inputCountBefore = block.inputList.length;
- block.onPendingConnection(conn);
- this.pendingBlocks.add(block);
-
- if (block.inputList.length === inputCountBefore) {
- return;
- }
-
- const strategy = this.draggedBlock.getDragStrategy();
- if (strategy instanceof Blockly.dragging.BlockDragStrategy) {
- strategy.cacheAllConnectionPairs();
- }
- }
- };
-}
diff --git a/plugins/block-dynamic-connection/src/dynamic_if.ts b/plugins/block-dynamic-connection/src/dynamic_if.ts
deleted file mode 100644
index 0cea6e2ea..000000000
--- a/plugins/block-dynamic-connection/src/dynamic_if.ts
+++ /dev/null
@@ -1,408 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Defines a version of the if block with dyanmic
- * inputs that appear when a block is dragged over inputs on the block.
- */
-
-import * as Blockly from 'blockly/core';
-
-/** Type of a block that has the DYNAMIC_IF_MIXIN. */
-type DynamicIfBlock = Blockly.Block & DynamicIfMixin;
-/* eslint-disable @typescript-eslint/no-empty-interface */
-/** This interface avoids a "circular reference" compile error. */
-interface DynamicIfMixin extends DynamicIfMixinType {}
-/* eslint-enable @typescript-eslint/no-empty-interface */
-type DynamicIfMixinType = typeof DYNAMIC_IF_MIXIN;
-
-interface CaseConnectionPair {
- ifTarget?: Blockly.Connection | null;
- doTarget?: Blockly.Connection | null;
-}
-
-interface CaseInputPair {
- ifInput: Blockly.Input;
- doInput: Blockly.Input;
-}
-
-/** Extra state for serializing controls_if blocks. */
-interface IfExtraState {
- elseIfCount?: number;
- hasElse?: boolean;
-}
-
-const DYNAMIC_IF_MIXIN = {
- /**
- * Minimum number of inputs for this block.
- *
- * @deprecated This is unused.
- */
- minInputs: 1,
-
- /** Count of else-if cases. */
- elseifCount: 0,
-
- /** Count of else cases (either 0 or 1). */
- elseCount: 0,
-
- /**
- * Block for if/elseif/else statements. Must have one if input.
- * Can have any number of elseif inputs and optionally one else input.
- */
- init(this: DynamicIfBlock): void {
- this.setHelpUrl(Blockly.Msg['CONTROLS_IF_HELPURL']);
- this.setStyle('logic_blocks');
- this.addFirstCase();
- this.setNextStatement(true);
- this.setPreviousStatement(true);
- this.setTooltip(Blockly.Msg['LISTS_CREATE_WITH_TOOLTIP']);
- },
-
- /**
- * Create XML to represent if/elseif/else inputs.
- *
- * @returns XML storage element.
- */
- mutationToDom(this: DynamicIfBlock): Element | null {
- if (!this.isDeadOrDying()) {
- // If we call finalizeConnections here without disabling events, we get into
- // an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- if (!this.elseifCount && !this.elseCount) return null;
-
- const container = Blockly.utils.xml.createElement('mutation');
- if (this.elseifCount) {
- container.setAttribute('elseif', `${this.elseifCount}`);
- }
- if (this.elseCount) {
- container.setAttribute('else', '1');
- }
- return container;
- },
-
- /**
- * Parse XML to restore the inputs.
- *
- * @param xmlElement XML storage element.
- */
- domToMutation(this: DynamicIfBlock, xmlElement: Element): void {
- if (xmlElement.getAttribute('inputs')) {
- this.deserializeInputs(xmlElement);
- } else {
- this.deserializeCounts(xmlElement);
- }
- },
-
- /**
- * Parses XML based on the 'inputs' attribute (non-standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeInputs(this: DynamicIfBlock, xmlElement: Element): void {
- const inputs = xmlElement.getAttribute('inputs');
- if (inputs) {
- const inputNumbers = inputs.split(',');
- if (this.getInput('IF0')) {
- this.removeInput('IF0');
- }
- if (this.getInput('DO0')) {
- this.removeInput('DO0');
- }
- const first = inputNumbers[0];
- this.appendValueInput('IF' + first)
- .setCheck('Boolean')
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_IF'], 'if');
- this.appendStatementInput('DO' + first).appendField(
- Blockly.Msg['CONTROLS_IF_MSG_THEN'],
- );
-
- for (let i = 1; i < inputNumbers.length; i++) {
- this.appendValueInput('IF' + inputNumbers[i])
- .setCheck('Boolean')
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSEIF'], 'elseif');
- this.appendStatementInput('DO' + inputNumbers[i]).appendField(
- Blockly.Msg['CONTROLS_IF_MSG_THEN'],
- );
- }
- }
- const hasElse = xmlElement.getAttribute('else');
- if (hasElse == 'true') {
- this.addElseInput();
- }
- },
-
- /**
- * Parses XML based on the 'elseif' and 'else' attributes (standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeCounts(this: DynamicIfBlock, xmlElement: Element): void {
- this.elseifCount =
- parseInt(xmlElement.getAttribute('elseif') ?? '0', 10) || 0;
- this.elseCount = parseInt(xmlElement.getAttribute('else') ?? '0', 10) || 0;
- for (let i = 1; i <= this.elseifCount; i++) {
- this.insertElseIf(this.inputList.length, i);
- }
- if (this.elseCount) {
- this.addElseInput();
- }
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- *
- * @returns The state of this block, ie the else if count and else state.
- */
- saveExtraState: function (this: DynamicIfBlock): IfExtraState | null {
- if (!this.isDeadOrDying() && !this.isCorrectlyFormatted()) {
- // If we call finalizeConnections here without disabling events, we get into
- // an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- if (!this.elseifCount && !this.elseCount) {
- return null;
- }
- const state = Object.create(null);
- if (this.elseifCount) {
- state['elseIfCount'] = this.elseifCount;
- }
- if (this.elseCount) {
- state['hasElse'] = true;
- }
- return state;
- },
-
- /**
- * Applies the given state to this block.
- *
- * @param state The state to apply to this block, ie the else if count
- * and else state.
- */
- loadExtraState: function (
- this: DynamicIfBlock,
- state: IfExtraState | string,
- ) {
- if (typeof state === 'string') {
- this.domToMutation(Blockly.utils.xml.textToDom(state));
- return;
- }
-
- this.elseifCount = state['elseIfCount'] || 0;
- this.elseCount = state['hasElse'] ? 1 : 0;
- for (let i = 1; i <= this.elseifCount; i++) {
- this.insertElseIf(this.inputList.length, i);
- }
- if (this.elseCount) {
- this.addElseInput();
- }
- },
-
- /**
- * Finds the index of a connection. Used to determine where in the block to
- * insert new inputs.
- *
- * @param connection A connection on this block.
- * @returns The index of the connection in the this.inputList.
- */
- findInputIndexForConnection(
- this: DynamicIfBlock,
- connection: Blockly.Connection,
- ): number | null {
- if (
- !connection.targetConnection ||
- connection.targetBlock()?.isInsertionMarker()
- ) {
- // This connection is available.
- return null;
- }
- for (let i = 0; i < this.inputList.length; i++) {
- const input = this.inputList[i];
- if (input.connection == connection) {
- return i;
- }
- }
- return null;
- },
-
- /**
- * Inserts a boolean value input and statement input at the specified index.
- *
- * @param index Index of the input before which to add new inputs.
- * @param id An ID to append to the case statement input names to make them
- * unique.
- * @returns The added inputs.
- */
- insertElseIf(
- this: DynamicIfBlock,
- index: number,
- id: string | number,
- ): CaseInputPair {
- const ifInput = this.appendValueInput('IF' + id)
- .setCheck('Boolean')
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSEIF'], 'elseif');
- const doInput = this.appendStatementInput('DO' + id).appendField(
- Blockly.Msg['CONTROLS_IF_MSG_THEN'],
- );
- this.moveInputBefore('IF' + id, this.inputList[index].name);
- this.moveInputBefore('DO' + id, this.inputList[index + 1].name);
- return {ifInput, doInput};
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when
- * a block is dragged over one of the connections on this block.
- *
- * @param connection The connection on this block that has a pending
- * connection.
- */
- onPendingConnection(
- this: DynamicIfBlock,
- connection: Blockly.Connection,
- ): void {
- if (connection.type === Blockly.NEXT_STATEMENT && !this.getInput('ELSE')) {
- this.addElseInput();
- }
- const inputIndex = this.findInputIndexForConnection(connection);
- if (inputIndex === null) {
- return;
- }
- const input = this.inputList[inputIndex];
- if (input.name.includes('IF')) {
- const nextIfInput = this.inputList[inputIndex + 2];
- if (!nextIfInput || nextIfInput.name == 'ELSE') {
- this.insertElseIf(inputIndex + 2, Blockly.utils.idGenerator.genUid());
- } else {
- const nextIfConnection =
- nextIfInput &&
- nextIfInput.connection &&
- nextIfInput.connection.targetConnection;
- if (
- nextIfConnection &&
- !nextIfConnection.getSourceBlock().isInsertionMarker()
- ) {
- this.insertElseIf(inputIndex + 2, Blockly.utils.idGenerator.genUid());
- }
- }
- }
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when a block
- * drag ends if the dragged block had a pending connection with this block.
- */
- finalizeConnections(this: DynamicIfBlock): void {
- const targetCaseConns = this.collectTargetCaseConns();
- const targetElseConn = this.getInput('ELSE')?.connection?.targetConnection;
-
- this.tearDownBlock();
-
- this.addFirstCase();
- this.addCaseInputs(targetCaseConns);
- if (targetElseConn) {
- this.addElseInput().connection?.connect(targetElseConn);
- }
-
- this.elseifCount = Math.max(targetCaseConns.length - 1, 0);
- this.elseCount = targetElseConn ? 1 : 0;
- },
-
- /**
- * Collects all of the target blocks attached to case inputs. If neither the
- * if nor the due input in a case has an attached block, that input is
- * skipped. If only one of them has an attached block, the other value in
- * the pair is undefined.
- *
- * @returns A list of target connections attached to case inputs.
- */
- collectTargetCaseConns(this: DynamicIfBlock): CaseConnectionPair[] {
- const targetConns = [];
- for (let i = 0; i < this.inputList.length - 1; i += 2) {
- const ifTarget = this.inputList[i].connection?.targetConnection;
- const doTarget = this.inputList[i + 1].connection?.targetConnection;
- if (!ifTarget && !doTarget) continue;
- targetConns.push({ifTarget, doTarget});
- }
- return targetConns;
- },
-
- /** Deletes all inputs on the block so it can be rebuilt. */
- tearDownBlock(this: DynamicIfBlock): void {
- for (let i = this.inputList.length - 1; i >= 0; i--) {
- this.removeInput(this.inputList[i].name);
- }
- },
-
- /**
- * Adds inputs for all of the given target connection pairs (if the input
- * doesn't already exist), and connects the target connections to them.
- *
- * This is essentially rebuilding all of the cases with strictly ascending
- * case numbers.
- *
- * @param targetConns The list of target connections to attach to this block.
- */
- addCaseInputs(this: DynamicIfBlock, targetConns: CaseConnectionPair[]): void {
- for (let i = 0; i < targetConns.length; i++) {
- let ifInput = this.getInput(`IF${i}`);
- let doInput = this.getInput(`DO${i}`);
- if (!ifInput || !doInput) {
- ({ifInput, doInput} = this.insertElseIf(i * 2, i));
- }
-
- const {ifTarget, doTarget} = targetConns[i];
- if (ifTarget) ifInput.connection?.connect(ifTarget);
- if (doTarget) doInput.connection?.connect(doTarget);
- }
- },
-
- /**
- * Adds an else input to this block.
- *
- * @returns The appended input.
- */
- addElseInput(this: DynamicIfBlock): Blockly.Input {
- return this.appendStatementInput('ELSE').appendField(
- Blockly.Msg['CONTROLS_IF_MSG_ELSE'],
- );
- },
-
- /**
- * Adds the first 'IF' and 'DO' inputs and their associated labels to this
- * block.
- */
- addFirstCase(this: DynamicIfBlock): void {
- this.appendValueInput('IF0')
- .setCheck('Boolean')
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_IF'], 'if');
- this.appendStatementInput('DO0').appendField(
- Blockly.Msg['CONTROLS_IF_MSG_THEN'],
- );
- },
-
- /**
- * Returns true if all of the inputs on this block are in order.
- * False otherwise.
- */
- isCorrectlyFormatted(this: DynamicIfBlock): boolean {
- for (let i = 0; i < this.inputList.length - 1; i += 2) {
- if (this.inputList[i].name !== `IF${i}`) return false;
- if (this.inputList[i + 1].name !== `DO${i}`) return false;
- }
- return true;
- },
-};
-
-Blockly.Blocks['dynamic_if'] = DYNAMIC_IF_MIXIN;
diff --git a/plugins/block-dynamic-connection/src/dynamic_list_create.ts b/plugins/block-dynamic-connection/src/dynamic_list_create.ts
deleted file mode 100644
index ebccdf6bd..000000000
--- a/plugins/block-dynamic-connection/src/dynamic_list_create.ts
+++ /dev/null
@@ -1,302 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Defines a version of the list_create block with dyanmic
- * inputs that appear when a block is dragged over inputs on the block.
- */
-
-import * as Blockly from 'blockly/core';
-
-/** Type of a block that has the DYNAMIC_LIST_CREATE_MIXIN. */
-type DynamicListCreateBlock = Blockly.Block & DynamicListCreateMixin;
-/* eslint-disable @typescript-eslint/no-empty-interface */
-/** This interface avoids a "circular reference" compile error. */
-interface DynamicListCreateMixin extends DynamicListCreateMixinType {}
-/* eslint-enable @typescript-eslint/no-empty-interface */
-type DynamicListCreateMixinType = typeof DYNAMIC_LIST_CREATE_MIXIN;
-
-const DYNAMIC_LIST_CREATE_MIXIN = {
- /** Minimum number of inputs for this block. */
- minInputs: 2,
-
- /** Count of item inputs. */
- itemCount: 0,
-
- /** Block for concatenating any number of strings. */
- init(this: DynamicListCreateBlock): void {
- this.itemCount = this.minInputs;
-
- this.setHelpUrl(Blockly.Msg['LISTS_CREATE_WITH_HELPURL']);
- this.setStyle('list_blocks');
- this.addFirstInput();
- for (let i = 1; i < this.minInputs; i++) {
- this.appendValueInput(`ADD${i}`);
- }
- this.setOutput(true, 'Array');
- this.setTooltip(Blockly.Msg['LISTS_CREATE_WITH_TOOLTIP']);
- },
-
- /**
- * Create XML to represent number of text inputs.
- *
- * @returns XML storage element.
- */
- mutationToDom(this: DynamicListCreateBlock): Element {
- if (!this.isDeadOrDying()) {
- // If we call finalizeConnections here without disabling events, we get into
- // an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- const container = Blockly.utils.xml.createElement('mutation');
- container.setAttribute('items', `${this.itemCount}`);
- return container;
- },
-
- /**
- * Parse XML to restore the text inputs.
- *
- * @param xmlElement XML storage element.
- */
- domToMutation(this: DynamicListCreateBlock, xmlElement: Element): void {
- if (xmlElement.getAttribute('inputs')) {
- this.deserializeInputs(xmlElement);
- } else {
- this.deserializeCounts(xmlElement);
- }
- },
-
- /**
- * Parses XML based on the 'inputs' attribute (non-standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeInputs(this: DynamicListCreateBlock, xmlElement: Element): void {
- const items = xmlElement.getAttribute('inputs');
- if (items) {
- const inputNames = items.split(',');
- this.inputList = [];
- inputNames.forEach((name) => this.appendValueInput(name));
- this.inputList[0].appendField(
- Blockly.Msg['LISTS_CREATE_WITH_INPUT_WITH'],
- );
- }
- },
-
- /**
- * Parses XML based on the 'items' attribute (standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeCounts(this: DynamicListCreateBlock, xmlElement: Element): void {
- this.itemCount = Math.max(
- parseInt(xmlElement.getAttribute('items') ?? '0', 10),
- this.minInputs,
- );
- // minInputs are added automatically.
- for (let i = this.minInputs; i < this.itemCount; i++) {
- this.appendValueInput('ADD' + i);
- }
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- *
- * @returns The state of this block, ie the item count.
- */
- saveExtraState: function (this: DynamicListCreateBlock): {itemCount: number} {
- if (!this.isDeadOrDying() && !this.isCorrectlyFormatted()) {
- // If we call finalizeConnections here without disabling events, we get
- // into an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- return {
- itemCount: this.itemCount,
- };
- },
-
- /**
- * Applies the given state to this block.
- *
- * @param state The state to apply to this block, ie the item count.
- */
- loadExtraState: function (
- this: DynamicListCreateBlock,
- state: {itemCount?: number; [x: string]: unknown} | string,
- ) {
- if (typeof state === 'string') {
- this.domToMutation(Blockly.utils.xml.textToDom(state));
- return;
- }
-
- this.itemCount = state['itemCount'] ?? 0;
- // minInputs are added automatically.
- for (let i = this.minInputs; i < this.itemCount; i++) {
- this.appendValueInput('ADD' + i);
- }
- },
-
- /**
- * Check whether a new input should be added and determine where it should go.
- *
- * @param connection The connection that has a pending connection.
- * @returns The index before which to insert a new input, or null if no input
- * should be added.
- */
- findInputIndexForConnection(
- this: DynamicListCreateBlock,
- connection: Blockly.Connection,
- ): number | null {
- if (
- !connection.targetConnection ||
- connection.targetBlock()?.isInsertionMarker()
- ) {
- // This connection is available.
- return null;
- }
-
- let connectionIndex = -1;
- for (let i = 0; i < this.inputList.length; i++) {
- if (this.inputList[i].connection == connection) {
- connectionIndex = i;
- }
- }
-
- if (connectionIndex == this.inputList.length - 1) {
- // This connection is the last one and already has a block in it, so
- // we should add a new connection at the end.
- return this.inputList.length + 1;
- }
-
- const nextInput = this.inputList[connectionIndex + 1];
- const nextConnection = nextInput?.connection?.targetConnection;
- if (
- nextConnection &&
- !nextConnection.getSourceBlock().isInsertionMarker()
- ) {
- return connectionIndex + 1;
- }
-
- // Don't add new connection.
- return null;
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when
- * a block is dragged over one of the connections on this block.
- *
- * @param connection The connection on this block that has a pending
- * connection.
- */
- onPendingConnection(
- this: DynamicListCreateBlock,
- connection: Blockly.Connection,
- ): void {
- const insertIndex = this.findInputIndexForConnection(connection);
- if (insertIndex == null) {
- return;
- }
- this.appendValueInput(`ADD${Blockly.utils.idGenerator.genUid()}`);
- this.moveNumberedInputBefore(this.inputList.length - 1, insertIndex);
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when a block
- * drag ends if the dragged block had a pending connection with this block.
- */
- finalizeConnections(this: DynamicListCreateBlock): void {
- const targetConns = this.removeUnnecessaryEmptyConns(
- this.inputList.map((i) => i.connection?.targetConnection),
- );
- this.tearDownBlock();
- this.addItemInputs(targetConns);
- this.itemCount = targetConns.length;
- },
-
- /** Deletes all inputs on the block so it can be rebuilt. */
- tearDownBlock(this: DynamicListCreateBlock): void {
- for (let i = this.inputList.length - 1; i >= 0; i--) {
- this.removeInput(this.inputList[i].name);
- }
- },
-
- /**
- * Filters the given target connections so that empty connections are removed,
- * unless we need those to reach the minimum input count. Empty connections
- * are removed starting at the end of the array.
- *
- * @param targetConns The list of connections associated with inputs.
- * @returns A filtered list of connections (or null/undefined) which should
- * be attached to inputs.
- */
- removeUnnecessaryEmptyConns(
- targetConns: Array,
- ): Array {
- const filteredConns = [...targetConns];
- for (let i = filteredConns.length - 1; i >= 0; i--) {
- if (!filteredConns[i] && filteredConns.length > this.minInputs) {
- filteredConns.splice(i, 1);
- }
- }
- return filteredConns;
- },
-
- /**
- * Adds inputs based on the given array of target cons. An input is added for
- * every entry in the array (if it does not already exist). If the entry is
- * a connection and not null/undefined the connection will be connected to
- * the input.
- *
- * @param targetConns The connections defining the inputs to add.
- */
- addItemInputs(
- this: DynamicListCreateBlock,
- targetConns: Array,
- ): void {
- const input = this.addFirstInput();
- const firstConn = targetConns[0];
- if (firstConn) input.connection?.connect(firstConn);
-
- for (let i = 1; i < targetConns.length; i++) {
- const input = this.appendValueInput(`ADD${i}`);
-
- const targetConn = targetConns[i];
- if (targetConn) input.connection?.connect(targetConn);
- }
- },
-
- /**
- * Adds the top input with the label to this block.
- *
- * @returns The added input.
- */
- addFirstInput(this: DynamicListCreateBlock): Blockly.Input {
- return this.appendValueInput('ADD0').appendField(
- Blockly.Msg['LISTS_CREATE_WITH_INPUT_WITH'],
- );
- },
-
- /**
- * Returns true if all of the inputs on this block are in order.
- * False otherwise.
- */
- isCorrectlyFormatted(this: DynamicListCreateBlock): boolean {
- for (let i = 0; i < this.inputList.length; i++) {
- if (this.inputList[i].name !== `ADD${i}`) return false;
- }
- return true;
- },
-};
-
-Blockly.Blocks['dynamic_list_create'] = DYNAMIC_LIST_CREATE_MIXIN;
diff --git a/plugins/block-dynamic-connection/src/dynamic_text_join.ts b/plugins/block-dynamic-connection/src/dynamic_text_join.ts
deleted file mode 100644
index 24163fa47..000000000
--- a/plugins/block-dynamic-connection/src/dynamic_text_join.ts
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Defines a version of the text_join block with dyanmic
- * inputs that appear when a block is dragged over inputs on the block.
- */
-
-import * as Blockly from 'blockly/core';
-
-/** Type of a block that has the DYNAMIC_TEXT_JOIN_MIXIN. */
-type DynamicTextJoinBlock = Blockly.Block & DynamicTextJoinMixin;
-/* eslint-disable @typescript-eslint/no-empty-interface */
-/** This interface avoids a "circular reference" compile error. */
-interface DynamicTextJoinMixin extends DynamicTextJoinMixinType {}
-/* eslint-enable @typescript-eslint/no-empty-interface */
-type DynamicTextJoinMixinType = typeof DYNAMIC_TEXT_JOIN_MIXIN;
-
-const DYNAMIC_TEXT_JOIN_MIXIN = {
- /** Minimum number of inputs for this block. */
- minInputs: 2,
-
- /** Count of the item inputs. */
- itemCount: 0,
-
- /** Block for concatenating any number of strings. */
- init(this: DynamicTextJoinBlock): void {
- this.itemCount = this.minInputs;
-
- this.setHelpUrl(Blockly.Msg['TEXT_JOIN_HELPURL']);
- this.setStyle('text_blocks');
- this.addFirstInput();
- for (let i = 1; i < this.minInputs; i++) this.appendValueInput(`ADD${i}`);
- this.setOutput(true, 'String');
- this.setTooltip(Blockly.Msg['TEXT_JOIN_TOOLTIP']);
- },
-
- /**
- * Create XML to represent number of text inputs.
- *
- * @returns XML storage element.
- */
- mutationToDom(this: DynamicTextJoinBlock): Element {
- if (!this.isDeadOrDying()) {
- // If we call finalizeConnections here without disabling events, we get into
- // an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- const container = Blockly.utils.xml.createElement('mutation');
- container.setAttribute('items', `${this.itemCount}`);
- return container;
- },
-
- /**
- * Parse XML to restore the text inputs.
- *
- * @param xmlElement XML storage element.
- */
- domToMutation(this: DynamicTextJoinBlock, xmlElement: Element): void {
- if (xmlElement.getAttribute('inputs')) {
- this.deserializeInputs(xmlElement);
- } else {
- this.deserializeCounts(xmlElement);
- }
- },
-
- /**
- * Parses XML based on the 'inputs' attribute (non-standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeInputs(this: DynamicTextJoinBlock, xmlElement: Element): void {
- const items = xmlElement.getAttribute('inputs');
- if (items) {
- const inputNames = items.split(',');
- this.inputList = [];
- inputNames.forEach((name) => this.appendValueInput(name));
- this.inputList[0].appendField(Blockly.Msg['TEXT_JOIN_TITLE_CREATEWITH']);
- }
- },
-
- /**
- * Parses XML based on the 'items' attribute (standard).
- *
- * @param xmlElement XML storage element.
- */
- deserializeCounts(this: DynamicTextJoinBlock, xmlElement: Element): void {
- this.itemCount = Math.max(
- parseInt(xmlElement.getAttribute('items') ?? '0', 10),
- this.minInputs,
- );
- // minInputs are added automatically.
- for (let i = this.minInputs; i < this.itemCount; i++) {
- this.appendValueInput('ADD' + i);
- }
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- *
- * @returns The state of this block, ie the item count.
- */
- saveExtraState: function (this: DynamicTextJoinBlock): {itemCount: number} {
- if (!this.isDeadOrDying() && !this.isCorrectlyFormatted()) {
- // If we call finalizeConnections here without disabling events, we get into
- // an event loop.
- Blockly.Events.disable();
- this.finalizeConnections();
- if (this instanceof Blockly.BlockSvg) this.initSvg();
- Blockly.Events.enable();
- }
-
- return {
- itemCount: this.itemCount,
- };
- },
-
- /**
- * Applies the given state to this block.
- *
- * @param state The state to apply to this block, ie the item count.
- */
- loadExtraState: function (
- this: DynamicTextJoinBlock,
- state: {itemCount?: number; [x: string]: unknown} | string,
- ) {
- if (typeof state === 'string') {
- this.domToMutation(Blockly.utils.xml.textToDom(state));
- return;
- }
-
- this.itemCount = state['itemCount'] ?? 0;
- // minInputs are added automatically.
- for (let i = this.minInputs; i < this.itemCount; i++) {
- this.appendValueInput('ADD' + i);
- }
- },
-
- /**
- * Check whether a new input should be added and determine where it should go.
- *
- * @param connection The connection that has a pending connection.
- * @returns The index before which to insert a new input, or null if no input
- * should be added.
- */
- findInputIndexForConnection(
- this: DynamicTextJoinBlock,
- connection: Blockly.Connection,
- ): number | null {
- if (
- !connection.targetConnection ||
- connection.targetBlock()?.isInsertionMarker()
- ) {
- // This connection is available.
- return null;
- }
-
- let connectionIndex = -1;
- for (let i = 0; i < this.inputList.length; i++) {
- if (this.inputList[i].connection == connection) {
- connectionIndex = i;
- }
- }
-
- if (connectionIndex == this.inputList.length - 1) {
- // This connection is the last one and already has a block in it, so
- // we should add a new connection at the end.
- return this.inputList.length + 1;
- }
-
- const nextInput = this.inputList[connectionIndex + 1];
- const nextConnection = nextInput?.connection?.targetConnection;
- if (
- nextConnection &&
- !nextConnection.getSourceBlock().isInsertionMarker()
- ) {
- return connectionIndex + 1;
- }
-
- // Don't add new connection.
- return null;
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when
- * a block is dragged over one of the connections on this block.
- *
- * @param connection The connection on this block that has a pending
- * connection.
- */
- onPendingConnection(
- this: DynamicTextJoinBlock,
- connection: Blockly.Connection,
- ): void {
- const insertIndex = this.findInputIndexForConnection(connection);
- if (insertIndex == null) {
- return;
- }
- this.appendValueInput(`ADD${Blockly.utils.idGenerator.genUid()}`);
- this.moveNumberedInputBefore(this.inputList.length - 1, insertIndex);
- },
-
- /**
- * Called by a monkey-patched version of InsertionMarkerManager when a block
- * drag ends if the dragged block had a pending connection with this block.
- */
- finalizeConnections(this: DynamicTextJoinBlock): void {
- const targetConns = this.removeUnnecessaryEmptyConns(
- this.inputList.map((i) => i.connection?.targetConnection),
- );
- this.tearDownBlock();
- this.addItemInputs(targetConns);
- this.itemCount = targetConns.length;
- },
-
- /** Deletes all inputs on this block so it can be rebuilt. */
- tearDownBlock(this: DynamicTextJoinBlock): void {
- for (let i = this.inputList.length - 1; i >= 0; i--) {
- this.removeInput(this.inputList[i].name);
- }
- },
-
- /**
- * Filters the given target connections so that empty connections are removed,
- * unless we need those to reach the minimum input count. Empty connections
- * are removed starting at the end of the array.
- *
- * @param targetConns The list of connections associated with inputs.
- * @returns A filtered list of connections (or null/undefined) which should
- * be attached to inputs.
- */
- removeUnnecessaryEmptyConns(
- this: DynamicTextJoinBlock,
- targetConns: Array,
- ): Array {
- const filteredConns = [...targetConns];
- for (let i = filteredConns.length - 1; i >= 0; i--) {
- if (!filteredConns[i] && filteredConns.length > this.minInputs) {
- filteredConns.splice(i, 1);
- }
- }
- return filteredConns;
- },
-
- /**
- * Adds inputs based on the given array of target conns. An input is added for
- * every entry in the array (if it does not already exist). If the entry is
- * a connection and not null/undefined the connection will be connected to
- * the input.
- *
- * @param targetConns The connections defining the inputs to add.
- */
- addItemInputs(
- this: DynamicTextJoinBlock,
- targetConns: Array,
- ): void {
- const input = this.addFirstInput();
- const firstConn = targetConns[0];
- if (firstConn) input.connection?.connect(firstConn);
-
- for (let i = 1; i < targetConns.length; i++) {
- const input = this.appendValueInput(`ADD${i}`);
-
- const targetConn = targetConns[i];
- if (targetConn) input.connection?.connect(targetConn);
- }
- },
-
- /**
- * Adds the top input with the label to this block.
- *
- * @returns The added input.
- */
- addFirstInput(this: DynamicTextJoinBlock): Blockly.Input {
- return this.appendValueInput('ADD0').appendField(
- Blockly.Msg['TEXT_JOIN_TITLE_CREATEWITH'],
- );
- },
-
- /**
- * Returns true if all of the inputs on this block are in order.
- * False otherwise.
- */
- isCorrectlyFormatted(this: DynamicTextJoinBlock): boolean {
- for (let i = 0; i < this.inputList.length; i++) {
- if (this.inputList[i].name !== `ADD${i}`) return false;
- }
- return true;
- },
-};
-
-Blockly.Blocks['dynamic_text_join'] = DYNAMIC_TEXT_JOIN_MIXIN;
diff --git a/plugins/block-dynamic-connection/src/index.ts b/plugins/block-dynamic-connection/src/index.ts
deleted file mode 100644
index 4da41caf7..000000000
--- a/plugins/block-dynamic-connection/src/index.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Adds blocks that replace the built-in mutator UI with dynamic
- * connections that appear when a block is dragged over inputs on the block.
- */
-
-import * as Blockly from 'blockly/core';
-import './dynamic_if';
-import './dynamic_text_join';
-import './dynamic_list_create';
-import {decoratePreviewer, blockIsDynamic} from './connection_previewer';
-
-export {decoratePreviewer, blockIsDynamic};
-
-export const overrideOldBlockDefinitions = function (): void {
- Blockly.Blocks['lists_create_with'] = Blockly.Blocks['dynamic_list_create'];
- Blockly.Blocks['text_join'] = Blockly.Blocks['dynamic_text_join'];
- Blockly.Blocks['controls_if'] = Blockly.Blocks['dynamic_if'];
-};
-
-/**
- * Finalizes connections when certain events (such as block deletion) are
- * detected.
- *
- * @param e
- */
-export function finalizeConnections(e: Blockly.Events.Abstract) {
- if (e.type === Blockly.Events.BLOCK_DELETE) {
- const ws = Blockly.Workspace.getById(e.workspaceId ?? '');
- if (!ws) return;
- for (const block of ws.getAllBlocks() as Blockly.BlockSvg[]) {
- if (blockIsDynamic(block)) {
- block.finalizeConnections();
- }
- }
- }
-}
diff --git a/plugins/block-dynamic-connection/test/dynamic_if.mocha.js b/plugins/block-dynamic-connection/test/dynamic_if.mocha.js
deleted file mode 100644
index 96f78683d..000000000
--- a/plugins/block-dynamic-connection/test/dynamic_if.mocha.js
+++ /dev/null
@@ -1,649 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const Blockly = require('blockly/core');
-require('blockly/blocks');
-const En = require('blockly/msg/en');
-const {overrideOldBlockDefinitions} = require('../src/index');
-
-const assert = chai.assert;
-
-Blockly.setLocale(En);
-
-suite('If block', function () {
- /**
- * Asserts that the if block has the expected inputs.
- * @param {!Blockly.Block} block The block to check.
- * @param {!Array} expectedInputs The expected inputs.
- * @param {string=} type The block type expected. Defaults to 'dynamic_if'.
- */
- function assertBlockStructure(block, expectedInputs, type = 'dynamic_if') {
- assert.equal(block.type, type);
- assert.equal(block.inputList.length, expectedInputs.length);
- assert.isTrue(expectedInputs.length >= 2);
- for (let i = 0; i < expectedInputs.length; i++) {
- assert.match(block.inputList[i].name, expectedInputs[i]);
- }
- }
-
- /**
- * Creates a boolean block and connects it to the specified connection.
- * @param {!Blockly.Workspace} workspace The workspace.
- * @param {!Blockly.Connection} connection The connection to connect a new
- * block to.
- */
- function connectBooleanBlockToConnection(workspace, connection) {
- const newBlock = workspace.newBlock('logic_boolean');
- const targetConnection = newBlock.outputConnection;
- connection.connect(targetConnection);
- }
-
- /**
- * Creates a boolean block and connects it to the specified connection.
- * @param {!Blockly.Workspace} workspace The workspace.
- * @param {!Blockly.Connection} connection The connection to connect a new
- * block to.
- */
- function connectStatementBlockToConnection(workspace, connection) {
- const newBlock = workspace.newBlock('text_print');
- const targetConnection = newBlock.previousConnection;
- connection.connect(targetConnection);
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- overrideOldBlockDefinitions();
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Creation', function () {
- const block = this.workspace.newBlock('dynamic_if');
- assertBlockStructure(block, [/IF0/, /DO0/]);
- });
-
- suite('adding inputs', function () {
- test('attaching the first predicate does not create a case', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/IF0/, /DO0/]);
- });
-
- test('attaching the second predicate creates a case', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
- connectBooleanBlockToConnection(this.workspace, connection);
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/IF0/, /DO0/, /IF.*/, /DO.*/]);
- });
-
- test('attaching the first statement creates an else', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('DO0').connection;
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/IF0/, /DO0/, /ELSE/]);
- });
-
- test('attaching the second statement creates an else', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('DO0').connection;
- connectStatementBlockToConnection(this.workspace, connection);
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/IF0/, /DO0/, /ELSE/]);
- });
-
- test('attaching to the next connection creates an else', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.nextConnection;
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/IF0/, /DO0/, /ELSE/]);
- });
- });
-
- suite('finalizing inputs', function () {
- test('the block does not go below one case', function () {
- const block = this.workspace.newBlock('dynamic_if');
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/]);
- });
-
- test('a case with no blocks is removed', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
- connectBooleanBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/]);
- });
-
- test('a case with a predicate and statements is kept', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
- connectBooleanBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
- connectBooleanBlockToConnection(
- this.workspace,
- block.inputList[2].connection,
- );
- connectStatementBlockToConnection(
- this.workspace,
- block.inputList[3].connection,
- );
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/, /IF1/, /DO1/]);
- });
-
- test('a case with only a predicate is kept', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
- connectBooleanBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
- connectBooleanBlockToConnection(
- this.workspace,
- block.inputList[2].connection,
- );
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/, /IF1/, /DO1/]);
- });
-
- test('a case with only statements is kept', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('IF0').connection;
- connectBooleanBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
- connectStatementBlockToConnection(
- this.workspace,
- block.inputList[3].connection,
- );
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/, /IF1/, /DO1/]);
- });
-
- test('an else with no statements is removed', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('DO0').connection;
- block.onPendingConnection(connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/]);
- });
-
- test('an else with statements is kept', function () {
- const block = this.workspace.newBlock('dynamic_if');
- const connection = block.getInput('DO0').connection;
- block.onPendingConnection(connection);
- connectStatementBlockToConnection(
- this.workspace,
- block.getInput('ELSE').connection,
- );
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/IF0/, /DO0/, /ELSE/]);
- });
- });
-
- const testCases = [
- {
- title: 'empty XML',
- xml: ' ',
- expectedXml:
- '' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/IF0/, /DO0/]);
- },
- },
- {
- title: 'one if one else - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/IF0/, /DO0/, /ELSE/]);
- },
- },
- {
- title: 'multiple inputs with children - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [
- /IF0/,
- /DO0/,
- /IF1/,
- /DO1/,
- /IF2/,
- /DO2/,
- /ELSE/,
- ]);
- },
- },
- {
- title: 'multiple nonsequential inputs - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/IF0/, /DO0/, /IF1/, /DO1/, /IF2/, /DO2/]);
- },
- },
- {
- title: 'one if one else - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' ',
- expectedXml:
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/IF0/, /DO0/], 'dynamic_if');
- },
- },
- {
- title: 'one if one else with children - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' TRUE \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(
- block,
- [/IF0/, /DO0/, /IF1/, /DO1/, /ELSE/],
- 'dynamic_if',
- );
- },
- },
- {
- title: 'one if one else with children - json',
- json: {
- type: 'dynamic_if',
- id: '1',
- extraState: {
- elseIfCount: 1,
- hasElse: true,
- },
- inputs: {
- IF0: {
- block: {
- type: 'logic_boolean',
- id: '2',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- IF1: {
- block: {
- type: 'logic_boolean',
- id: '3',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- ELSE: {
- block: {
- type: 'text_print',
- id: '4',
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(
- block,
- [/IF0/, /DO0/, /IF1/, /DO1/, /ELSE/],
- 'dynamic_if',
- );
- },
- },
- {
- title: 'one if one else with children - json with stringified old XML',
- json: {
- type: 'dynamic_if',
- id: '1',
- extraState: ' ',
- inputs: {
- IF1: {
- block: {
- type: 'logic_boolean',
- id: '2',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- IF3: {
- block: {
- type: 'logic_boolean',
- id: '3',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- IF2: {
- block: {
- type: 'logic_boolean',
- id: '4',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- ELSE: {
- block: {
- type: 'text_print',
- id: '5',
- },
- },
- },
- },
- expectedJson: {
- type: 'dynamic_if',
- id: '1',
- extraState: {
- elseIfCount: 2,
- hasElse: true,
- },
- inputs: {
- IF0: {
- block: {
- type: 'logic_boolean',
- id: '2',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- IF1: {
- block: {
- type: 'logic_boolean',
- id: '3',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- IF2: {
- block: {
- type: 'logic_boolean',
- id: '4',
- fields: {
- BOOL: 'TRUE',
- },
- },
- },
- ELSE: {
- block: {
- type: 'text_print',
- id: '5',
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(
- block,
- [/IF0/, /DO0/, /IF1/, /DO1/, /IF2/, /DO2/, /ELSE/],
- 'dynamic_if',
- );
- },
- },
- ];
- testHelpers.runSerializationTestSuite(testCases, Blockly);
-});
diff --git a/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js b/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js
deleted file mode 100644
index 1a600c409..000000000
--- a/plugins/block-dynamic-connection/test/dynamic_list_create.mocha.js
+++ /dev/null
@@ -1,548 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const Blockly = require('blockly/core');
-require('blockly/blocks');
-const En = require('blockly/msg/en');
-const {overrideOldBlockDefinitions} = require('../src/index');
-
-const assert = chai.assert;
-
-Blockly.setLocale(En);
-
-suite('List create block', function () {
- /**
- * Asserts that the list create block has the expected inputs.
- * @param {!Blockly.Block} block The block to check.
- * @param {!Array} expectedInputs The expected inputs.
- * @type {string=} The block type expected. Defaults to 'dynamic_list_create'.
- */
- function assertBlockStructure(
- block,
- expectedInputs,
- type = 'dynamic_list_create',
- ) {
- assert.equal(block.type, type);
- assert.equal(block.inputList.length, expectedInputs.length);
- for (let i = 0; i < expectedInputs.length; i++) {
- assert.match(block.inputList[i].name, expectedInputs[i]);
- }
- }
-
- /**
- * Creates a block and connects it to the specified connection.
- * @param {!Blockly.Workspace} workspace The workspace.
- * @param {!Blockly.Connection} connection The connection to connect a new
- * block to.
- */
- function connectBlockToConnection(workspace, connection) {
- const newBlock = workspace.newBlock('text');
- const targetConnection = newBlock.outputConnection;
- connection.connect(targetConnection);
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- overrideOldBlockDefinitions();
-
- const def1 = {...Blockly.Blocks['dynamic_list_create']};
- def1.minInputs = 1;
- Blockly.Blocks['dynamic_list_1_input'] = def1;
-
- const def5 = {...Blockly.Blocks['dynamic_list_create']};
- def5.minInputs = 5;
- Blockly.Blocks['dynamic_list_5_inputs'] = def5;
- });
-
- teardown(function () {
- this.workspace.dispose();
- delete Blockly.Blocks['dynamic_list_5_inputs'];
- });
-
- suite('Creation', function () {
- test('the default definition has two inputs', function () {
- const block = this.workspace.newBlock('dynamic_list_create');
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- });
-
- test('minInputs controls the number of inputs', function () {
- const block = this.workspace.newBlock('dynamic_list_5_inputs');
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_list_5_inputs',
- );
- });
- });
-
- suite('adding inputs', function () {
- test('attaching min items does not add an input', function () {
- const block = this.workspace.newBlock('dynamic_list_1_input');
- const connection = block.getInput('ADD0').connection;
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/ADD0/], 'dynamic_list_1_input');
- });
-
- test('attaching three items creates an input', function () {
- const block = this.workspace.newBlock('dynamic_list_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/ADD0/, /ADD.*/], 'dynamic_list_1_input');
- });
- });
-
- suite('finalizing inputs', function () {
- test('the block does not go below min inputs', function () {
- const block = this.workspace.newBlock('dynamic_list_5_inputs');
-
- block.finalizeConnections();
-
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_list_5_inputs',
- );
- });
-
- test('an extra input with no blocks is removed', function () {
- const block = this.workspace.newBlock('dynamic_list_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/ADD0/], 'dynamic_list_1_input');
- });
-
- test('an extra input with blocks is kept', function () {
- const block = this.workspace.newBlock('dynamic_list_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
- connectBlockToConnection(this.workspace, block.inputList[1].connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/ADD0/, /ADD1/], 'dynamic_list_1_input');
- });
-
- test('extra inputs are removed starting at the end', function () {
- const block = this.workspace.newBlock('dynamic_list_5_inputs');
- const connection0 = block.getInput('ADD0').connection;
- const connection1 = block.getInput('ADD1').connection;
- connectBlockToConnection(this.workspace, connection0);
- connectBlockToConnection(this.workspace, connection1);
- block.onPendingConnection(connection0);
-
- block.finalizeConnections();
-
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_list_5_inputs',
- );
- assert.isOk(block.getInputTargetBlock('ADD0'));
- assert.isNotOk(
- block.getInputTargetBlock('ADD1'),
- 'Expected the empty input created by pending to still exist.',
- );
- assert.isOk(block.getInputTargetBlock('ADD2'));
- });
- });
-
- const testCases = [
- {
- title: 'empty XML',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'default state - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'two inputs with one child - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'multiple non-sequential inputs with children - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'two inputs one child - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'standard/core XML still maintains minimum inputs',
- xml:
- '' +
- ' ' +
- ' ',
- expectedXml:
- '\n' +
- ' \n ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/], 'lists_create_with');
- },
- },
- {
- title: 'two inputs one child - json',
- json: {
- type: 'dynamic_list_create',
- id: '1',
- extraState: {
- itemCount: 2,
- },
- inputs: {
- ADD1: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - json',
- json: {
- type: 'dynamic_list_create',
- id: '1',
- extraState: {
- itemCount: 4,
- },
- inputs: {
- ADD0: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD1: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD3: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'multiple inputs with children - json with stringified old XML',
- json: {
- type: 'dynamic_list_create',
- id: '1',
- extraState:
- ' ',
- inputs: {
- ADD1: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD5: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD4: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- expectedJson: {
- type: 'dynamic_list_create',
- id: '1',
- extraState: {
- itemCount: 4,
- },
- inputs: {
- ADD0: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD1: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD3: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- ];
- testHelpers.runSerializationTestSuite(testCases, Blockly);
-});
diff --git a/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js b/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js
deleted file mode 100644
index 6f944d95a..000000000
--- a/plugins/block-dynamic-connection/test/dynamic_text_join.mocha.js
+++ /dev/null
@@ -1,550 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const Blockly = require('blockly/core');
-require('blockly/blocks');
-const En = require('blockly/msg/en');
-const {overrideOldBlockDefinitions} = require('../src/index');
-
-const assert = chai.assert;
-
-Blockly.setLocale(En);
-
-suite('Text join block', function () {
- /**
- * Asserts that the text join block has the expected inputs.
- * @param {!Blockly.Block} block The block to check.
- * @param {!Array} expectedInputs The expected inputs.
- * @type {string=} The block type expected. Defaults to 'dynamic_text_join'.
- */
- function assertBlockStructure(
- block,
- expectedInputs,
- type = 'dynamic_text_join',
- ) {
- assert.equal(block.type, type);
- assert.equal(block.inputList.length, expectedInputs.length);
- for (let i = 0; i < expectedInputs.length; i++) {
- assert.match(block.inputList[i].name, expectedInputs[i]);
- }
- }
-
- /**
- * Creates a block and connects it to the specified connection.
- * @param {!Blockly.Workspace} workspace The workspace.
- * @param {!Blockly.Connection} connection The connection to connect a new
- * block to.
- */
- function connectBlockToConnection(workspace, connection) {
- const newBlock = workspace.newBlock('text');
- const targetConnection = newBlock.outputConnection;
- connection.connect(targetConnection);
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- overrideOldBlockDefinitions();
-
- const def1 = {...Blockly.Blocks['dynamic_text_join']};
- def1.minInputs = 1;
- Blockly.Blocks['dynamic_text_1_input'] = def1;
-
- const def5 = {...Blockly.Blocks['dynamic_text_join']};
- def5.minInputs = 5;
- Blockly.Blocks['dynamic_text_5_inputs'] = def5;
- });
-
- teardown(function () {
- this.workspace.dispose();
- delete Blockly.Blocks['dynamic_text_5_inputs'];
- });
-
- suite('Creation', function () {
- test('the default definition has two inputs', function () {
- const block = this.workspace.newBlock('dynamic_text_join');
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- });
-
- test('minInputs controls the number of inputs', function () {
- const block = this.workspace.newBlock('dynamic_text_5_inputs');
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_text_5_inputs',
- );
- });
- });
-
- suite('adding inputs', function () {
- test('attaching min items does not add an input', function () {
- const block = this.workspace.newBlock('dynamic_text_1_input');
- const connection = block.getInput('ADD0').connection;
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/ADD0/], 'dynamic_text_1_input');
- });
-
- test('attaching three items creates an input', function () {
- const block = this.workspace.newBlock('dynamic_text_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
-
- block.onPendingConnection(connection);
-
- assertBlockStructure(block, [/ADD0/, /ADD.*/], 'dynamic_text_1_input');
- });
- });
-
- suite('finalizing inputs', function () {
- test('the block does not go below min inputs', function () {
- const block = this.workspace.newBlock('dynamic_text_5_inputs');
-
- block.finalizeConnections();
-
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_text_5_inputs',
- );
- });
-
- test('an extra input with no blocks is removed', function () {
- const block = this.workspace.newBlock('dynamic_text_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/ADD0/], 'dynamic_text_1_input');
- });
-
- test('an extra input with blocks is kept', function () {
- const block = this.workspace.newBlock('dynamic_text_1_input');
- const connection = block.getInput('ADD0').connection;
- connectBlockToConnection(this.workspace, connection);
- block.onPendingConnection(connection);
- connectBlockToConnection(this.workspace, block.inputList[1].connection);
-
- block.finalizeConnections();
-
- assertBlockStructure(block, [/ADD0/, /ADD1/], 'dynamic_text_1_input');
- });
-
- test('extra inputs are removed starting at the end', function () {
- const block = this.workspace.newBlock('dynamic_text_5_inputs');
- const connection0 = block.getInput('ADD0').connection;
- const connection1 = block.getInput('ADD1').connection;
- connectBlockToConnection(this.workspace, connection0);
- connectBlockToConnection(this.workspace, connection1);
- block.onPendingConnection(connection0);
-
- block.finalizeConnections();
-
- assertBlockStructure(
- block,
- [/ADD0/, /ADD1/, /ADD2/, /ADD3/, /ADD4/],
- 'dynamic_text_5_inputs',
- );
- assert.isOk(block.getInputTargetBlock('ADD0'));
- assert.isNotOk(
- block.getInputTargetBlock('ADD1'),
- 'Expected the empty input created by pending to still exist.',
- );
- assert.isOk(block.getInputTargetBlock('ADD2'));
- });
- });
-
- const testCases = [
- {
- title: 'empty XML',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'default state - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'two inputs with one child - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'multiple non-sequential inputs with children - old serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'two inputs one child - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' abc \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - standard serialization',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' b \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' d \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' c \n' +
- ' \n \n' +
- ' \n' +
- ' \n' +
- ' a \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title: 'standard/core XML still maintains minimum inputs',
- xml:
- '' +
- ' ' +
- ' ',
- expectedXml:
- '\n' +
- ' \n ',
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/], 'lists_create_with');
- },
- },
- {
- title: 'two inputs one child - json',
- json: {
- type: 'dynamic_text_join',
- id: '1',
- extraState: {
- itemCount: 2,
- },
- inputs: {
- ADD1: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/]);
- },
- },
- {
- title: 'multiple inputs with children - json',
- json: {
- type: 'dynamic_text_join',
- id: '1',
- extraState: {
- itemCount: 4,
- },
- inputs: {
- ADD0: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD1: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD3: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- {
- title:
- 'multiple non-sequential inputs with children - ' +
- 'json with stringified old XML',
- json: {
- type: 'dynamic_text_join',
- id: '1',
- extraState:
- ' ',
- inputs: {
- ADD1: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD5: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD4: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- expectedJson: {
- type: 'dynamic_text_join',
- id: '1',
- extraState: {
- itemCount: 4,
- },
- inputs: {
- ADD0: {
- block: {
- type: 'text',
- id: '2',
- fields: {
- TEXT: 'a',
- },
- },
- },
- ADD1: {
- block: {
- type: 'text',
- id: '3',
- fields: {
- TEXT: 'b',
- },
- },
- },
- ADD2: {
- block: {
- type: 'text',
- id: '4',
- fields: {
- TEXT: 'c',
- },
- },
- },
- ADD3: {
- block: {
- type: 'text',
- id: '5',
- fields: {
- TEXT: 'd',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertBlockStructure(block, [/ADD0/, /ADD1/, /ADD2/, /ADD3/]);
- },
- },
- ];
- testHelpers.runSerializationTestSuite(testCases, Blockly);
-});
diff --git a/plugins/block-dynamic-connection/test/index.html b/plugins/block-dynamic-connection/test/index.html
deleted file mode 100644
index dc96c578f..000000000
--- a/plugins/block-dynamic-connection/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/block-dynamic-connection/test/index.ts b/plugins/block-dynamic-connection/test/index.ts
deleted file mode 100644
index 3b12c355e..000000000
--- a/plugins/block-dynamic-connection/test/index.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Dynamic block connection test playground.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import * as BlockDynamicConnection from '../src/index';
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const ws = Blockly.inject(blocklyDiv, options);
- ws.addChangeListener(BlockDynamicConnection.finalizeConnections);
- return ws;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- BlockDynamicConnection.overrideOldBlockDefinitions();
-
- const toolbox = {
- kind: 'flyoutToolbox',
- contents: [
- {
- kind: 'block',
- type: 'text_join',
- },
- {
- kind: 'block',
- type: 'lists_create_with',
- },
- {
- kind: 'block',
- type: 'controls_if',
- },
- {
- kind: 'block',
- type: 'logic_boolean',
- fields: {
- BOOL: 'TRUE',
- },
- },
- {
- kind: 'block',
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- {
- kind: 'block',
- type: 'math_number',
- fields: {
- NUM: '123',
- },
- },
- {
- kind: 'block',
- type: 'text_print',
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- block: undefined,
- },
- },
- },
- ],
- };
-
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox,
- plugins: {
- connectionPreviewer: BlockDynamicConnection.decoratePreviewer(
- Blockly.InsertionMarkerPreviewer,
- ),
- },
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/block-dynamic-connection/tsconfig.json b/plugins/block-dynamic-connection/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/block-dynamic-connection/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/block-plus-minus/CHANGELOG.md b/plugins/block-plus-minus/CHANGELOG.md
deleted file mode 100644
index 9988afca0..000000000
--- a/plugins/block-plus-minus/CHANGELOG.md
+++ /dev/null
@@ -1,692 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-### ⚠ BREAKING CHANGES
-
-* Add ARIA labels for block-plus-minus (#2696)
-* Bump Blockly dependency to v13 (#2704)
-
-### Bug Fixes
-
-* Add ARIA labels for block-plus-minus ([#2696](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2696))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [9.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-plus-minus@9.0.9...@blockly/block-plus-minus@9.0.10) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-plus-minus@9.0.8...@blockly/block-plus-minus@9.0.9) (2026-01-22)
-
-
-### Bug Fixes
-
-* Update JSDoc types in plus-minus procedure blocks ([#2673](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2673)) ([25142c1](https://github.com/RaspberryPiFoundation/blockly-samples/commit/25142c1a5aff0b3fb01890ca83ee9b2d5bb0278b))
-
-
-
-## [9.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-plus-minus@9.0.7...@blockly/block-plus-minus@9.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-plus-minus@9.0.6...@blockly/block-plus-minus@9.0.7) (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))
-
-
-
-## [9.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.5...@blockly/block-plus-minus@9.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.4...@blockly/block-plus-minus@9.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.3...@blockly/block-plus-minus@9.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.2...@blockly/block-plus-minus@9.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.1...@blockly/block-plus-minus@9.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@9.0.0...@blockly/block-plus-minus@9.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [9.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.16...@blockly/block-plus-minus@9.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))
-
-
-
-## [8.0.16](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.15...@blockly/block-plus-minus@8.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.15](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.14...@blockly/block-plus-minus@8.0.15) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.14](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.13...@blockly/block-plus-minus@8.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.13](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.12...@blockly/block-plus-minus@8.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.12](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.11...@blockly/block-plus-minus@8.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.11](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.10...@blockly/block-plus-minus@8.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.10](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.9...@blockly/block-plus-minus@8.0.10) (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)
-
-
-
-
-
-## [8.0.9](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.8...@blockly/block-plus-minus@8.0.9) (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))
-
-
-
-
-
-## [8.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.7...@blockly/block-plus-minus@8.0.8) (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))
-
-
-
-
-
-## [8.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.6...@blockly/block-plus-minus@8.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.5...@blockly/block-plus-minus@8.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.4...@blockly/block-plus-minus@8.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.3...@blockly/block-plus-minus@8.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)
-
-
-
-## [8.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.2...@blockly/block-plus-minus@8.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.1...@blockly/block-plus-minus@8.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [8.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@8.0.0...@blockly/block-plus-minus@8.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))
-
-
-
-## [8.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.7...@blockly/block-plus-minus@8.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))
-
-
-### Bug Fixes
-
-* block plus minus incompatibility with v11 ([#2169](https://github.com/google/blockly-samples/issues/2169)) ([2b857d4](https://github.com/google/blockly-samples/commit/2b857d4528402aebc0f536897fe3ea9447b4117b))
-* build for the v11 branch ([#2268](https://github.com/google/blockly-samples/issues/2268)) ([c7a4fc5](https://github.com/google/blockly-samples/commit/c7a4fc5e72c5e8d9e9bc926bbbbadd1eb31792fc))
-* 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)
-* use undeprecated align value ([3535d19](https://github.com/google/blockly-samples/commit/3535d19c54a049dd7592c117c479cab4017ddac9))
-
-
-
-## [7.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.6...@blockly/block-plus-minus@7.0.7) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.5...@blockly/block-plus-minus@7.0.6) (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))
-
-
-
-## [7.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.4...@blockly/block-plus-minus@7.0.5) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.3...@blockly/block-plus-minus@7.0.4) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.2...@blockly/block-plus-minus@7.0.3) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.1...@blockly/block-plus-minus@7.0.2) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@7.0.0...@blockly/block-plus-minus@7.0.1) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.8...@blockly/block-plus-minus@7.0.0) (2023-12-07)
-
-
-### ⚠ BREAKING CHANGES
-
-* bump min blockly version
-
-### Bug Fixes
-
-* bump min blockly version ([1dbf1b8](https://github.com/google/blockly-samples/commit/1dbf1b88ecaa85ddd447d7b120e3aac4c3a48f93))
-* text join block warning when using block-plus-minus plugin ([#2025](https://github.com/google/blockly-samples/issues/2025)) ([7b076df](https://github.com/google/blockly-samples/commit/7b076dfa0c9195a0687962679a6eb431875b37fa)), closes [#2022](https://github.com/google/blockly-samples/issues/2022) [#1877](https://github.com/google/blockly-samples/issues/1877) [#2022](https://github.com/google/blockly-samples/issues/2022)
-
-
-
-## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.7...@blockly/block-plus-minus@6.0.8) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.6...@blockly/block-plus-minus@6.0.7) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.5...@blockly/block-plus-minus@6.0.6) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.4...@blockly/block-plus-minus@6.0.5) (2023-10-30)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.3...@blockly/block-plus-minus@6.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.2...@blockly/block-plus-minus@6.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.1...@blockly/block-plus-minus@6.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@6.0.0...@blockly/block-plus-minus@6.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@5.0.1...@blockly/block-plus-minus@6.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@5.0.0...@blockly/block-plus-minus@5.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.17...@blockly/block-plus-minus@5.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))
-
-
-
-## [4.0.17](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.16...@blockly/block-plus-minus@4.0.17) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.16](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.15...@blockly/block-plus-minus@4.0.16) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.15](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.14...@blockly/block-plus-minus@4.0.15) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.14](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.13...@blockly/block-plus-minus@4.0.14) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.13](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.12...@blockly/block-plus-minus@4.0.13) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.12](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.11...@blockly/block-plus-minus@4.0.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.11](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.10...@blockly/block-plus-minus@4.0.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.9...@blockly/block-plus-minus@4.0.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.8...@blockly/block-plus-minus@4.0.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.7...@blockly/block-plus-minus@4.0.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.6...@blockly/block-plus-minus@4.0.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.5...@blockly/block-plus-minus@4.0.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.4...@blockly/block-plus-minus@4.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.3...@blockly/block-plus-minus@4.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.2...@blockly/block-plus-minus@4.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.1...@blockly/block-plus-minus@4.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@4.0.0...@blockly/block-plus-minus@4.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-plus-minus@3.0.22...@blockly/block-plus-minus@4.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Features
-
-* convert block-plus-minus :toolbox definition from xml to json ([#1285](https://github.com/google/blockly-samples/issues/1285)) ([d8d1c67](https://github.com/google/blockly-samples/commit/d8d1c676b87ee695ea1f070937651fbabe5377c3))
-
-
-### Bug Fixes
-
-* generator imports for use with blockly v9 ([#1305](https://github.com/google/blockly-samples/issues/1305)) ([51d59e9](https://github.com/google/blockly-samples/commit/51d59e98d172400e45fc74755f577e068df9996b))
-* 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))
-
-
-
-## 3.0.22 (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))
-
-
-
-
-
-## 3.0.21 (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))
-
-
-
-
-
-## 3.0.19 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## 3.0.18 (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))
-
-
-
-
-
-## 3.0.17 (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))
-
-
-
-
-
-## 3.0.16 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/block-plus-minus
-
-
-
-
-
-## 3.0.15 (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))
-
-
-
-
-
-## 3.0.14 (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/plugins/block-plus-minus/README.md b/plugins/block-plus-minus/README.md
deleted file mode 100644
index 076a681de..000000000
--- a/plugins/block-plus-minus/README.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# @blockly/block-plus-minus [](https://github.com/google/blockly)
-
-A group of [Blockly](https://www.npmjs.com/package/blockly) blocks that replace the built-in mutator UI with a +/-
-based UI.
-
-Currently this only affects the built-in blocks that use mutators (controls_if, text_join, list_create_with,
-procedures_defnoreturn, and procedures_defreturn).
-
-
-
-But the ability to easily add this to your own mutators may be added
-in the future.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/block-plus-minus
-```
-
-### npm
-
-```
-npm install @blockly/block-plus-minus --save
-```
-
-## Usage
-
-### Import
-
-```js
-import Blockly from 'blockly';
-import '@blockly/block-plus-minus';
-```
-
-### Localization and text customization
-
-The plus and minus buttons have ARIA labels to communicate their purpose to
-screenreaders. These are localizable; additionally, if you want to customize the
-labels (for example, to use a different term that "input" for procedure blocks)
-you can do so by adjusting the messages:
-
-```javascript
-Blockly.Msg['ARIA_LABEL_ADD_INPUT'] = 'Add parameter';
-// Inject workspace, etc...
-```
-
-### XML
-
-Blocks will automatically use the +/- UI when loaded from XML. But here is some example XML incase you are trying to
-add specific mutations of blocks:
-
-#### If
-
-```xml
-
-```
-
-
-
-```xml
-
-
-
-```
-
-
-
-```xml
-
-
-
-```
-
-
-
-#### Text Join
-
-```xml
-
-```
-
-
-
-```xml
-
-
-
-```
-
-
-
-#### List Create
-
-```xml
-
-```
-
-
-
-```xml
-
-
-
-```
-
-
-
-## License
-
-Apache 2.0
diff --git a/plugins/block-plus-minus/package.json b/plugins/block-plus-minus/package.json
deleted file mode 100644
index 0695325f0..000000000
--- a/plugins/block-plus-minus/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "name": "@blockly/block-plus-minus",
- "version": "13.2.0",
- "description": "A group of blocks that replace the built-in mutator UI with a +/- based UI.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "unpkg": "./dist/index.js",
- "author": "Beka Westberg",
- "keywords": [
- "blockly",
- "block",
- "mutator"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/block-plus-minus#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/block-plus-minus"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "sinon": "^22.0.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/block-plus-minus/readme-media/AllBlocks.png b/plugins/block-plus-minus/readme-media/AllBlocks.png
deleted file mode 100644
index fca021aac..000000000
Binary files a/plugins/block-plus-minus/readme-media/AllBlocks.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/If.png b/plugins/block-plus-minus/readme-media/If.png
deleted file mode 100644
index 6c610b9c0..000000000
Binary files a/plugins/block-plus-minus/readme-media/If.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/IfElseIf.png b/plugins/block-plus-minus/readme-media/IfElseIf.png
deleted file mode 100644
index b0978dd49..000000000
Binary files a/plugins/block-plus-minus/readme-media/IfElseIf.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/IfElseIfElse.png b/plugins/block-plus-minus/readme-media/IfElseIfElse.png
deleted file mode 100644
index 58f44ae6e..000000000
Binary files a/plugins/block-plus-minus/readme-media/IfElseIfElse.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/ListCreateWith.png b/plugins/block-plus-minus/readme-media/ListCreateWith.png
deleted file mode 100644
index 047b187be..000000000
Binary files a/plugins/block-plus-minus/readme-media/ListCreateWith.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/ListCreateWithNone.png b/plugins/block-plus-minus/readme-media/ListCreateWithNone.png
deleted file mode 100644
index 7008164c5..000000000
Binary files a/plugins/block-plus-minus/readme-media/ListCreateWithNone.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/TextJoin.png b/plugins/block-plus-minus/readme-media/TextJoin.png
deleted file mode 100644
index a25561891..000000000
Binary files a/plugins/block-plus-minus/readme-media/TextJoin.png and /dev/null differ
diff --git a/plugins/block-plus-minus/readme-media/TextJoinNone.png b/plugins/block-plus-minus/readme-media/TextJoinNone.png
deleted file mode 100644
index 99915d566..000000000
Binary files a/plugins/block-plus-minus/readme-media/TextJoinNone.png and /dev/null differ
diff --git a/plugins/block-plus-minus/src/field_minus.js b/plugins/block-plus-minus/src/field_minus.js
deleted file mode 100644
index 990a354b4..000000000
--- a/plugins/block-plus-minus/src/field_minus.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A function that creates a minus button used for mutation.
- */
-'use strict';
-
-import * as Blockly from 'blockly/core';
-import {getExtraBlockState} from './serialization_helper';
-
-/**
- * Creates a minus image field used for mutation.
- * @param {!String} altText An accessibility label for the minus button.
- * @param {Object=} args Untyped args passed to block.minus when the field
- * is clicked.
- * @returns {Blockly.FieldImage} The minus field.
- */
-export function createMinusField(altText, args = undefined) {
- const minus = new Blockly.FieldImage(minusImage, 15, 15, altText, onClick_);
- /**
- * Untyped args passed to block.minus when the field is clicked.
- * @type {?(Object|undefined)}
- * @private
- */
- minus.args_ = args;
- return minus;
-}
-
-/**
- * Calls block.minus(args) when the minus field is clicked.
- * @param {Blockly.FieldImage} minusField The field being clicked.
- * @private
- */
-function onClick_(minusField) {
- // TODO: This is a dupe of the mutator code, anyway to unify?
- const block = minusField.getSourceBlock();
-
- if (block.isInFlyout) {
- return;
- }
-
- Blockly.Events.setGroup(true);
- const oldExtraState = getExtraBlockState(block);
- block.minus(minusField.args_);
- const newExtraState = getExtraBlockState(block);
-
- if (oldExtraState != newExtraState) {
- Blockly.Events.fire(
- new Blockly.Events.BlockChange(
- block,
- 'mutation',
- null,
- oldExtraState,
- newExtraState,
- ),
- );
- }
- Blockly.Events.setGroup(false);
-}
-
-const minusImage =
- 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAw' +
- 'MC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBkPS' +
- 'JNMTggMTFoLTEyYy0xLjEwNCAwLTIgLjg5Ni0yIDJzLjg5NiAyIDIgMmgxMmMxLjEwNCAw' +
- 'IDItLjg5NiAyLTJzLS44OTYtMi0yLTJ6IiBmaWxsPSJ3aGl0ZSIgLz48L3N2Zz4K';
diff --git a/plugins/block-plus-minus/src/field_plus.js b/plugins/block-plus-minus/src/field_plus.js
deleted file mode 100644
index df15364a7..000000000
--- a/plugins/block-plus-minus/src/field_plus.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A field for a plus button used for mutation.
- */
-'use strict';
-
-import * as Blockly from 'blockly/core';
-import {getExtraBlockState} from './serialization_helper';
-
-/**
- * Creates a plus image field used for mutation.
- * @param {!String} altText An accessibility label for the plus button.
- * @param {Object=} args Untyped args passed to block.minus when the field
- * is clicked.
- * @returns {Blockly.FieldImage} The Plus field.
- */
-export function createPlusField(altText, args = undefined) {
- const plus = new Blockly.FieldImage(plusImage, 15, 15, altText, onClick_);
- /**
- * Untyped args passed to block.plus when the field is clicked.
- * @type {?(Object|undefined)}
- * @private
- */
- plus.args_ = args;
- return plus;
-}
-
-/**
- * Calls block.plus(args) when the plus field is clicked.
- * @param {!Blockly.FieldImage} plusField The field being clicked.
- * @private
- */
-function onClick_(plusField) {
- // TODO: This is a dupe of the mutator code, anyway to unify?
- const block = plusField.getSourceBlock();
-
- if (block.isInFlyout) {
- return;
- }
-
- Blockly.Events.setGroup(true);
- const oldExtraState = getExtraBlockState(block);
- block.plus(plusField.args_);
- const newExtraState = getExtraBlockState(block);
-
- if (oldExtraState != newExtraState) {
- Blockly.Events.fire(
- new Blockly.Events.BlockChange(
- block,
- 'mutation',
- null,
- oldExtraState,
- newExtraState,
- ),
- );
- }
- Blockly.Events.setGroup(false);
-}
-
-const plusImage =
- 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC' +
- '9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBkPSJNMT' +
- 'ggMTBoLTR2LTRjMC0xLjEwNC0uODk2LTItMi0ycy0yIC44OTYtMiAybC4wNzEgNGgtNC4wNz' +
- 'FjLTEuMTA0IDAtMiAuODk2LTIgMnMuODk2IDIgMiAybDQuMDcxLS4wNzEtLjA3MSA0LjA3MW' +
- 'MwIDEuMTA0Ljg5NiAyIDIgMnMyLS44OTYgMi0ydi00LjA3MWw0IC4wNzFjMS4xMDQgMCAyLS' +
- '44OTYgMi0ycy0uODk2LTItMi0yeiIgZmlsbD0id2hpdGUiIC8+PC9zdmc+Cg==';
diff --git a/plugins/block-plus-minus/src/if.js b/plugins/block-plus-minus/src/if.js
deleted file mode 100644
index 5bf48db47..000000000
--- a/plugins/block-plus-minus/src/if.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Changes the if block to use a +/- mutator UI.
- */
-
-import * as Blockly from 'blockly/core';
-import {createMinusField} from './field_minus';
-import {createPlusField} from './field_plus';
-
-const controlsIfMutator = {
- /**
- * Number of else-if inputs on this block.
- * @type {number}
- */
- elseIfCount_: 0,
- /**
- * Whether this block has an else input or not.
- * @type {boolean}
- */
- hasElse_: false,
-
- /**
- * Creates XML to represent the number of else-if and else inputs.
- * @returns {Element} XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function () {
- if (!this.elseIfCount_ && !this.hasElse_) {
- return null;
- }
- const container = Blockly.utils.xml.createElement('mutation');
- container.setAttribute('elseif', this.elseIfCount_);
- if (this.hasElse_) {
- // Has to be stored as an int for backwards compat.
- container.setAttribute('else', 1);
- }
- return container;
- },
-
- /**
- * Parses XML to restore the else-if and else inputs.
- * @param {!Element} xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- const targetCount = parseInt(xmlElement.getAttribute('elseif'), 10) || 0;
- this.hasElse_ = !!parseInt(xmlElement.getAttribute('else'), 10) || 0;
- if (this.hasElse_ && !this.getInput('ELSE')) {
- this.appendStatementInput('ELSE').appendField(
- Blockly.Msg['CONTROLS_IF_MSG_ELSE'],
- );
- }
- this.updateShape_(targetCount);
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- * @returns {{elseIfCount: (number|undefined),
- * haseElse: (boolean|undefined)}} The state of this block, ie the else
- * if count and else state.
- */
- saveExtraState: function () {
- if (!this.elseIfCount_ && !this.hasElse_) {
- return null;
- }
- const state = Object.create(null);
- if (this.elseIfCount_) {
- state['elseIfCount'] = this.elseIfCount_;
- }
- if (this.hasElse_) {
- state['hasElse'] = true;
- }
- return state;
- },
-
- /**
- * Applies the given state to this block.
- * @param {*} state The state to apply to this block, ie the else if count and
- * else state.
- */
- loadExtraState: function (state) {
- const targetCount = state['elseIfCount'] || 0;
- this.hasElse_ = state['hasElse'] || false;
- if (this.hasElse_ && !this.getInput('ELSE')) {
- this.appendStatementInput('ELSE').appendField(
- Blockly.Msg['CONTROLS_IF_MSG_ELSE'],
- );
- }
- this.updateShape_(targetCount);
- },
-
- /**
- * Adds else-if and do inputs to the block until the block matches the
- * target else-if count.
- * @param {number} targetCount The target number of else-if inputs.
- * @this {Blockly.Block}
- * @private
- */
- updateShape_: function (targetCount) {
- while (this.elseIfCount_ < targetCount) {
- this.addElseIf_();
- }
- while (this.elseIfCount_ > targetCount) {
- this.removeElseIf_();
- }
- },
-
- /**
- * Callback for the plus field. Adds an else-if input to the block.
- */
- plus: function () {
- this.addElseIf_();
- },
-
- /**
- * Callback for the minus field. Triggers "removing" the input at the specific
- * index.
- * @see removeInput_
- * @param {number} index The index of the else-if input to "remove".
- * @this {Blockly.Block}
- */
- minus: function (index) {
- if (this.elseIfCount_ == 0) {
- return;
- }
- this.removeElseIf_(index);
- },
-
- /**
- * Adds an else-if and a do input to the bottom of the block.
- * @this {Blockly.Block}
- * @private
- */
- addElseIf_: function () {
- // Because else-if inputs are 1-indexed we increment first, decrement last.
- this.elseIfCount_++;
- this.appendValueInput('IF' + this.elseIfCount_)
- .setCheck('Boolean')
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_ELSEIF'])
- .appendField(
- createMinusField(
- Blockly.Msg['ARIA_LABEL_REMOVE_ELSE_IF'],
- this.elseIfCount_,
- ),
- 'MINUS' + this.elseIfCount_,
- );
- this.appendStatementInput('DO' + this.elseIfCount_).appendField(
- Blockly.Msg['CONTROLS_IF_MSG_THEN'],
- );
-
- // Handle if-elseif-else block.
- if (this.getInput('ELSE')) {
- this.moveInputBefore('ELSE', /* put at end */ null);
- }
- },
-
- /**
- * Appears to remove the input at the given index. Actually shifts attached
- * blocks and then removes the input at the bottom of the block. This is to
- * make sure the inputs are always IF0, IF1, etc with no gaps.
- * @param {?number=} index The index of the input to "remove", or undefined
- * to remove the last input.
- * @this {Blockly.Block}
- * @private
- */
- removeElseIf_: function (index = undefined) {
- // The strategy for removing a part at an index is to:
- // - Kick any blocks connected to the relevant inputs.
- // - Move all connect blocks from the other inputs up.
- // - Remove the last input.
- // This makes sure all of our indices are correct.
-
- if (index !== undefined && index != this.elseIfCount_) {
- // Each else-if is two inputs on the block:
- // the else-if input and the do input.
- const elseIfIndex = index * 2;
- const inputs = this.inputList;
- let connection = inputs[elseIfIndex].connection; // If connection.
- if (connection.isConnected()) {
- connection.disconnect();
- }
- connection = inputs[elseIfIndex + 1].connection; // Do connection.
- if (connection.isConnected()) {
- connection.disconnect();
- }
- this.bumpNeighbours();
- for (let i = elseIfIndex + 2, input; (input = this.inputList[i]); i++) {
- if (input.name == 'ELSE') {
- break; // Should be last, so break.
- }
- const targetConnection = input.connection.targetConnection;
- if (targetConnection) {
- this.inputList[i - 2].connection.connect(targetConnection);
- }
- }
- }
-
- this.removeInput('IF' + this.elseIfCount_);
- this.removeInput('DO' + this.elseIfCount_);
- // Because else-if inputs are 1-indexed we increment first, decrement last.
- this.elseIfCount_--;
- },
-};
-
-/**
- * Adds the initial plus button to the if block.
- * @this {Blockly.Block}
- */
-const controlsIfHelper = function () {
- this.getInput('IF0').insertFieldAt(
- 0,
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_ELSE_IF']),
- 'PLUS',
- );
-};
-
-if (Blockly.Extensions.isRegistered('controls_if_mutator')) {
- Blockly.Extensions.unregister('controls_if_mutator');
-}
-Blockly.Extensions.registerMutator(
- 'controls_if_mutator',
- controlsIfMutator,
- controlsIfHelper,
-);
diff --git a/plugins/block-plus-minus/src/index.js b/plugins/block-plus-minus/src/index.js
deleted file mode 100644
index 5e2cb3c17..000000000
--- a/plugins/block-plus-minus/src/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Adds blocks that replace the built-in mutator UI with a +/- UI.
- */
-
-import './if.js';
-import './list_create.js';
-import './procedures.js';
-import './text_join';
diff --git a/plugins/block-plus-minus/src/list_create.js b/plugins/block-plus-minus/src/list_create.js
deleted file mode 100644
index 85cd33c52..000000000
--- a/plugins/block-plus-minus/src/list_create.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Changes the list_create block to use a +/- mutator UI.
- */
-
-import * as Blockly from 'blockly/core';
-import {createPlusField} from './field_plus';
-import {createMinusField} from './field_minus';
-
-// Delete original block because there's no way to unregister it:
-// https://github.com/RaspberryPiFoundation/blockly-samples/issues/768#issuecomment-885663394
-delete Blockly.Blocks['lists_create_with'];
-
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'lists_create_with',
- message0: '%{BKY_LISTS_CREATE_EMPTY_TITLE} %1',
- args0: [
- {
- type: 'input_dummy',
- name: 'EMPTY',
- },
- ],
- output: 'Array',
- style: 'list_blocks',
- helpUrl: '%{BKY_LISTS_CREATE_WITH_HELPURL}',
- tooltip: '%{BKY_LISTS_CREATE_WITH_TOOLTIP}',
- mutator: 'new_list_create_with_mutator',
- },
-]);
-
-const listCreateMutator = {
- /**
- * Number of item inputs the block has.
- * @type {number}
- */
- itemCount_: 0,
-
- /**
- * Creates XML to represent number of text inputs.
- * @returns {!Element} XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function () {
- const container = Blockly.utils.xml.createElement('mutation');
- container.setAttribute('items', this.itemCount_);
- return container;
- },
- /**
- * Parses XML to restore the text inputs.
- * @param {!Element} xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- const targetCount = parseInt(xmlElement.getAttribute('items'), 10);
- this.updateShape_(targetCount);
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- * @returns {{itemCount: number}} The state of this block, ie the item count.
- */
- saveExtraState: function () {
- return {
- itemCount: this.itemCount_,
- };
- },
-
- /**
- * Applies the given state to this block.
- * @param {*} state The state to apply to this block, ie the item count.
- */
- loadExtraState: function (state) {
- this.updateShape_(state['itemCount']);
- },
-
- /**
- * Adds inputs to the block until it reaches the target number of inputs.
- * @param {number} targetCount The target number of inputs for the block.
- * @this {Blockly.Block}
- * @private
- */
- updateShape_: function (targetCount) {
- while (this.itemCount_ < targetCount) {
- this.addPart_();
- }
- while (this.itemCount_ > targetCount) {
- this.removePart_();
- }
- this.updateMinus_();
- },
-
- /**
- * Callback for the plus image. Adds an input to the end of the block and
- * updates the state of the minus.
- */
- plus: function () {
- this.addPart_();
- this.updateMinus_();
- },
-
- /**
- * Callback for the minus image. Removes an input from the end of the block
- * and updates the state of the minus.
- */
- minus: function () {
- if (this.itemCount_ == 0) {
- return;
- }
- this.removePart_();
- this.updateMinus_();
- },
-
- // To properly keep track of indices we have to increment before/after adding
- // the inputs, and decrement the opposite.
- // Because we want our first input to be ADD0 (not ADD1) we increment after.
-
- /**
- * Adds an input to the end of the block. If the block currently has no
- * inputs it updates the top 'EMPTY' input to receive a block.
- * @this {Blockly.Block}
- * @private
- */
- addPart_: function () {
- if (this.itemCount_ == 0) {
- this.removeInput('EMPTY');
- this.topInput_ = this.appendValueInput('ADD' + this.itemCount_)
- .appendField(
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_LIST_ITEM']),
- 'PLUS',
- )
- .appendField(Blockly.Msg['LISTS_CREATE_WITH_INPUT_WITH']);
- } else {
- this.appendValueInput('ADD' + this.itemCount_);
- }
- this.itemCount_++;
- },
-
- /**
- * Removes an input from the end of the block. If we are removing the last
- * input this updates the block to have an 'EMPTY' top input.
- * @this {Blockly.Block}
- * @private
- */
- removePart_: function () {
- this.itemCount_--;
- this.removeInput('ADD' + this.itemCount_);
- if (this.itemCount_ == 0) {
- this.topInput_ = this.appendDummyInput('EMPTY')
- .appendField(
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_LIST_ITEM']),
- 'PLUS',
- )
- .appendField(Blockly.Msg['LISTS_CREATE_EMPTY_TITLE']);
- }
- },
-
- /**
- * Makes it so the minus is visible iff there is an input available to remove.
- * @private
- */
- updateMinus_: function () {
- const minusField = this.getField('MINUS');
- if (!minusField && this.itemCount_ > 0) {
- this.topInput_.insertFieldAt(
- 1,
- createMinusField(Blockly.Msg['ARIA_LABEL_REMOVE_LIST_ITEM']),
- 'MINUS',
- );
- } else if (minusField && this.itemCount_ < 1) {
- this.topInput_.removeField('MINUS');
- }
- },
-};
-
-/**
- * Updates the shape of the block to have 3 inputs if no mutation is provided.
- * @this {Blockly.Block}
- */
-const listCreateHelper = function () {
- this.getInput('EMPTY').insertFieldAt(
- 0,
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_LIST_ITEM']),
- 'PLUS',
- );
- this.updateShape_(3);
-};
-
-Blockly.Extensions.registerMutator(
- 'new_list_create_with_mutator',
- listCreateMutator,
- listCreateHelper,
-);
diff --git a/plugins/block-plus-minus/src/procedures.js b/plugins/block-plus-minus/src/procedures.js
deleted file mode 100644
index a00034bac..000000000
--- a/plugins/block-plus-minus/src/procedures.js
+++ /dev/null
@@ -1,694 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Changes the procedure blocks to use a +/- mutator UI.
- */
-
-import * as Blockly from 'blockly/core';
-import {createMinusField} from './field_minus';
-import {createPlusField} from './field_plus';
-
-Blockly.Msg['PROCEDURE_VARIABLE'] = 'variable:';
-
-// Delete original blocks because there's no way to unregister them:
-// https://github.com/RaspberryPiFoundation/blockly-samples/issues/768#issuecomment-885663394
-delete Blockly.Blocks['procedures_defnoreturn'];
-delete Blockly.Blocks['procedures_defreturn'];
-
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'procedures_defnoreturn',
- message0: '%{BKY_PROCEDURES_DEFNORETURN_TITLE} %1 %2',
- message1: '%{BKY_PROCEDURES_DEFNORETURN_DO} %1',
- args0: [
- {
- type: 'field_input',
- name: 'NAME',
- text: '',
- },
- {
- type: 'input_dummy',
- name: 'TOP',
- },
- ],
- args1: [
- {
- type: 'input_statement',
- name: 'STACK',
- },
- ],
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_DEFNORETURN_HELPURL}',
- tooltip: '%{BKY_PROCEDURES_DEFNORETURN_TOOLTIP}',
- extensions: [
- 'get_procedure_def_no_return',
- 'procedure_context_menu',
- 'procedure_rename',
- 'procedure_vars',
- ],
- mutator: 'procedure_def_mutator',
- },
- {
- type: 'procedures_defreturn',
- message0: '%{BKY_PROCEDURES_DEFRETURN_TITLE} %1 %2',
- message1: '%{BKY_PROCEDURES_DEFRETURN_DO} %1',
- message2: '%{BKY_PROCEDURES_DEFRETURN_RETURN} %1',
- args0: [
- {
- type: 'field_input',
- name: 'NAME',
- text: '',
- },
- {
- type: 'input_dummy',
- name: 'TOP',
- },
- ],
- args1: [
- {
- type: 'input_statement',
- name: 'STACK',
- },
- ],
- args2: [
- {
- type: 'input_value',
- align: 'right',
- name: 'RETURN',
- },
- ],
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_DEFRETURN_HELPURL}',
- tooltip: '%{BKY_PROCEDURES_DEFRETURN_TOOLTIP}',
- extensions: [
- 'get_procedure_def_return',
- 'procedure_context_menu',
- 'procedure_rename',
- 'procedure_vars',
- ],
- mutator: 'procedure_def_mutator',
- },
-]);
-
-/**
- * Defines the what are essentially info-getters for the procedures_defnoreturn
- * block.
- * @type {{callType_: string, getProcedureDef: (function(): Array)}}
- */
-const getDefNoReturn = {
- /**
- * Returns info about this block to be used by the Blockly.Procedures.
- * @returns {Array} An array of info.
- * @this {Blockly.Block}
- */
- getProcedureDef: function () {
- const argNames = this.argData_.map((elem) => elem.model.name);
- return [this.getFieldValue('NAME'), argNames, false];
- },
-
- /**
- * Used by the context menu to create a caller block.
- * @type {string}
- */
- callType_: 'procedures_callnoreturn',
-};
-
-Blockly.Extensions.registerMixin('get_procedure_def_no_return', getDefNoReturn);
-
-/**
- * Defines what are essentially info-getters for the procedures_def_return
- * block.
- * @type {{callType_: string, getProcedureDef: (function(): Array)}}
- */
-const getDefReturn = {
- /**
- * Returns info about this block to be used by the Blockly.Procedures.
- * @returns {Array} An array of info.
- * @this {Blockly.Block}
- */
- getProcedureDef: function () {
- const argNames = this.argData_.map((elem) => elem.model.name);
- return [this.getFieldValue('NAME'), argNames, true];
- },
- /**
- * Used by the context menu to create a caller block.
- * @type {string}
- */
- callType_: 'procedures_callreturn',
-};
-
-Blockly.Extensions.registerMixin('get_procedure_def_return', getDefReturn);
-
-const procedureContextMenu = {
- /**
- * Adds an option to create a caller block.
- * Adds an option to create a variable getter for each variable included in
- * the procedure definition.
- * @this {Blockly.Block}
- * @param {!Array} options The current options for the context menu.
- */
- customContextMenu: function (options) {
- if (this.isInFlyout) {
- return;
- }
-
- // Add option to create caller.
- const name = this.getFieldValue('NAME');
- const text = Blockly.Msg['PROCEDURES_CREATE_DO'].replace('%1', name);
-
- const xml = Blockly.utils.xml.createElement('block');
- xml.setAttribute('type', this.callType_);
- xml.appendChild(this.mutationToDom(true));
- const callback = Blockly.ContextMenu.callbackFactory(this, xml);
-
- options.push({
- enabled: true,
- text: text,
- callback: callback,
- });
-
- if (this.isCollapsed()) {
- return;
- }
-
- // Add options to create getters for each parameter.
- const varModels = this.getVarModels();
- for (const model of varModels) {
- const text = Blockly.Msg['VARIABLES_SET_CREATE_GET'].replace(
- '%1',
- model.name,
- );
-
- const xml = Blockly.utils.xml.createElement('block');
- xml.setAttribute('type', 'variables_get');
- xml.appendChild(Blockly.Variables.generateVariableFieldDom(model));
- const callback = Blockly.ContextMenu.callbackFactory(this, xml);
-
- options.push({
- enabled: true,
- text: text,
- callback: callback,
- });
- }
- },
-};
-
-Blockly.Extensions.registerMixin(
- 'procedure_context_menu',
- procedureContextMenu,
-);
-
-const procedureDefMutator = {
- /**
- * Create XML to represent the argument inputs.
- * @param {boolean=} isForCaller If true include the procedure name and
- * argument IDs. Used by Blockly.Procedures.mutateCallers for
- * reconnection.
- * @returns {!Element} XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function (isForCaller = false) {
- const container = Blockly.utils.xml.createElement('mutation');
- if (isForCaller) {
- container.setAttribute('name', this.getFieldValue('NAME'));
- }
- this.argData_.forEach((element) => {
- const argument = Blockly.utils.xml.createElement('arg');
- const argModel = element.model;
- argument.setAttribute('name', argModel.name);
- argument.setAttribute('varid', argModel.getId());
- argument.setAttribute('argid', element.argId);
- if (isForCaller) {
- argument.setAttribute('paramid', element.argId);
- }
- container.appendChild(argument);
- });
-
- // Not used by this block, but necessary if switching back and forth
- // between this mutator UI and the default UI.
- if (!this.hasStatements_) {
- container.setAttribute('statements', 'false');
- }
-
- return container;
- },
-
- /**
- * Parse XML to restore the argument inputs.
- * @param {!Element} xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- // We have to handle this so that the user doesn't add blocks to the stack,
- // in which case it would be impossible to return to the old mutators.
- this.hasStatements_ = xmlElement.getAttribute('statements') !== 'false';
- if (!this.hasStatements_) {
- this.removeInput('STACK');
- }
-
- const names = [];
- const varIds = [];
- const argIds = [];
- for (const childNode of xmlElement.childNodes) {
- if (childNode.nodeName.toLowerCase() == 'arg') {
- names.push(childNode.getAttribute('name'));
- varIds.push(
- childNode.getAttribute('varid') || childNode.getAttribute('varId'),
- );
- argIds.push(childNode.getAttribute('argid'));
- }
- }
- this.updateShape_(names, varIds, argIds);
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- * @returns {{params: (!Array<{name: string, id: string}>|undefined),
- * hasStatements: (boolean|undefined)}} The state of this block, eg the
- * parameters and statements.
- */
- saveExtraState: function () {
- if (!this.argData_.length && this.hasStatements_) {
- return null;
- }
-
- const state = Object.create(null);
- if (this.argData_.length) {
- state['params'] = [];
- this.argData_.forEach((arg) => {
- const model = arg.model;
- state['params'].push({
- name: model.name,
- id: model.getId(),
- argId: arg.argId,
- });
- });
- }
- if (!this.hasStatements_) {
- state['hasStatements'] = false;
- }
- return state;
- },
-
- /**
- * Applies the given state to this block.
- * @param {*} state The state to apply to this block, eg the parameters and
- * statements.
- */
- loadExtraState: function (state) {
- // We have to handle this so that the user doesn't add blocks to the stack,
- // in which case it would be impossible to return to the old mutators.
- this.hasStatements_ = state['hasStatements'] !== false;
- if (!this.hasStatements_) {
- this.removeInput('STACK');
- }
-
- const names = [];
- const varIds = [];
- const argIds = [];
- if (state['params']) {
- for (let i = 0; i < state['params'].length; i++) {
- const param = state['params'][i];
- names.push(param['name']);
- varIds.push(param['id']);
- argIds.push(param['argId']);
- }
- }
- this.updateShape_(names, varIds, argIds);
- },
-
- /**
- * Adds arguments to the block until it matches the targets.
- * @param {!Array} names An array of argument names to display.
- * @param {!Array} varIds An array of variable IDs associated with
- * those names.
- * @param {!Array} argIds An array of argument IDs associated with
- * those names.
- * @this {Blockly.Block}
- * @private
- */
- updateShape_: function (names, varIds, argIds) {
- if (names.length != varIds.length) {
- throw Error('names and varIds must have the same length.');
- }
- // Usually it's more efficient to modify the block, rather than tearing it
- // down and rebuilding (less render calls), but in this case it's easier
- // to just work from scratch.
-
- // We need to remove args in reverse order so that it doesn't mess up
- // as removeArg_ modifies our array.
- for (let i = this.argData_.length - 1; i >= 0; i--) {
- this.removeArg_(this.argData_[i].argId);
- }
- this.argData_ = [];
- const length = varIds.length;
- for (let i = 0; i < length; i++) {
- this.addArg_(names[i], varIds[i], argIds[i]);
- }
- Blockly.Procedures.mutateCallers(this);
- },
-
- /**
- * Callback for the plus image. Adds an argument to the block and mutates
- * callers to match.
- */
- plus: function () {
- this.addArg_();
- Blockly.Procedures.mutateCallers(this);
- },
-
- /**
- * Callback for the minus image. Removes the argument associated with the
- * given argument ID and mutates the callers to match.
- * @param {string} argId The argId of the argument to remove.
- * @this {Blockly.Block}
- */
- minus: function (argId) {
- if (!this.argData_.length) {
- return;
- }
- this.removeArg_(argId);
- Blockly.Procedures.mutateCallers(this);
- },
-
- /**
- * Adds an argument to the block and updates the block's parallel tracking
- * arrays as appropriate.
- * @param {?string=} name An optional name for the argument.
- * @param {?string=} varId An optional variable ID for the argument.
- * @param {?string=} argId An optional argument ID for the argument
- * (used to identify the argument across variable merges).
- * @this {Blockly.Block}
- * @private
- */
- addArg_: function (name = null, varId = null, argId = null) {
- if (!this.argData_.length) {
- const withField = new Blockly.FieldLabel(
- Blockly.Msg['PROCEDURES_BEFORE_PARAMS'],
- );
- this.getInput('TOP').appendField(withField, 'WITH');
- }
-
- const argNames = this.argData_.map((elem) => elem.model.name);
- name =
- name ||
- Blockly.Variables.generateUniqueNameFromOptions(
- Blockly.Procedures.DEFAULT_ARG,
- argNames,
- );
- const variable = Blockly.Variables.getOrCreateVariablePackage(
- this.workspace,
- varId,
- name,
- '',
- );
- argId = argId || Blockly.utils.idGenerator.genUid();
-
- this.addVarInput_(name, argId);
- if (this.getInput('STACK')) {
- this.moveInputBefore(argId, 'STACK');
- } else {
- this.moveInputBefore(argId, 'RETURN');
- }
-
- this.argData_.push({
- model: variable,
- argId: argId,
- });
- },
-
- /**
- * Removes the argument associated with the given argument ID from the block.
- * @param {string} argId An ID used to track arguments on the block.
- * @private
- */
- removeArg_: function (argId) {
- if (this.removeInput(argId, true)) {
- if (this.argData_.length == 1) {
- // Becoming argumentless.
- this.getInput('TOP').removeField('WITH');
- }
- this.argData_ = this.argData_.filter((element) => element.argId != argId);
- }
- },
-
- /**
- * Appends the actual inputs and fields associated with an argument to the
- * block.
- * @param {string} name The name of the argument.
- * @param {string} argId The UUID of the argument (different from var ID).
- * @this {Blockly.Block}
- * @private
- */
- addVarInput_: function (name, argId) {
- const nameField = new Blockly.FieldTextInput(name, this.validator_);
- nameField.onFinishEditing_ = this.finishEditing_.bind(nameField);
- nameField.varIdsToDelete_ = [];
- nameField.preEditVarModel_ = null;
-
- this.appendDummyInput(argId)
- .setAlign(Blockly.inputs.Align.RIGHT)
- .appendField(
- createMinusField(Blockly.Msg['ARIA_LABEL_REMOVE_INPUT'], argId),
- )
- .appendField(Blockly.Msg['PROCEDURE_VARIABLE']) // Untranslated!
- .appendField(nameField, argId); // The name of the field is the arg id.
- },
-
- /**
- * Validates text entered into the argument name field.
- * @param {string} newName The new text entered into the field.
- * @returns {?string} The field's new value.
- * @this {Blockly.FieldTextInput}
- */
- validator_: function (newName) {
- const sourceBlock = this.getSourceBlock();
- const workspace = sourceBlock.workspace;
- const argData = sourceBlock.argData_;
- const argDatum = sourceBlock.argData_.find(
- (element) => element.argId == this.name,
- );
- const currId = argDatum.model.getId();
-
- // Replace all whitespace with normal spaces, then trim.
- newName = newName.replace(/[\s\xa0]+/g, ' ').trim();
- const caselessName = newName.toLowerCase();
-
- /**
- * Returns true if the given argDatum is associated with this field, or has
- * a different caseless name than the argDatum associated with this field.
- * @param {{model: Blockly.IVariableModel, argId:string}} argDatum The
- * argDatum we want to make sure does not conflict with the argDatum
- * associated with this field.
- * @returns {boolean} True if the given datum does not conflict with the
- * datum associated with this field.
- * @this {Blockly.FieldTextInput}
- */
- const hasDifName = (argDatum) => {
- // The field name (aka id) is always equal to the arg id.
- return (
- argDatum.argId == this.name ||
- caselessName != argDatum.model.name.toLowerCase()
- );
- };
- /**
- * Returns true if the variable associated with this field is only used
- * by this block, or callers of this procedure.
- * @returns {boolean} True if the variable associated with this field is
- * only used by this block, or callers of this procedure.
- */
- const varOnlyUsedHere = () => {
- return Blockly.Variables.getVariableUsesById(workspace, currId).every(
- (block) => {
- return (
- block.id == sourceBlock.id ||
- (block.getProcedureCall &&
- block.getProcedureCall() == sourceBlock.getProcedureDef()[0])
- );
- },
- );
- };
-
- if (!newName || !argData.every(hasDifName)) {
- if (this.preEditVarModel_) {
- argDatum.model = this.preEditVarModel_;
- this.preEditVarModel_ = null;
- }
- Blockly.Procedures.mutateCallers(sourceBlock);
- return null;
- }
-
- if (!this.varIdsToDelete_.length) {
- this.preEditVarModel_ = argDatum.model;
- if (varOnlyUsedHere()) {
- this.varIdsToDelete_.push(currId);
- }
- }
-
- // Create new vars instead of renaming the old ones, so users can't
- // accidentally rename/coalesce vars.
- let model = workspace.getVariableMap().getVariable(newName, '');
- if (!model) {
- model = workspace.getVariableMap().createVariable(newName, '');
- this.varIdsToDelete_.push(model.getId());
- } else if (model.name != newName) {
- // Blockly is case-insensitive so we have to update the var instead of
- // creating a new one.
- const variable = workspace
- .getVariableMap()
- .getVariableById(model.getId());
- workspace.getVariableMap().renameVariable(variable, newName);
- }
- if (model.getId() != currId) {
- argDatum.model = model;
- }
- Blockly.Procedures.mutateCallers(sourceBlock);
- return newName;
- },
-
- /**
- * Removes any unused vars that were created as a result of editing.
- * @param {string} _finalName The final value of the field.
- * @this {Blockly.FieldTextInput}
- */
- finishEditing_: function (_finalName) {
- const source = this.getSourceBlock();
- const argDatum = source.argData_.find(
- (element) => element.argId == this.name,
- );
-
- const currentVarId = argDatum.model.getId();
- this.varIdsToDelete_.forEach((id) => {
- if (id != currentVarId) {
- source.workspace.deleteVariableById(id);
- }
- });
- this.varIdsToDelete_.length = 0;
- this.preEditVarModel_ = null;
- },
-};
-
-/**
- * Initializes some private variables for procedure blocks.
- * @this {Blockly.Block}
- */
-const procedureDefHelper = function () {
- /**
- * An array of objects containing data about the args belonging to the
- * procedure definition.
- * @type {!Array<{
- * model:Blockly.IVariableModel,
- * argId: string
- * }>}
- * @private
- */
- this.argData_ = [];
- /**
- * Does this block have a 'STACK' input for statements?
- * @type {boolean}
- * @private
- */
- this.hasStatements_ = true;
-
- this.getInput('TOP').insertFieldAt(
- 0,
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_INPUT']),
- 'PLUS',
- );
-};
-
-Blockly.Extensions.registerMutator(
- 'procedure_def_mutator',
- procedureDefMutator,
- procedureDefHelper,
-);
-
-/**
- * Sets the validator for the procedure's name field.
- * @this {Blockly.Block}
- */
-const procedureRename = function () {
- this.getField('NAME').setValidator(Blockly.Procedures.rename);
-};
-
-Blockly.Extensions.register('procedure_rename', procedureRename);
-
-/**
- * Defines functions for dealing with variables and renaming variables.
- * @this {Blockly.Block}
- */
-const procedureVars = function () {
- // This is a hack to get around the don't-override-builtins check.
- const mixin = {
- /**
- * Return all variables referenced by this block.
- * @returns {!Array.} List of variable names.
- * @this {Blockly.Block}
- */
- getVars: function () {
- return this.argData_.map((elem) => elem.model.name);
- },
-
- /**
- * Return all variables referenced by this block.
- * @returns {!Array.} List of variable models.
- * @this {Blockly.Block}
- */
- getVarModels: function () {
- return this.argData_.map((elem) => elem.model);
- },
-
- /**
- * Notification that a variable was renamed to the same name as an existing
- * variable. These variables are coalescing into a single variable with the
- * ID of the variable that was already using the name.
- * @param {string} oldId The ID of the variable that was renamed.
- * @param {string} newId The ID of the variable that was already using
- * the name.
- */
- renameVarById: function (oldId, newId) {
- const argData = this.argData_.find(
- (element) => element.model.getId() == oldId,
- );
- if (!argData) {
- return; // Not on this block.
- }
-
- const newVar = this.workspace.getVariableMap().getVariableById(newId);
- const newName = newVar.name;
- this.addVarInput_(newName, newId);
- this.moveInputBefore(newId, oldId);
- this.removeInput(oldId);
- argData.model = newVar;
- Blockly.Procedures.mutateCallers(this);
- },
-
- /**
- * Notification that a variable is renaming but keeping the same ID. If the
- * variable is in use on this block, rerender to show the new name.
- * @param {!Blockly.IVariableModel} variable The variable being renamed.
- * @package
- * @override
- * @this {Blockly.Block}
- */
- updateVarName: function (variable) {
- const id = variable.getId();
- const argData = this.argData_.find(
- (element) => element.model.getId() == id,
- );
- if (!argData) {
- return; // Not on this block.
- }
- this.setFieldValue(variable.name, argData.argId);
- argData.model = variable;
- },
- };
-
- this.mixin(mixin, true);
-};
-
-Blockly.Extensions.register('procedure_vars', procedureVars);
diff --git a/plugins/block-plus-minus/src/serialization_helper.js b/plugins/block-plus-minus/src/serialization_helper.js
deleted file mode 100644
index 3c71412b9..000000000
--- a/plugins/block-plus-minus/src/serialization_helper.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * Returns the extra state of the given block (either as XML or a JSO, depending
- * on the block's definition).
- * @param {!Blockly.BlockSvg} block The block to get the extra state of.
- * @returns {string} A stringified version of the extra state of the given
- * block.
- */
-export function getExtraBlockState(block) {
- // TODO: This is a dupe of the BlockChange.getExtraBlockState code, do we
- // want to make that public?
- if (block.saveExtraState) {
- const state = block.saveExtraState();
- return state ? JSON.stringify(state) : '';
- } else if (block.mutationToDom) {
- const state = block.mutationToDom();
- return state ? Blockly.Xml.domToText(state) : '';
- }
- return '';
-}
diff --git a/plugins/block-plus-minus/src/text_join.js b/plugins/block-plus-minus/src/text_join.js
deleted file mode 100644
index 6d4aa769b..000000000
--- a/plugins/block-plus-minus/src/text_join.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Changes the text_join block to use a +/- mutator UI.
- */
-
-import * as Blockly from 'blockly/core';
-import {createPlusField} from './field_plus';
-import {createMinusField} from './field_minus';
-
-const textJoinMutator = {
- /**
- * Number of text inputs on this block.
- * @type {number}
- */
- itemCount_: 0,
-
- /**
- * Creates XML to represent number of inputs.
- * @returns {!Element} XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function () {
- const container = Blockly.utils.xml.createElement('mutation');
- container.setAttribute('items', this.itemCount_);
- return container;
- },
-
- /**
- * Parses XML to restore the inputs.
- * @param {!Element} xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- const targetCount = parseInt(xmlElement.getAttribute('items'), 10);
- this.updateShape_(targetCount);
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- * @returns {{itemCount: number}} The state of this block, ie the item count.
- */
- saveExtraState: function () {
- return {
- itemCount: this.itemCount_,
- };
- },
-
- /**
- * Applies the given state to this block.
- * @param {*} state The state to apply to this block, ie the item count.
- */
- loadExtraState: function (state) {
- this.updateShape_(state['itemCount']);
- },
-
- /**
- * Adds inputs to the block until the block reaches the target input count.
- * @param {number} targetCount The number of inputs the block should have.
- * @this {Blockly.Block}
- * @private
- */
- updateShape_: function (targetCount) {
- while (this.itemCount_ < targetCount) {
- this.addPart_();
- }
- while (this.itemCount_ > targetCount) {
- this.removePart_();
- }
- this.updateMinus_();
- },
-
- /**
- * Callback for the plus image. Adds an input to the block and updates the
- * state of the minus.
- * @this {Blockly.Block}
- */
- plus: function () {
- this.addPart_();
- this.updateMinus_();
- },
-
- /**
- * Callback for the minus image. Removes the input at the end of the block and
- * updates the state of the minus.
- * @this {Blockly.Block}
- */
- minus: function () {
- if (this.itemCount_ == 0) {
- return;
- }
- this.removePart_();
- this.updateMinus_();
- },
-
- /**
- * Adds an input to the end of the block. If the block currently has no
- * inputs it updates the top 'EMPTY' input to receive a block.
- * @this {Blockly.Block}
- * @private
- */
- addPart_: function () {
- if (this.itemCount_ == 0) {
- if (this.getInput('EMPTY')) {
- this.removeInput('EMPTY');
- }
- this.topInput_ = this.appendValueInput('ADD' + this.itemCount_)
- .appendField(
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_TEXT']),
- 'PLUS',
- )
- .appendField(Blockly.Msg['TEXT_JOIN_TITLE_CREATEWITH']);
- } else {
- this.appendValueInput('ADD' + this.itemCount_);
- }
- // Because item inputs are 0-index we decrement first, increment last.
- this.itemCount_++;
- },
-
- /**
- * Removes an input from the end of the block. If we are removing the last
- * input this updates the block to have an 'EMPTY' top input.
- * @this {Blockly.Block}
- * @private
- */
- removePart_: function () {
- this.itemCount_--;
- this.removeInput('ADD' + this.itemCount_);
- if (this.itemCount_ == 0) {
- this.topInput_ = this.appendDummyInput('EMPTY')
- .appendField(
- createPlusField(Blockly.Msg['ARIA_LABEL_ADD_TEXT']),
- 'PLUS',
- )
- .appendField(this.newQuote_(true))
- .appendField(this.newQuote_(false));
- }
- },
-
- /**
- * Makes it so the minus is visible iff there is an input available to remove.
- * @private
- */
- updateMinus_: function () {
- const minusField = this.getField('MINUS');
- if (!minusField && this.itemCount_ > 0) {
- this.topInput_.insertFieldAt(
- 1,
- createMinusField(Blockly.Msg['ARIA_LABEL_REMOVE_TEXT']),
- 'MINUS',
- );
- } else if (minusField && this.itemCount_ < 1) {
- this.topInput_.removeField('MINUS');
- }
- },
-};
-
-/**
- * Adds the quotes mixin to the block. Also updates the shape so that if no
- * mutator is provided the block has two inputs.
- * @this {Blockly.Block}
- */
-const textJoinHelper = function () {
- Blockly.Extensions.apply('quote_image_mixin', this, false);
- this.updateShape_(2);
-};
-
-if (Blockly.Extensions.isRegistered('text_join_mutator')) {
- Blockly.Extensions.unregister('text_join_mutator');
-}
-Blockly.Extensions.registerMutator(
- 'text_join_mutator',
- textJoinMutator,
- textJoinHelper,
-);
diff --git a/plugins/block-plus-minus/test/if.mocha.js b/plugins/block-plus-minus/test/if.mocha.js
deleted file mode 100644
index b2f93cd8e..000000000
--- a/plugins/block-plus-minus/test/if.mocha.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const {runPlusMinusTestSuite} = require('./test_helpers.mocha');
-const Blockly = require('blockly');
-const {dartGenerator} = require('blockly/dart');
-const {javascriptGenerator} = require('blockly/javascript');
-const {luaGenerator} = require('blockly/lua');
-const {phpGenerator} = require('blockly/php');
-const {pythonGenerator} = require('blockly/python');
-
-require('../src/index');
-
-const assert = chai.assert;
-
-const {
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = testHelpers;
-
-suite('If block', function () {
- /**
- * Asserts that the if block has the expected inputs and fields.
- * @param {!Blockly.Block} block The if block to check.
- * @param {number} ifCount The number of ifs we expect.
- * @param {boolean=} hasElse If we expect an else input.
- */
- function assertIfBlockStructure(block, ifCount, hasElse) {
- assert.equal(block.type, 'controls_if');
- const inputs = block.inputList;
- assert.exists(inputs);
- const length = inputs.length;
- const expectedLength = hasElse ? ifCount * 2 + 1 : ifCount * 2;
- assert.equal(length, expectedLength);
- for (let i = 0; i < ifCount; i++) {
- assert.equal(inputs[i * 2].name, 'IF' + i);
- assert.equal(inputs[i * 2 + 1].name, 'DO' + i);
- if (i > 0) {
- assert.isNotNull(block.getField('MINUS' + i));
- }
- }
- if (hasElse) {
- assert.equal(inputs[length - 1].name, 'ELSE');
- }
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Creation', function () {
- this.block = this.workspace.newBlock('controls_if');
- assertIfBlockStructure(this.block, 1);
- });
-
- suite('Code generation', function () {
- const trivialCreateBlock = (workspace) => {
- return workspace.newBlock('controls_if');
- };
-
- /**
- * Test suites for code generation tests.
- * @type {Array}
- */
- const testSuites = [
- {
- title: 'Dart',
- generator: dartGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'if (false) {\n}\n',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'JavaScript',
- generator: javascriptGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'if (false) {\n}\n',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Lua',
- generator: luaGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'if false then\nend\n',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'PHP',
- generator: phpGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'if (false) {\n}\n',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Python',
- generator: pythonGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'if False:\n pass\n',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- ];
- runCodeGenerationTestSuites(testSuites);
- });
-
- suite('XML', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'Empty Xml',
- xml: ' ',
- expectedXml:
- ' ',
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 1);
- },
- },
- {
- title: '2 elseif no else',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 3);
- },
- },
- {
- title: '3 elseif with else',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 4, true);
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- suite('JSON', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'No mutation',
- json: {
- type: 'controls_if',
- },
- expectedJson: {
- type: 'controls_if',
- id: '1',
- },
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 1);
- },
- },
- {
- title: '2 elseif no else',
- json: {
- type: 'controls_if',
- extraState: {
- elseIfCount: 2,
- },
- id: '1',
- },
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 3);
- },
- },
- {
- title: '3 elseif with else',
- json: {
- type: 'controls_if',
- extraState: {
- elseIfCount: 3,
- hasElse: true,
- },
- id: '1',
- },
- assertBlockStructure: (block) => {
- assertIfBlockStructure(block, 4, true);
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- runPlusMinusTestSuite('controls_if', 1, 1, 'IF', assertIfBlockStructure);
-});
diff --git a/plugins/block-plus-minus/test/index.html b/plugins/block-plus-minus/test/index.html
deleted file mode 100644
index cf52f2924..000000000
--- a/plugins/block-plus-minus/test/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- Blockly Plus/Minus Mutators Test
-
-
-
-
-
-
-
-
-
diff --git a/plugins/block-plus-minus/test/index.js b/plugins/block-plus-minus/test/index.js
deleted file mode 100644
index fb0e133b5..000000000
--- a/plugins/block-plus-minus/test/index.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plus minus blocks' test playground.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index.js';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-const toolbox = {
- kind: 'categoryToolbox',
- contents: [
- {
- kind: 'category',
- name: 'Others',
- categorystyle: 'logic_category',
- contents: [
- {
- kind: 'block',
- type: 'controls_if',
- },
- {
- kind: 'block',
- type: 'controls_if',
- extraState: {
- hasElse: true,
- },
- },
- {
- kind: 'block',
- type: 'controls_ifelse',
- },
- {
- kind: 'block',
- type: 'text_join',
- },
- {
- kind: 'block',
- type: 'lists_create_with',
- extraState: {
- itemCount: 0,
- },
- },
- {
- kind: 'block',
- type: 'lists_create_with',
- },
- ],
- },
- {
- kind: 'category',
- name: 'Functions',
- categorystyle: 'procedure_category',
- custom: 'PROCEDURE',
- },
- {
- kind: 'category',
- name: 'Variables',
- categorystyle: 'variable_category',
- custom: 'VARIABLE',
- },
- ],
-};
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolbox,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/block-plus-minus/test/list_create.mocha.js b/plugins/block-plus-minus/test/list_create.mocha.js
deleted file mode 100644
index e17d3b852..000000000
--- a/plugins/block-plus-minus/test/list_create.mocha.js
+++ /dev/null
@@ -1,312 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const {runPlusMinusTestSuite} = require('./test_helpers.mocha');
-const Blockly = require('blockly');
-const {dartGenerator} = require('blockly/dart');
-const {javascriptGenerator} = require('blockly/javascript');
-const {luaGenerator} = require('blockly/lua');
-const {phpGenerator} = require('blockly/php');
-const {pythonGenerator} = require('blockly/python');
-
-require('../src/index');
-
-const assert = chai.assert;
-const {
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = testHelpers;
-
-suite('List create block', function () {
- /**
- * Asserts that the list block has the inputs and fields we expect.
- * @param {!Blockly.Block} block The list block.
- * @param {number=} inputCount The number of inputs we expect.
- */
- function assertListBlockStructure(block, inputCount = 0) {
- assert.equal(block.type, 'lists_create_with');
- if (inputCount === 0) {
- assert.equal(block.inputList.length, 1);
- const input = block.inputList[0];
- assert.equal(input.type, Blockly.inputs.inputTypes.DUMMY);
- assert.equal(input.name, 'EMPTY');
- assert.isNull(block.getField('MINUS'));
- // Easy way to test we're displaying empty instead of normal text.
- assert.equal(block.toString(), 'Add list item create empty list');
- return;
- }
-
- assert.equal(block.inputList.length, inputCount);
- for (let i = 0; i < inputCount; i++) {
- chai.assert.equal(block.inputList[i].name, 'ADD' + i);
- }
- assert.isNotNull(block.getField('MINUS'));
- // Easy way to test we're displaying normal text instead of empty.
- assert.notEqual(block.toString(), 'Add list item create empty list');
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Creation', function () {
- this.block = this.workspace.newBlock('lists_create_with');
- assertListBlockStructure(this.block, 3);
- });
-
- suite('Code generation', function () {
- const trivialCreateBlock = (workspace) => {
- return workspace.newBlock('lists_create_with');
- };
-
- /**
- * Test suites for code generation tests.
- * @type {Array}
- */
- const testSuites = [
- {
- title: 'Dart',
- generator: dartGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: '[null, null, null]',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'JavaScript',
- generator: javascriptGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: '[null, null, null]',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Lua',
- generator: luaGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: '{nil, nil, nil}',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'PHP',
- generator: phpGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'array(null, null, null)',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Python',
- generator: pythonGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: '[None, None, None]',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- ];
- runCodeGenerationTestSuites(testSuites);
- });
-
- suite('Xml', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'Empty XML',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 3);
- },
- },
- {
- title: '3 items',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 3);
- },
- },
- {
- title: '5 items',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 5);
- },
- },
- {
- title: '0 items',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 0);
- },
- },
- {
- title: '4 items with child attached',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' FALSE \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 4);
- const child = block.getInputTargetBlock('ADD3');
- assert.isNotNull(child);
- assert.equal(child.type, 'logic_boolean');
- assert.equal(child.getFieldValue('BOOL'), 'FALSE');
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- suite('Json', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'No mutation',
- json: {
- type: 'lists_create_with',
- },
- expectedJson: {
- type: 'lists_create_with',
- id: '1',
- extraState: {
- itemCount: 3,
- },
- },
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 3);
- },
- },
- {
- title: '3 items',
- json: {
- type: 'lists_create_with',
- id: '1',
- extraState: {
- itemCount: 3,
- },
- },
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 3);
- },
- },
- {
- title: '5 items',
- json: {
- type: 'lists_create_with',
- id: '1',
- extraState: {
- itemCount: 5,
- },
- },
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 5);
- },
- },
- {
- title: '0 items',
- json: {
- type: 'lists_create_with',
- id: '1',
- extraState: {
- itemCount: 0,
- },
- },
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 0);
- },
- },
- {
- title: '4 items with child attached',
- json: {
- type: 'lists_create_with',
- id: '1',
- extraState: {
- itemCount: 4,
- },
- inputs: {
- ADD3: {
- block: {
- type: 'logic_boolean',
- id: '1',
- fields: {
- BOOL: 'FALSE',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertListBlockStructure(block, 4);
- const child = block.getInputTargetBlock('ADD3');
- assert.isNotNull(child);
- assert.equal(child.type, 'logic_boolean');
- assert.equal(child.getFieldValue('BOOL'), 'FALSE');
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- runPlusMinusTestSuite(
- 'lists_create_with',
- 3,
- 0,
- 'ADD',
- assertListBlockStructure,
- );
-});
diff --git a/plugins/block-plus-minus/test/procedures.mocha.js b/plugins/block-plus-minus/test/procedures.mocha.js
deleted file mode 100644
index a35b65186..000000000
--- a/plugins/block-plus-minus/test/procedures.mocha.js
+++ /dev/null
@@ -1,782 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const Blockly = require('blockly');
-const {testHelpers} = require('@blockly/dev-tools');
-const procedureTestHelpers = require('./procedures_test_helpers.mocha');
-const {dartGenerator} = require('blockly/dart');
-const {javascriptGenerator} = require('blockly/javascript');
-const {luaGenerator} = require('blockly/lua');
-const {phpGenerator} = require('blockly/php');
-const {pythonGenerator} = require('blockly/python');
-
-require('../src/index');
-
-const assert = chai.assert;
-const {
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = testHelpers;
-const {
- assertDefBlockStructure,
- assertCallBlockStructure,
- assertProcBlocksStructure,
- createProcDefBlock,
- createProcCallBlock,
-} = procedureTestHelpers;
-
-suite('Procedure blocks', function () {
- setup(function () {
- this.workspace = new Blockly.Workspace();
- this.clock = sinon.useFakeTimers();
- });
-
- teardown(function () {
- // We have to make sure the procedure call gets the change event before
- // we teardown. Otherwise we get a race condition where it tries to create
- // a new def.
- this.clock.tick(100);
- this.workspace.dispose();
- sinon.restore();
- });
-
- const testSuites = [
- {
- title: 'with return',
- hasReturn: true,
- defType: 'procedures_defreturn',
- callType: 'procedures_callreturn',
- },
- {
- title: 'no return',
- hasReturn: false,
- defType: 'procedures_defnoreturn',
- callType: 'procedures_callnoreturn',
- },
- ];
-
- testSuites.forEach((testSuite) => {
- suite(testSuite.title, function () {
- suite('Structure', function () {
- test('Definition block', function () {
- const defBlock = this.workspace.newBlock(testSuite.defType);
- assertDefBlockStructure(defBlock, testSuite.hasReturn);
- });
-
- test('Call block', function () {
- this.workspace.newBlock(testSuite.defType);
- const callBlock = this.workspace.newBlock(testSuite.callType);
- assertCallBlockStructure(callBlock);
- });
- });
-
- suite('Code generation', function () {
- const createBlockFn = (numArgs) => {
- return (workspace) => {
- const block = createProcDefBlock(workspace, testSuite.hasReturn);
- for (let i = 0; i < numArgs; i++) {
- block.plus();
- }
- return block;
- };
- };
-
- /**
- * Test suites for code generation test.
- * @type {Array}
- */
- const codeGenerationTestSuites = [
- {
- title: 'Dart',
- generator: dartGenerator,
- testCases: [
- {
- title: 'No arguments',
- useWorkspaceToCode: true,
- expectedCode:
- 'void proc_name() {\n' + '}\n\n\n' + 'main() {\n' + '}',
- createBlock: createBlockFn(0),
- },
- {
- title: 'One argument',
- useWorkspaceToCode: true,
- expectedCode:
- 'var x;\n\n' +
- 'void proc_name(x) {\n' +
- '}\n\n\n' +
- 'main() {\n' +
- '}',
- createBlock: createBlockFn(1),
- },
- ],
- },
- {
- title: 'JavaScript',
- generator: javascriptGenerator,
- testCases: [
- {
- title: 'No arguments',
- useWorkspaceToCode: true,
- expectedCode: 'function proc_name() {\n' + '}\n',
- createBlock: createBlockFn(0),
- },
- {
- title: 'One argument',
- useWorkspaceToCode: true,
- expectedCode:
- 'var x;\n\n' + 'function proc_name(x) {\n' + '}\n',
- createBlock: createBlockFn(1),
- },
- ],
- },
- {
- title: 'Lua',
- generator: luaGenerator,
- testCases: [
- {
- title: 'No arguments',
- useWorkspaceToCode: true,
- expectedCode: 'function proc_name()\n' + 'end\n',
- createBlock: createBlockFn(0),
- },
- {
- title: 'One argument',
- useWorkspaceToCode: true,
- expectedCode: 'function proc_name(x)\n' + 'end\n',
- createBlock: createBlockFn(1),
- },
- ],
- },
- {
- title: 'PHP',
- generator: phpGenerator,
- testCases: [
- {
- title: 'No arguments',
- useWorkspaceToCode: true,
- expectedCode: 'function proc_name() {\n' + '}\n',
- createBlock: createBlockFn(0),
- },
- {
- title: 'One argument',
- useWorkspaceToCode: true,
- expectedCode: 'function proc_name($x) {\n' + '}\n',
- createBlock: createBlockFn(1),
- },
- ],
- },
- {
- title: 'Python',
- generator: pythonGenerator,
- testCases: [
- {
- title: 'No arguments',
- useWorkspaceToCode: true,
- expectedCode: 'def proc_name():\n' + ' pass\n',
- createBlock: createBlockFn(0),
- },
- {
- title: 'One argument',
- useWorkspaceToCode: true,
- expectedCode:
- 'x = None\n\n' + 'def proc_name(x):\n' + ' pass\n',
- createBlock: createBlockFn(1),
- },
- ],
- },
- ];
-
- runCodeGenerationTestSuites(codeGenerationTestSuites);
- });
-
- suite('Xml', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'Minimal definition',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn);
- },
- },
- {
- title: 'Common definition',
- xml:
- '' +
- ' do something ' +
- ' ',
- expectedXml:
- '\n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn);
- },
- },
- {
- title: 'With vars definition',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' x \n' + // Because genUID is stubbed.
- ' y \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn, ['x', 'y']);
- },
- },
- {
- title: 'No statements definition',
- xml:
- '\n' +
- ' \n' +
- ' do something \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, true, [], false);
- },
- },
- {
- title: 'Minimal caller',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'Common caller',
- xml:
- '\n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'With vars caller',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block, ['x', 'y']);
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- suite('Json', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'Minimal definition',
- json: {
- type: testSuite.defType,
- },
- expectedJson: {
- type: testSuite.defType,
- id: '1',
- fields: {
- NAME: '',
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn);
- },
- },
- {
- title: 'Common definition',
- json: {
- type: testSuite.defType,
- fields: {
- NAME: 'do something',
- },
- },
- expectedJson: {
- type: testSuite.defType,
- id: '1',
- fields: {
- NAME: 'do something',
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn);
- },
- },
- {
- title: 'With vars definition',
- json: {
- type: testSuite.defType,
- fields: {
- NAME: 'do something',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'id1',
- argId: 'arg1',
- },
- {
- name: 'y',
- id: 'id2',
- argId: 'arg2',
- },
- ],
- },
- },
- expectedJson: {
- type: testSuite.defType,
- id: '1',
- fields: {
- NAME: 'do something',
- arg1: 'x',
- arg2: 'y',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'id1',
- argId: 'arg1',
- },
- {
- name: 'y',
- id: 'id2',
- argId: 'arg2',
- },
- ],
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn, ['x', 'y']);
- },
- },
- {
- title: 'No statements definition',
- json: {
- type: testSuite.defType,
- fields: {
- NAME: 'do something',
- },
- extraState: {
- hasStatements: false,
- },
- },
- expectedJson: {
- type: testSuite.defType,
- id: '1',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- hasStatements: false,
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, testSuite.hasReturn, [], false);
- },
- },
- {
- title: 'Minimal caller',
- json: {
- type: testSuite.callType,
- },
- expectedJson: {
- type: testSuite.callType,
- id: '1',
- extraState: {
- name: '',
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'Common caller',
- json: {
- type: testSuite.callType,
- extraState: {
- name: 'do something',
- },
- },
- expectedJson: {
- type: testSuite.callType,
- id: '1',
- extraState: {
- name: 'do something',
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'With vars caller',
- json: {
- type: testSuite.callType,
- extraState: {
- name: 'do something',
- params: ['x', 'y'],
- },
- },
- expectedJson: {
- type: testSuite.callType,
- id: '1',
- extraState: {
- name: 'do something',
- params: ['x', 'y'],
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block, ['x', 'y']);
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- suite('Adding and removing inputs', function () {
- setup(function () {
- this.def = createProcDefBlock(this.workspace, testSuite.hasReturn);
- this.call = createProcCallBlock(this.workspace, testSuite.hasReturn);
- });
-
- test('Add', function () {
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- this.def.plus();
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn, [
- 'x',
- ]);
- });
-
- test('Add many', function () {
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- for (let i = 0; i < 5; i++) {
- this.def.plus();
- }
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn, [
- 'x',
- 'y',
- 'z',
- 'a',
- 'b',
- ]);
- });
-
- if (testSuite.hasReturn) {
- test('Add, no stack', function () {
- this.def = createProcDefBlock(
- this.workspace,
- true,
- 'proc name2',
- false,
- );
- this.call = createProcCallBlock(this.workspace, true, 'proc name2');
- assertProcBlocksStructure(this.def, this.call, true, [], false);
- this.def.plus();
- assertProcBlocksStructure(this.def, this.call, true, ['x'], false);
- });
- }
-
- test('Remove', function () {
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- this.def.plus();
- this.def.minus(this.def.argData_[0].argId);
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- });
-
- test('Remove many', function () {
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- for (let i = 0; i < 10; i++) {
- this.def.plus();
- }
- // Remove every other input. Must do it backwards so that the array
- // doesn't get out of whack.
- for (let i = 9; i > 0; i -= 2) {
- this.def.minus(this.def.argData_[i].argId);
- }
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn, [
- 'x',
- 'z',
- 'b',
- 'd',
- 'f',
- ]);
- });
-
- test('Remove too many (w/ no args)', function () {
- this.def.minus('whatevs');
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn);
- });
-
- test('Remove bad arg', function () {
- this.def.plus();
- this.def.minus('whatevs');
- assertProcBlocksStructure(this.def, this.call, testSuite.hasReturn, [
- 'x',
- ]);
- });
- });
-
- suite('Vars', function () {
- setup(function () {
- this.assertVars = function (constsArray) {
- const constNames = this.workspace
- .getVariableMap()
- .getVariablesOfType('')
- .map((model) => model.name);
- assert.sameMembers(constNames, constsArray);
- };
- });
- teardown(function () {
- delete this.assertVars;
- });
-
- suite('Renaming args', function () {
- setup(function () {
- this.def = createProcDefBlock(this.workspace, testSuite.hasReturn);
- this.call = createProcCallBlock(
- this.workspace,
- testSuite.hasReturn,
- );
- });
- test('Simple Rename', function () {
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('newName');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['newName'],
- );
- this.assertVars(['x', 'newName']);
- });
- test('Change Case', function () {
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('X');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['X'],
- );
- this.assertVars(['X']);
- });
- test('Empty', function () {
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['x'],
- );
- this.assertVars(['x']);
- });
- test('Whitespace', function () {
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue(' newName ');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['newName'],
- );
- this.assertVars(['x', 'newName']);
- });
- test('Duplicate', function () {
- this.def.plus();
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('y');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['x', 'y'],
- );
- this.assertVars(['x', 'y']);
- });
- test('Duplicate Different Case', function () {
- this.def.plus();
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('Y');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['x', 'y'],
- );
- this.assertVars(['x', 'y']);
- });
- test('Match Existing', function () {
- this.workspace.getVariableMap().createVariable('test', '');
- this.def.plus();
- const field = this.def.inputList[1].fieldRow[2];
- field.setValue('test');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['test'],
- );
- this.assertVars(['x', 'test']);
- assert.equal(
- this.def.argData_[0].model.getId(),
- this.workspace.getVariableMap().getVariable('test', '').getId(),
- );
- });
- });
- suite('Vars Renamed Elsewhere', function () {
- setup(function () {
- this.def = createProcDefBlock(this.workspace, testSuite.hasReturn);
- this.call = createProcCallBlock(
- this.workspace,
- testSuite.hasReturn,
- );
- });
- test('Simple Rename', function () {
- this.def.plus();
- const Variable = this.workspace
- .getVariableMap()
- .getVariable('x', '');
- this.workspace.getVariableMap().renameVariable(Variable, 'test');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['test'],
- );
- this.assertVars(['test']);
- });
- // Don't know how we want to react here.
- test.skip('Duplicate', function () {
- this.def.plus();
- this.def.plus();
- const Variable = this.workspace
- .getVariableMap()
- .getVariable('x', '');
- this.workspace.getVariableMap().renameVariable(Variable, 'y');
- // Don't know what we want to have happen.
- });
- test('Change Case', function () {
- this.def.plus();
- const Variable = this.workspace
- .getVariableMap()
- .getVariable('x', '');
- this.workspace.getVariableMap().renameVariable(Variable, 'X');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['X'],
- );
- this.assertVars(['X']);
- });
- test('Coalesce Change Case', function () {
- const variable = this.workspace
- .getVariableMap()
- .createVariable('test');
- this.def.plus();
- this.workspace.getVariableMap().renameVariable(variable, 'X');
- assertProcBlocksStructure(
- this.def,
- this.call,
- testSuite.hasReturn,
- ['X'],
- );
- this.assertVars(['X']);
- });
- });
- });
- });
- });
-});
diff --git a/plugins/block-plus-minus/test/procedures_test_helpers.mocha.js b/plugins/block-plus-minus/test/procedures_test_helpers.mocha.js
deleted file mode 100644
index 12dc415a9..000000000
--- a/plugins/block-plus-minus/test/procedures_test_helpers.mocha.js
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const Blockly = require('blockly');
-
-require('../src/index');
-const assert = chai.assert;
-
-/**
- * Asserts that the procedure definition block has the expected inputs and
- * fields.
- * @param {!Blockly.Block} defBlock The procedure definition block.
- * @param {boolean=} hasReturn If we expect the procedure def to have a return
- * input or not.
- * @param {Array=} args An array of argument names.
- * @param {boolean=} hasStatements If we expect the procedure def to have a
- * statement input or not.
- */
-function assertDefBlockStructure(
- defBlock,
- hasReturn = false,
- args = [],
- hasStatements = true,
-) {
- if (hasStatements) {
- assert.isNotNull(
- defBlock.getInput('STACK'),
- 'Def block should have STACK input',
- );
- } else {
- assert.isNull(
- defBlock.getInput('STACK'),
- 'Def block should not have STACK input',
- );
- }
- if (hasReturn) {
- assert.isNotNull(
- defBlock.getInput('RETURN'),
- 'Def block should have RETURN input',
- );
- } else {
- assert.isNull(
- defBlock.getInput('RETURN'),
- 'Def block should not have RETURN input',
- );
- }
- if (args.length) {
- assert.include(
- defBlock.toString(),
- 'with',
- 'Def block string should include "with"',
- );
- } else {
- assert.notInclude(
- defBlock.toString(),
- 'with',
- 'Def block string should not include "with"',
- );
- }
-
- assertDefBlockArgsStructure_(defBlock, hasReturn, args, hasStatements);
-}
-
-/**
- * Asserts that the procedure definition block has the expected inputs and
- * fields.
- * @param {!Blockly.Block} callBlock The procedure call block.
- * @param {Array=} args An array of argument names.
- */
-function assertCallBlockStructure(callBlock, args = []) {
- if (args.length) {
- assert.include(callBlock.toString(), 'with');
- } else {
- assert.notInclude(callBlock.toString(), 'with');
- }
-
- assertCallBlockArgsStructure_(callBlock, args);
-}
-
-/**
- * Asserts that the procedure definition block has the expected arguments.
- * @param {!Blockly.Block} defBlock The procedure definition block.
- * @param {boolean=} hasReturn If we expect the procedure def to have a return
- * input or not.
- * @param {Array=} args An array of argument names.
- * @param {boolean=} hasStatements If we expect the procedure def to have
- * a statement input or not.
- * @private
- */
-function assertDefBlockArgsStructure_(
- defBlock,
- hasReturn,
- args,
- hasStatements,
-) {
- // inputList also contains "TOP" input and optionally "RETURN" and "STACK"
- let defArgCount = defBlock.inputList.length - 1;
- if (hasReturn) {
- defArgCount--;
- }
- if (hasStatements) {
- defArgCount--;
- }
-
- assert.equal(
- defArgCount,
- args.length,
- 'def block has the expected number of args',
- );
-
- assert.sameOrderedMembers(defBlock.getVars(), args);
-
- if (!args.length) {
- return;
- }
-
- const argIds = defBlock.argData_.map((element) => element.argId);
- for (let i = 0; i < args.length; i++) {
- const expectedName = args[i];
- const defInput = defBlock.inputList[i + 1];
- assert.equal(defInput.type, Blockly.inputs.inputTypes.DUMMY);
- assert.equal(defInput.name, argIds[i]);
- assert.equal(
- defInput.fieldRow[2].getValue(),
- expectedName,
- 'def block consts did not match expected',
- );
- }
-
- // Assert the last input is not a dummy. Sometimes
- // arg inputs don't get moved which is bad.
- const lastInput = defBlock.inputList[defBlock.inputList.length - 1];
- assert.notEqual(
- lastInput.type,
- Blockly.inputs.inputTypes.DUMMY,
- 'last input is not a dummy',
- );
-}
-
-/**
- * Asserts that the procedure call block has the expected arguments.
- * @param {!Blockly.Block} callBlock The procedure definition block.
- * @param {Array=} args An array of argument names.
- * @private
- */
-function assertCallBlockArgsStructure_(callBlock, args) {
- // inputList also contains "TOPROW"
- assert.equal(
- callBlock.inputList.length - 1,
- args.length,
- 'call block has the expected number of args',
- );
-
- for (let i = 0; i < args.length; i++) {
- const expectedName = args[i];
- const callInput = callBlock.inputList[i + 1];
- assert.equal(callInput.type, Blockly.INPUT_VALUE);
- assert.equal(callInput.name, 'ARG' + i);
- assert.equal(
- callInput.fieldRow[0].getValue(),
- expectedName,
- 'Call block consts did not match expected.',
- );
- }
-}
-
-/**
- * Asserts that the procedure definition and call blocks have the expected
- * inputs and fields.
- * @param {!Blockly.Block} def The procedure definition block.
- * @param {!Blockly.Block} call The procedure call block.
- * @param {boolean=} hasReturn If we expect the procedure def to have a return
- * input or not.
- * @param {Array=} args An array of argument names.
- * @param {boolean=} hasStatements If we expect the procedure def to have
- * a statement input or not.
- */
-function assertProcBlocksStructure(
- def,
- call,
- hasReturn = false,
- args = [],
- hasStatements = true,
-) {
- assertDefBlockStructure(def, hasReturn, args, hasStatements);
- assertCallBlockStructure(call, args);
-}
-
-/**
- * Creates procedure definition block using domToBlock call.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- * @param {boolean=} hasReturn Whether the procedure definition should have
- * return.
- * @param {string=} nameId The procedure name.
- * @param {boolean=} hasStatements Whether the block has statements (STACK).
- * @returns {Blockly.Block} The created block.
- */
-function createProcDefBlock(
- workspace,
- hasReturn = false,
- nameId = 'proc name',
- hasStatements = true,
-) {
- const type = hasReturn ? 'procedures_defreturn' : 'procedures_defnoreturn';
- return Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(
- '' +
- (hasStatements
- ? ''
- : ' \n') +
- ' ' +
- nameId +
- ' ' +
- ' ',
- ),
- workspace,
- );
-}
-
-/**
- * Creates procedure call block using domToBlock call.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- * @param {boolean=} hasReturn Whether the corresponding procedure definition
- * has return.
- * @param {string=} nameId The procedure name.
- * @returns {Blockly.Block} The created block.
- */
-function createProcCallBlock(
- workspace,
- hasReturn = false,
- nameId = 'proc name',
-) {
- const type = hasReturn ? 'procedures_callreturn' : 'procedures_callnoreturn';
- return Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(
- '' +
- ' ' +
- ' ',
- ),
- workspace,
- );
-}
-
-module.exports = {
- assertDefBlockStructure,
- assertCallBlockStructure,
- assertProcBlocksStructure,
- createProcDefBlock,
- createProcCallBlock,
-};
diff --git a/plugins/block-plus-minus/test/test_helpers.mocha.js b/plugins/block-plus-minus/test/test_helpers.mocha.js
deleted file mode 100644
index cb6ec108a..000000000
--- a/plugins/block-plus-minus/test/test_helpers.mocha.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {assert} = require('chai');
-
-/**
- * Runs test suite for plus/minus functionality for the block of the given
- * type.
- * @param {string} blockType The block type of block being tested.
- * @param {number} defaultInputCount The default count of inputs for this block.
- * @param {number} minimumInputCount The minimum allowed inputs for this block.
- * @param {string} inputPrefix The prefix to use to create input name for test.
- * @param {function(Blockly.Block, number)} assertBlockStructure The assertion
- * function to use.
- */
-function runPlusMinusTestSuite(
- blockType,
- defaultInputCount,
- minimumInputCount,
- inputPrefix,
- assertBlockStructure,
-) {
- suite('Adding and removing inputs', function () {
- setup(function () {
- this.block = this.workspace.newBlock(blockType);
- });
-
- test('Add', function () {
- assertBlockStructure(this.block, defaultInputCount);
- this.block.plus();
- assertBlockStructure(this.block, defaultInputCount + 1);
- });
-
- test('Add many', function () {
- assertBlockStructure(this.block, defaultInputCount);
- for (let i = 0; i < 8; i++) {
- this.block.plus();
- }
- assertBlockStructure(this.block, defaultInputCount + 8);
- });
-
- if (defaultInputCount === minimumInputCount) {
- test('Remove', function () {
- assertBlockStructure(this.block, defaultInputCount);
- this.block.plus();
- this.block.minus();
- assertBlockStructure(this.block, defaultInputCount);
- });
- } else {
- test('Remove', function () {
- assertBlockStructure(this.block, defaultInputCount);
- this.block.minus();
- assertBlockStructure(this.block, defaultInputCount - 1);
- });
- }
-
- test('Remove many', function () {
- assertBlockStructure(this.block, defaultInputCount);
- for (let i = 0; i < 8; i++) {
- this.block.plus();
- }
- for (let i = 0; i < 5; i++) {
- this.block.minus();
- }
- assertBlockStructure(this.block, defaultInputCount + 3);
- });
-
- test('Remove too many', function () {
- assertBlockStructure(this.block, defaultInputCount);
- for (let i = 0; i < defaultInputCount + 1; i++) {
- this.block.minus();
- }
- assertBlockStructure(this.block, minimumInputCount);
- });
-
- test('Remove with child attached', function () {
- const block = this.workspace.newBlock('logic_boolean');
- assertBlockStructure(this.block, defaultInputCount);
-
- let inputCount = defaultInputCount;
- if (minimumInputCount === defaultInputCount) {
- this.block.plus();
- inputCount++;
- }
-
- const childInputName = inputPrefix + (inputCount - 1);
-
- this.block
- .getInput(childInputName)
- .connection.connect(block.outputConnection);
- assert.equal(this.block.getInputTargetBlock(childInputName), block);
-
- this.block.minus();
- assertBlockStructure(this.block, inputCount - 1);
- assert.isNull(this.block.getInputTargetBlock(childInputName));
- assert.isNull(block.outputConnection.targetBlock());
-
- // Assert that it does not get reattached. Only reattach on undo.
- this.block.plus();
- assertBlockStructure(this.block, inputCount);
- assert.isNull(block.outputConnection.targetBlock());
- });
- });
-}
-
-module.exports = {
- runPlusMinusTestSuite,
-};
diff --git a/plugins/block-plus-minus/test/text_join.mocha.js b/plugins/block-plus-minus/test/text_join.mocha.js
deleted file mode 100644
index acd96a43e..000000000
--- a/plugins/block-plus-minus/test/text_join.mocha.js
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const {testHelpers} = require('@blockly/dev-tools');
-const {runPlusMinusTestSuite} = require('./test_helpers.mocha');
-const Blockly = require('blockly');
-const {dartGenerator} = require('blockly/dart');
-const {javascriptGenerator} = require('blockly/javascript');
-const {luaGenerator} = require('blockly/lua');
-const {phpGenerator} = require('blockly/php');
-const {pythonGenerator} = require('blockly/python');
-
-require('../src/index');
-
-const assert = chai.assert;
-const {
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = testHelpers;
-
-suite('Text join block', function () {
- /**
- * Asserts that the join block has the inputs and fields we expect.
- * @param {!Blockly.Block} block The text join block.
- * @param {number=} inputCount The number of inputs we expect.
- */
- function assertTextJoinBlockStructure(block, inputCount) {
- assert.equal(block.type, 'text_join');
- if (!inputCount) {
- assert.equal(block.inputList.length, 1);
- const input = block.inputList[0];
- assert.equal(input.type, Blockly.inputs.inputTypes.DUMMY);
- assert.equal(input.name, 'EMPTY');
- assert.isNull(block.getField('MINUS'));
- // Easy way to test we're displaying quotes instead of normal text.
- assert.equal(block.toString(), 'Add text “ ”');
- return;
- }
-
- assert.equal(block.inputList.length, inputCount);
- for (let i = 0; i < inputCount; i++) {
- chai.assert.equal(block.inputList[i].name, 'ADD' + i);
- }
- assert.isNotNull(block.getField('MINUS'));
- // Easy way to test we're displaying normal text instead of quotes.
- assert.notEqual(block.toString(), 'Add text “ ”');
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Creation', function () {
- this.block = this.workspace.newBlock('text_join');
- assertTextJoinBlockStructure(this.block, 2);
- });
-
- suite('Code generation', function () {
- const trivialCreateBlock = (workspace) => {
- return workspace.newBlock('text_join');
- };
-
- /**
- * Test suites for code generation tests.
- * @type {Array}
- */
- const testSuites = [
- {
- title: 'Dart',
- generator: dartGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: "['',''].join()",
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'JavaScript',
- generator: javascriptGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: "'' + ''",
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Lua',
- generator: luaGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: "'' .. ''",
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'PHP',
- generator: phpGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: "'' . ''",
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Python',
- generator: pythonGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: "'' + ''",
- createBlock: trivialCreateBlock,
- },
- ],
- },
- ];
-
- runCodeGenerationTestSuites(testSuites);
- });
-
- suite('Xml', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'Empty XML',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 2);
- },
- },
- {
- title: '0 items',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 0);
- },
- },
- {
- title: '3 items',
- xml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 3);
- },
- },
- {
- title: '3 items with child attached',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' FALSE \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 3);
- const child = block.getInputTargetBlock('ADD2');
- assert.isNotNull(child);
- assert.equal(child.getFieldValue('BOOL'), 'FALSE');
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- suite('Json', function () {
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- {
- title: 'No mutation',
- json: {
- type: 'text_join',
- },
- expectedJson: {
- type: 'text_join',
- id: '1',
- extraState: {
- itemCount: 2,
- },
- },
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 2);
- },
- },
- {
- title: '0 items',
- json: {
- type: 'text_join',
- id: '1',
- extraState: {
- itemCount: 0,
- },
- },
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 0);
- },
- },
- {
- title: '3 items',
- json: {
- type: 'text_join',
- id: '1',
- extraState: {
- itemCount: 3,
- },
- },
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 3);
- },
- },
- {
- title: '3 items with child attached',
- json: {
- type: 'text_join',
- id: '1',
- extraState: {
- itemCount: 3,
- },
- inputs: {
- ADD2: {
- block: {
- type: 'logic_boolean',
- id: '1',
- fields: {
- BOOL: 'FALSE',
- },
- },
- },
- },
- },
- assertBlockStructure: (block) => {
- assertTextJoinBlockStructure(block, 3);
- const child = block.getInputTargetBlock('ADD2');
- assert.isNotNull(child);
- assert.equal(child.type, 'logic_boolean');
- assert.equal(child.getFieldValue('BOOL'), 'FALSE');
- },
- },
- ];
- runSerializationTestSuite(testCases, Blockly);
- });
-
- runPlusMinusTestSuite('text_join', 2, 0, 'ADD', assertTextJoinBlockStructure);
-});
diff --git a/plugins/block-shareable-procedures/CHANGELOG.md b/plugins/block-shareable-procedures/CHANGELOG.md
deleted file mode 100644
index e135fbac9..000000000
--- a/plugins/block-shareable-procedures/CHANGELOG.md
+++ /dev/null
@@ -1,682 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [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
-
-* Remove deprecated calls from block-shareable-procedures ([#2699](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2699))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.12](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.11...@blockly/block-shareable-procedures@6.0.12) (2026-04-23)
-
-
-### Bug Fixes
-
-* Fix creation of variables in the main workspace when opening flyout ([#2686](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2686)) ([d7dba88](https://github.com/RaspberryPiFoundation/blockly-samples/commit/d7dba8803ca2cfc66cbdfb72a060a7f101f40c8a))
-
-
-
-## [6.0.11](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.10...@blockly/block-shareable-procedures@6.0.11) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.9...@blockly/block-shareable-procedures@6.0.10) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.8...@blockly/block-shareable-procedures@6.0.9) (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))
-
-
-
-## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.7...@blockly/block-shareable-procedures@6.0.8) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.6...@blockly/block-shareable-procedures@6.0.7) (2025-12-22)
-
-
-### Bug Fixes
-
-* reconnect procedure block statement inputs ([#2657](https://github.com/google/blockly-samples/issues/2657)) ([761b514](https://github.com/google/blockly-samples/commit/761b5147fff499d990a33ff15562362bd1236478))
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.5...@blockly/block-shareable-procedures@6.0.6) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.4...@blockly/block-shareable-procedures@6.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.3...@blockly/block-shareable-procedures@6.0.4) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.2...@blockly/block-shareable-procedures@6.0.3) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.1...@blockly/block-shareable-procedures@6.0.2) (2025-06-12)
-
-
-### Bug Fixes
-
-* Fix a bug that could cause a crash when deleting a shared procedure definition. ([#2560](https://github.com/google/blockly-samples/issues/2560)) ([506067b](https://github.com/google/blockly-samples/commit/506067b5999c54849cc205c66afffa5b49d3eec8))
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@6.0.0...@blockly/block-shareable-procedures@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.17...@blockly/block-shareable-procedures@6.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))
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.16...@blockly/block-shareable-procedures@5.0.17) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.15...@blockly/block-shareable-procedures@5.0.16) (2025-05-15)
-
-
-### Bug Fixes
-
-* Remove use of deleted `Block.setEnabled()`. ([bf44961](https://github.com/google/blockly-samples/commit/bf449611e35e063a5ccd59e25d6a5e3eca3c7f56))
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.14...@blockly/block-shareable-procedures@5.0.15) (2025-02-27)
-
-
-### Bug Fixes
-
-* Mitigate shareable procedure flyout bug. ([a37225a](https://github.com/google/blockly-samples/commit/a37225a6dc4369fcec14e2a704eaa6bef9842b8c))
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.13...@blockly/block-shareable-procedures@5.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.12...@blockly/block-shareable-procedures@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.11...@blockly/block-shareable-procedures@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.10...@blockly/block-shareable-procedures@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.9...@blockly/block-shareable-procedures@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.8...@blockly/block-shareable-procedures@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.7...@blockly/block-shareable-procedures@5.0.8) (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))
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.6...@blockly/block-shareable-procedures@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.5...@blockly/block-shareable-procedures@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.4...@blockly/block-shareable-procedures@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.3...@blockly/block-shareable-procedures@5.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)
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.2...@blockly/block-shareable-procedures@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.1...@blockly/block-shareable-procedures@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@5.0.0...@blockly/block-shareable-procedures@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.6...@blockly/block-shareable-procedures@5.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
-
-* build for the v11 branch ([#2268](https://github.com/google/blockly-samples/issues/2268)) ([c7a4fc5](https://github.com/google/blockly-samples/commit/c7a4fc5e72c5e8d9e9bc926bbbbadd1eb31792fc))
-* 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)
-* insertion markers destroying procedure models v11 ([#2174](https://github.com/google/blockly-samples/issues/2174)) ([f14666f](https://github.com/google/blockly-samples/commit/f14666f8f7a94314bd76fc4fea2b5e88f8ba11b1))
-* shareable procedures v11 ([#2180](https://github.com/google/blockly-samples/issues/2180)) ([2d27dad](https://github.com/google/blockly-samples/commit/2d27dad7103b2039df9fca3acc706910eccf93fc))
-
-
-
-## [4.1.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.5...@blockly/block-shareable-procedures@4.1.6) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.1.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.4...@blockly/block-shareable-procedures@4.1.5) (2024-05-09)
-
-
-### Bug Fixes
-
-* add boolean to dispose function call ([#2341](https://github.com/google/blockly-samples/issues/2341)) ([161c0d1](https://github.com/google/blockly-samples/commit/161c0d18aa74bd5809ef23bdfea7a5648fb45a39)), closes [#2217](https://github.com/google/blockly-samples/issues/2217)
-
-
-
-## [4.1.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.3...@blockly/block-shareable-procedures@4.1.4) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.1.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.2...@blockly/block-shareable-procedures@4.1.3) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.1.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.1...@blockly/block-shareable-procedures@4.1.2) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.1.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.1.0...@blockly/block-shareable-procedures@4.1.1) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.1.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.7...@blockly/block-shareable-procedures@4.1.0) (2024-01-11)
-
-
-### Features
-
-* create createBackingVariable method ([#2106](https://github.com/google/blockly-samples/issues/2106)) ([1d0df1e](https://github.com/google/blockly-samples/commit/1d0df1e56d457e67c9660e2a93e6a4f06a316395))
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.6...@blockly/block-shareable-procedures@4.0.7) (2023-12-21)
-
-
-### Bug Fixes
-
-* procedure parameter serialization ([#2125](https://github.com/google/blockly-samples/issues/2125)) ([0996ed7](https://github.com/google/blockly-samples/commit/0996ed79fe75663ed2916bc0b20cc35540887324))
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.5...@blockly/block-shareable-procedures@4.0.6) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.4...@blockly/block-shareable-procedures@4.0.5) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.3...@blockly/block-shareable-procedures@4.0.4) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.2...@blockly/block-shareable-procedures@4.0.3) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.1...@blockly/block-shareable-procedures@4.0.2) (2023-10-30)
-
-
-### Features
-
-* Publish types for block-shareable-procedures ([#1952](https://github.com/google/blockly-samples/issues/1952)) ([2b60231](https://github.com/google/blockly-samples/commit/2b602317ff1a4d28cb6e1e2ad3476d4672e61a84))
-
-
-### Bug Fixes
-
-* loading procedure callers before defs without models ([#2037](https://github.com/google/blockly-samples/issues/2037)) ([517ba1b](https://github.com/google/blockly-samples/commit/517ba1b713e20f31725c760fb1a8ab8656e242d0))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@4.0.0...@blockly/block-shareable-procedures@4.0.1) (2023-10-05)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.7...@blockly/block-shareable-procedures@4.0.0) (2023-09-28)
-
-
-### ⚠ BREAKING CHANGES
-
-* changes for v10.2.0 (#1989)
-
-### release
-
-* changes for v10.2.0 ([#1989](https://github.com/google/blockly-samples/issues/1989)) ([4d81ea7](https://github.com/google/blockly-samples/commit/4d81ea7254412ef199a270fc740c2f45755a2725)), closes [#1844](https://github.com/google/blockly-samples/issues/1844) [#1845](https://github.com/google/blockly-samples/issues/1845) [#1863](https://github.com/google/blockly-samples/issues/1863) [#1880](https://github.com/google/blockly-samples/issues/1880) [#1885](https://github.com/google/blockly-samples/issues/1885) [#1886](https://github.com/google/blockly-samples/issues/1886) [#1887](https://github.com/google/blockly-samples/issues/1887) [#1888](https://github.com/google/blockly-samples/issues/1888) [#1919](https://github.com/google/blockly-samples/issues/1919) [#1920](https://github.com/google/blockly-samples/issues/1920) [#1983](https://github.com/google/blockly-samples/issues/1983) [#1984](https://github.com/google/blockly-samples/issues/1984) [#1985](https://github.com/google/blockly-samples/issues/1985) [#1991](https://github.com/google/blockly-samples/issues/1991)
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.6...@blockly/block-shareable-procedures@3.0.7) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.5...@blockly/block-shareable-procedures@3.0.6) (2023-09-14)
-
-
-### Bug Fixes
-
-* caller args disconnecting shareable procedures ([#1918](https://github.com/google/blockly-samples/issues/1918)) ([b11bf6a](https://github.com/google/blockly-samples/commit/b11bf6a4a863dd513c3d6f6686236916b8c5a0a7))
-* deleting procedures with callers not being undoable ([#1917](https://github.com/google/blockly-samples/issues/1917)) ([3d26841](https://github.com/google/blockly-samples/commit/3d268418f6e4be8d8f739fa21d582a9dc48342d7))
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.4...@blockly/block-shareable-procedures@3.0.5) (2023-08-31)
-
-
-### Bug Fixes
-
-* loading parameters for shareable procedure blocks ([#1874](https://github.com/google/blockly-samples/issues/1874)) ([117469b](https://github.com/google/blockly-samples/commit/117469bb225e5fad11f377b33866e10753cbd7b4))
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.3...@blockly/block-shareable-procedures@3.0.4) (2023-08-24)
-
-
-### Bug Fixes
-
-* shareable procedures incorrectly reconnecting caller child blocks during mutation for ([#1865](https://github.com/google/blockly-samples/issues/1865)) ([c0ce651](https://github.com/google/blockly-samples/commit/c0ce651edc2c3064a039ce465782a681e398f51a))
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.2...@blockly/block-shareable-procedures@3.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.1...@blockly/block-shareable-procedures@3.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@3.0.0...@blockly/block-shareable-procedures@3.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@2.0.1...@blockly/block-shareable-procedures@3.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@2.0.0...@blockly/block-shareable-procedures@2.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.11...@blockly/block-shareable-procedures@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))
-
-
-### Bug Fixes
-
-* procedure blocks build ([4ffd49e](https://github.com/google/blockly-samples/commit/4ffd49e452881b77ec1b9942da1bed7aae559f1f))
-
-
-
-## [1.2.11](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.10...@blockly/block-shareable-procedures@1.2.11) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.10](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.9...@blockly/block-shareable-procedures@1.2.10) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.9](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.8...@blockly/block-shareable-procedures@1.2.9) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.8](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.7...@blockly/block-shareable-procedures@1.2.8) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.7](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.6...@blockly/block-shareable-procedures@1.2.7) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.6](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.5...@blockly/block-shareable-procedures@1.2.6) (2023-03-29)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.5](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.4...@blockly/block-shareable-procedures@1.2.5) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.4](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.3...@blockly/block-shareable-procedures@1.2.4) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.3](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.2...@blockly/block-shareable-procedures@1.2.3) (2023-03-02)
-
-
-### Bug Fixes
-
-* event cycles caused by deleting and adding parameters to models ([#1552](https://github.com/google/blockly-samples/issues/1552)) ([06f5186](https://github.com/google/blockly-samples/commit/06f5186edc93a7d4e3453fdceedc0c68ea2b34d8))
-* undoing moving params ([#1585](https://github.com/google/blockly-samples/issues/1585)) ([f425670](https://github.com/google/blockly-samples/commit/f4256704d4c24158c52bf175e0f2b5821e40e940))
-* undoing renames ([#1593](https://github.com/google/blockly-samples/issues/1593)) ([4ed6f93](https://github.com/google/blockly-samples/commit/4ed6f93c28a3e5a7ebacedf1c32d7daa0f8f7c13))
-
-
-
-## [1.2.2](https://github.com/google/blockly-samples/compare/@blockly/block-shareable-procedures@1.2.1...@blockly/block-shareable-procedures@1.2.2) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## 1.2.1 (2023-02-23)
-
-**Note:** Version bump only for package @blockly/block-shareable-procedures
-
-
-
-
-
-## [1.2.0](https://github.com/google/blockly-samples/compare/@blockly/block-sharable-procedures@1.1.1...@blockly/block-sharable-procedures@1.2.0) (2023-02-23)
-
-
-### Features
-
-* add procedure blocks ([#1544](https://github.com/google/blockly-samples/issues/1544)) ([c190eca](https://github.com/google/blockly-samples/commit/c190eca57865090d9b6027ae4af7eecf425396e8))
-
-
-### Bug Fixes
-
-* callers creating definition blocks in other workspaces ([#1557](https://github.com/google/blockly-samples/issues/1557)) ([a8d91d3](https://github.com/google/blockly-samples/commit/a8d91d39616793636696cf2b6a610db82ec02303))
-* create events not fired ([#1556](https://github.com/google/blockly-samples/issues/1556)) ([b70c6d8](https://github.com/google/blockly-samples/commit/b70c6d8dcfb7af45dd2a25940426971189a6b44b))
-* updating callers in response to variable renames in other workspaces ([#1558](https://github.com/google/blockly-samples/issues/1558)) ([504fd5e](https://github.com/google/blockly-samples/commit/504fd5ed95503845c4b737041da1daa134aa3d8d))
-
-
-
-## [1.1.1](https://github.com/google/blockly-samples/compare/@blockly/block-sharable-procedures@1.1.0...@blockly/block-sharable-procedures@1.1.1) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/block-sharable-procedures
-
-
-
-
-
-## [1.1.0](https://github.com/google/blockly-samples/compare/@blockly/block-sharable-procedures@1.0.1...@blockly/block-sharable-procedures@1.1.0) (2023-02-09)
-
-
-### Features
-
-* add procedure data models ([#1526](https://github.com/google/blockly-samples/issues/1526)) ([2921277](https://github.com/google/blockly-samples/commit/29212774a6d438dd4f2d2e1f36f1b70ef800e6f0))
-* add procedure events ([#1536](https://github.com/google/blockly-samples/issues/1536)) ([05a02ae](https://github.com/google/blockly-samples/commit/05a02aed7f3f59758db83eb2d8459ce727405d4d))
-
-
-
-## 1.0.1 (2023-02-02)
-
-**Note:** Version bump only for package @blockly/block-sharable-procedures
diff --git a/plugins/block-shareable-procedures/README.md b/plugins/block-shareable-procedures/README.md
deleted file mode 100644
index b961d086f..000000000
--- a/plugins/block-shareable-procedures/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# @blockly/block-shareable-procedures [](https://github.com/google/blockly)
-
-A set of [Blockly](https://www.npmjs.com/package/blockly) blocks that allow
-end-users to define procedures (i.e. functions). These blocks reference explicit
-backing data models, which allows them to be more easily manipulated, and shared
-between workspaces.
-
-Note that these blocks have the same names as the built-in procedure blocks, so
-you can seamlessly upgrade your existing project to use the new blocks.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/block-shareable-procedures
-```
-
-### npm
-
-```
-npm install @blockly/block-shareable-procedures
-```
-
-## Usage
-
-See [developers.google.com/blockly/guides/create-custom-blocks/procedures/using-procedures](https://developers.google.com/blockly/guides/create-custom-blocks/procedures/using-procedures)
-for more information about using this plugin.
-
-## License
-
-Apache 2.0
diff --git a/plugins/block-shareable-procedures/package.json b/plugins/block-shareable-procedures/package.json
deleted file mode 100644
index 649d558b6..000000000
--- a/plugins/block-shareable-procedures/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "name": "@blockly/block-shareable-procedures",
- "version": "13.2.0",
- "description": "A plugin that adds procedure blocks which are backed by explicit data models.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "blockly-block",
- "shareable-procedures"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/block-shareable-procedures#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/block-shareable-procedures"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/block-shareable-procedures/src/blocks.ts b/plugins/block-shareable-procedures/src/blocks.ts
deleted file mode 100644
index 742b6da83..000000000
--- a/plugins/block-shareable-procedures/src/blocks.ts
+++ /dev/null
@@ -1,1395 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-'use strict';
-
-import * as Blockly from 'blockly/core';
-import {ObservableProcedureModel} from './observable_procedure_model';
-import {ObservableParameterModel} from './observable_parameter_model';
-import {IProcedureBlock} from './i_procedure_block';
-import {ProcedureCreate} from './events_procedure_create';
-
-/* eslint-disable @typescript-eslint/naming-convention */
-
-/**
- * A dictionary of the block definitions provided by this module.
- *
- * @type {!Object}
- */
-export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([
- {
- type: 'procedures_defnoreturn',
- message0: '%{BKY_PROCEDURES_DEFNORETURN_TITLE} %1 %2 %3',
- message1: '%{BKY_PROCEDURES_DEFNORETURN_DO} %1',
- args0: [
- {
- type: 'field_input',
- name: 'NAME',
- text: '',
- spellcheck: false,
- },
- {
- type: 'field_label',
- name: 'PARAMS',
- text: '',
- },
- {
- type: 'input_dummy',
- name: 'TOP',
- },
- ],
- args1: [
- {
- type: 'input_statement',
- name: 'STACK',
- },
- ],
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_DEFNORETURN_HELPURL}',
- tooltip: '%{BKY_PROCEDURES_DEFNORETURN_TOOLTIP}',
- extensions: [
- 'procedure_def_get_def_mixin',
- 'procedure_def_var_mixin',
- 'procedure_def_update_shape_mixin',
- 'procedure_def_context_menu_mixin',
- 'procedure_def_onchange_mixin',
- 'procedure_def_validator_helper',
- 'procedure_defnoreturn_get_caller_block_mixin',
- 'procedure_defnoreturn_set_comment_helper',
- 'procedure_def_set_no_return_helper',
- ],
- mutator: 'procedure_def_mutator',
- },
- {
- type: 'procedures_callnoreturn',
- message0: '%1 %2',
- args0: [
- {type: 'field_label', name: 'NAME', text: '%{BKY_UNNAMED_KEY}'},
- {
- type: 'input_dummy',
- name: 'TOPROW',
- },
- ],
- nextStatement: null,
- previousStatement: null,
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_CALLNORETURN_HELPURL}',
- extensions: [
- 'procedure_caller_get_def_mixin',
- 'procedure_caller_var_mixin',
- 'procedure_caller_update_shape_mixin',
- 'procedure_caller_context_menu_mixin',
- 'procedure_caller_onchange_mixin',
- 'procedure_callernoreturn_get_def_block_mixin',
- ],
- mutator: 'procedure_caller_mutator',
- },
- {
- type: 'procedures_defreturn',
- message0: '%{BKY_PROCEDURES_DEFRETURN_TITLE} %1 %2 %3',
- message1: '%{BKY_PROCEDURES_DEFRETURN_DO} %1',
- message2: '%{BKY_PROCEDURES_DEFRETURN_RETURN} %1',
- args0: [
- {
- type: 'field_input',
- name: 'NAME',
- text: '',
- spellcheck: false,
- },
- {
- type: 'field_label',
- name: 'PARAMS',
- text: '',
- },
- {
- type: 'input_dummy',
- name: 'TOP',
- },
- ],
- args1: [
- {
- type: 'input_statement',
- name: 'STACK',
- },
- ],
- args2: [
- {
- type: 'input_value',
- align: 'right',
- name: 'RETURN',
- },
- ],
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_DEFRETURN_HELPURL}',
- tooltip: '%{BKY_PROCEDURES_DEFRETURN_TOOLTIP}',
- extensions: [
- 'procedure_def_get_def_mixin',
- 'procedure_def_var_mixin',
- 'procedure_def_update_shape_mixin',
- 'procedure_def_context_menu_mixin',
- 'procedure_def_onchange_mixin',
- 'procedure_def_validator_helper',
- 'procedure_defreturn_get_caller_block_mixin',
- 'procedure_defreturn_set_comment_helper',
- 'procedure_def_set_return_helper',
- ],
- mutator: 'procedure_def_mutator',
- },
- {
- type: 'procedures_callreturn',
- message0: '%1 %2',
- args0: [
- {type: 'field_label', name: 'NAME', text: '%{BKY_UNNAMED_KEY}'},
- {
- type: 'input_dummy',
- name: 'TOPROW',
- },
- ],
- output: null,
- style: 'procedure_blocks',
- helpUrl: '%{BKY_PROCEDURES_CALLRETURN_HELPURL}',
- extensions: [
- 'procedure_caller_get_def_mixin',
- 'procedure_caller_var_mixin',
- 'procedure_caller_update_shape_mixin',
- 'procedure_caller_context_menu_mixin',
- 'procedure_caller_onchange_mixin',
- 'procedure_callerreturn_get_def_block_mixin',
- ],
- mutator: 'procedure_caller_mutator',
- },
-]);
-
-const procedureDefGetDefMixin = function () {
- const mixin = {
- model_: null,
-
- /**
- * Returns the data model for this procedure block.
- *
- * @returns The data model for this procedure
- * block.
- */
- getProcedureModel() {
- return this.model_;
- },
-
- /**
- * True if this is a procedure definition block, false otherwise (i.e.
- * it is a caller).
- *
- * @returns True because this is a procedure definition block.
- */
- isProcedureDef() {
- return true;
- },
-
- /**
- * Return all variables referenced by this block.
- *
- * @returns List of variable names.
- * @this {Blockly.Block}
- */
- getVars: function () {
- return this.getProcedureModel()
- .getParameters()
- .map((p) => p.getVariableModel().name);
- },
-
- /**
- * Return all variables referenced by this block.
- *
- * @returns List of variable models.
- * @this {Blockly.Block}
- */
- getVarModels: function () {
- return this.getProcedureModel()
- .getParameters()
- .map((p) => p.getVariableModel());
- },
-
- /**
- * Disposes of the data model for this procedure block when the block is
- * disposed.
- */
- destroy: function () {
- if (!this.isInsertionMarker()) {
- this.workspace
- .getProcedureMap()
- .delete(this.getProcedureModel().getId());
- }
- },
- };
-
- mixin.model_ = new ObservableProcedureModel(
- this.workspace,
- Blockly.Procedures.findLegalName(this.getFieldValue('NAME'), this),
- );
-
- // Events cannot be fired from instantiation when deserializing or dragging
- // from the flyout. So make this consistent and never fire from instantiation.
- Blockly.Events.disable();
- this.workspace.getProcedureMap().add(mixin.getProcedureModel());
- Blockly.Events.enable();
-
- this.mixin(mixin, true);
-};
-// Using register instead of registerMixin to avoid triggering warnings about
-// overriding built-ins.
-Blockly.Extensions.register(
- 'procedure_def_get_def_mixin',
- procedureDefGetDefMixin,
-);
-
-const procedureDefVarMixin = function () {
- const mixin = {
- /**
- * Notification that a variable is renaming.
- * If the ID matches one of this block's variables, rename it.
- *
- * @param oldId ID of variable to rename.
- * @param newId ID of new variable. May be the same as oldId, but
- * with an updated name. Guaranteed to be the same type as the old
- * variable.
- * @override
- * @this {Blockly.Block}
- */
- renameVarById: function (oldId, newId) {
- const oldVar = this.workspace.getVariableMap().getVariableById(oldId);
- const model = this.getProcedureModel();
- const index = model
- .getParameters()
- .findIndex((p) => p.getVariableModel() === oldVar);
- if (index === -1) return; // Not found.
- const newVar = this.workspace.getVariableMap().getVariableById(newId);
- const oldParam = model.getParameter(index);
- oldParam.setName(newVar.name);
- },
-
- /**
- * Notification that a variable is renaming but keeping the same ID. If the
- * variable is in use on this block, rerender to show the new name.
- *
- * @param variable The variable being renamed.
- * @package
- * @override
- * @this {Blockly.Block}
- */
- updateVarName: function (variable) {
- const containsVar = this.getProcedureModel()
- .getParameters()
- .some((p) => p.getVariableModel() === variable);
- if (containsVar) {
- this.doProcedureUpdate(); // Rerender.
- }
- },
- };
-
- this.mixin(mixin, true);
-};
-// Using register instead of registerMixin to avoid triggering warnings about
-// overriding built-ins.
-Blockly.Extensions.register('procedure_def_var_mixin', procedureDefVarMixin);
-
-const procedureDefUpdateShapeMixin = {
- /**
- * Updates the block to reflect the state of the procedure model.
- */
- doProcedureUpdate: function () {
- this.setFieldValue(this.getProcedureModel().getName(), 'NAME');
- this.setDisabledReason(!this.getProcedureModel().getEnabled());
- this.updateParameters_();
- this.updateMutator_();
- },
-
- /**
- * Updates the parameters field to reflect the parameters in the procedure
- * model.
- */
- updateParameters_: function () {
- const params = this.getProcedureModel()
- .getParameters()
- .map((p) => p.getName());
- const paramString = params.length
- ? `${Blockly.Msg['PROCEDURES_BEFORE_PARAMS']} ${params.join(', ')}`
- : '';
-
- // The field is deterministic based on other events, no need to fire.
- Blockly.Events.disable();
- try {
- this.setFieldValue(paramString, 'PARAMS');
- } finally {
- Blockly.Events.enable();
- }
- },
-
- /**
- * Updates the parameter blocks in the mutator (if it is open) to reflect
- * the state of the procedure model.
- */
- updateMutator_: function () {
- const mutator = this.getIcon(Blockly.icons.MutatorIcon.TYPE);
- if (!mutator?.bubbleIsVisible()) return;
-
- const mutatorWorkspace = this.mutator.getWorkspace();
- for (const p of this.getProcedureModel().getParameters()) {
- const block = mutatorWorkspace.getBlockById(p.getId());
- if (!block) continue; // Should not happen.
- if (block.getFieldValue('NAME') !== p.getName()) {
- block.setFieldValue(p.getName(), 'NAME');
- }
- }
- },
-
- /**
- * Add or remove the statement block from this function definition.
- *
- * @param hasStatements True if a statement block is needed.
- * @this {Blockly.Block}
- */
- setStatements_: function (hasStatements) {
- if (this.hasStatements_ === hasStatements) {
- return;
- }
- if (hasStatements) {
- this.appendStatementInput('STACK').appendField(
- Blockly.Msg['PROCEDURES_DEFNORETURN_DO'],
- );
- if (this.getInput('RETURN')) {
- this.moveInputBefore('STACK', 'RETURN');
- }
- // Restore the stack, if one was saved.
- this.statementConnection_?.reconnect(this, 'STACK');
- this.statementConnection_ = null;
- } else {
- // Save the stack, then disconnect it.
- const stackConnection = this.getInput('STACK').connection;
- this.statementConnection_ = stackConnection.targetConnection;
- if (this.statementConnection_) {
- const stackBlock = stackConnection.targetBlock();
- stackBlock.unplug();
- stackBlock.bumpNeighbours();
- }
- this.removeInput('STACK', true);
- }
- this.hasStatements_ = hasStatements;
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_def_update_shape_mixin',
- procedureDefUpdateShapeMixin,
-);
-
-const procedureDefValidatorHelper = function () {
- const nameField = this.getField('NAME');
- nameField.setValue(Blockly.Procedures.findLegalName('', this));
- nameField.setValidator(Blockly.Procedures.rename);
-};
-Blockly.Extensions.register(
- 'procedure_def_validator_helper',
- procedureDefValidatorHelper,
-);
-
-const procedureDefMutator = {
- hasStatements_: true,
-
- /**
- * Create XML to represent the argument inputs.
- * Backwards compatible serialization implementation.
- *
- * @returns XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function () {
- const container = Blockly.utils.xml.createElement('mutation');
- const params = this.getProcedureModel().getParameters();
- for (let i = 0; i < params.length; i++) {
- const parameter = Blockly.utils.xml.createElement('arg');
- const varModel = params[i].getVariableModel();
- parameter.setAttribute('name', varModel.name);
- parameter.setAttribute('varid', varModel.getId());
- container.appendChild(parameter);
- }
-
- // Save whether the statement input is visible.
- if (!this.hasStatements_) {
- container.setAttribute('statements', 'false');
- }
- return container;
- },
-
- /**
- * Parse XML to restore the argument inputs.
- * Backwards compatible serialization implementation.
- *
- * @param xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- for (let i = 0; i < xmlElement.childNodes.length; i++) {
- const node = xmlElement.childNodes[i];
- if (node.nodeName.toLowerCase() !== 'arg') continue;
- const varId = node.getAttribute('varid');
- this.getProcedureModel().insertParameter(
- new ObservableParameterModel(
- this.workspace,
- node.getAttribute('name'),
- undefined,
- varId,
- ),
- i,
- );
- }
- this.setStatements_(xmlElement.getAttribute('statements') !== 'false');
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- *
- * @param doFullSerialization Tells the block if it should serialize
- * its entire state (including data stored in the backing procedure
- * model). Used for copy-paste.
- * @returns The state of this block, eg the parameters and statements.
- */
- saveExtraState: function (doFullSerialization) {
- const state = Object.create(null);
- state['procedureId'] = this.getProcedureModel().getId();
-
- if (doFullSerialization) {
- state['fullSerialization'] = true;
- const params = this.getProcedureModel().getParameters();
- if (params.length) {
- state['params'] = params.map((p) => {
- return {
- name: p.getName(),
- id: p.getVariableModel().getId(),
- // Ideally this would be id, and the other would be varId,
- // but backwards compatibility :/
- paramId: p.getId(),
- };
- });
- }
- }
- if (!this.hasStatements_) {
- state['hasStatements'] = false;
- }
- return state;
- },
-
- /**
- * Applies the given state to this block.
- *
- * @param state The state to apply to this block, eg the parameters and
- * statements.
- */
- loadExtraState: function (state) {
- const map = this.workspace.getProcedureMap();
-
- const procedureId = state['procedureId'];
- if (map.has(procedureId) && !state['fullSerialization']) {
- if (map.has(this.model_.getId())) {
- map.delete(this.model_.getId());
- }
- this.model_ = map.get(procedureId);
- }
-
- const model = this.getProcedureModel();
- const newParams = state['params'] ?? [];
- const newIds = new Set(newParams.map((p) => p.id));
- const currParams = model.getParameters();
- if (state['fullSerialization']) {
- for (let i = currParams.length - 1; i >= 0; i--) {
- if (!newIds.has(currParams[i].getId)) {
- model.deleteParameter(i);
- }
- }
- }
- for (let i = 0; i < newParams.length; i++) {
- const {name, id, paramId} = state['params'][i];
- this.getProcedureModel().insertParameter(
- new ObservableParameterModel(this.workspace, name, paramId, id),
- i,
- );
- }
-
- this.doProcedureUpdate();
- this.setStatements_(state['hasStatements'] === false ? false : true);
- },
-
- /**
- * Populate the mutator's dialog with this block's components.
- *
- * @param workspace Blockly.Mutator's workspace.
- * @returns Root block in mutator.
- * @this {Blockly.Block}
- */
- decompose: function (workspace) {
- const containerBlockDef = {
- type: 'procedures_mutatorcontainer',
- inputs: {
- STACK: {},
- },
- };
-
- let connDef = containerBlockDef['inputs']['STACK'];
- for (const param of this.getProcedureModel().getParameters()) {
- connDef['block'] = {
- type: 'procedures_mutatorarg',
- id: param.getId(),
- fields: {
- NAME: param.getName(),
- },
- next: {},
- };
- connDef = connDef['block']['next'];
- }
-
- const containerBlock = Blockly.serialization.blocks.append(
- containerBlockDef as unknown as Blockly.serialization.blocks.State,
- workspace,
- {recordUndo: false},
- );
-
- if (this.type === 'procedures_defreturn') {
- containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');
- } else {
- containerBlock.removeInput('STATEMENT_INPUT');
- }
-
- return containerBlock;
- },
-
- /**
- * Reconfigure this block based on the mutator dialog's components.
- *
- * @param containerBlock Root block in mutator.
- * @this {Blockly.Block}
- */
- compose: function (containerBlock) {
- // Note that only one of these four things can actually occur for any given
- // composition, because the user can only drag blocks around so quickly.
- // So we can use that when making assumptions inside the definitions of
- // these sub procedures.
- this.deleteParamsFromModel_(containerBlock);
- this.renameParamsInModel_(containerBlock);
- this.addParamsToModel_(containerBlock);
-
- const hasStatements = containerBlock.getFieldValue('STATEMENTS');
- if (hasStatements !== null) {
- this.setStatements_(hasStatements === 'TRUE');
- }
- },
-
- /**
- * Deletes any parameters from the procedure model that do not have associated
- * parameter blocks in the mutator.
- *
- * @param containerBlock Root block in the mutator.
- */
- deleteParamsFromModel_: function (containerBlock) {
- const ids = new Set(containerBlock.getDescendants().map((b) => b.id));
- const model = this.getProcedureModel();
- const count = model.getParameters().length;
- for (let i = count - 1; i >= 0; i--) {
- if (!ids.has(model.getParameter(i).getId())) {
- model.deleteParameter(i);
- }
- }
- },
-
- /**
- * Renames any parameters in the procedure model whose associated parameter
- * blocks have been renamed.
- *
- * @param containerBlock Root block in the mutator.
- */
- renameParamsInModel_: function (containerBlock) {
- const model = this.getProcedureModel();
-
- let i = 0;
- let paramBlock = containerBlock.getInputTargetBlock('STACK');
- while (paramBlock && !paramBlock.isInsertionMarker()) {
- const param = model.getParameter(i);
- if (
- param &&
- param.getId() === paramBlock.id &&
- param.getName() !== paramBlock.getFieldValue('NAME')
- ) {
- param.setName(paramBlock.getFieldValue('NAME'));
- }
- paramBlock =
- paramBlock.nextConnection && paramBlock.nextConnection.targetBlock();
- i++;
- }
- },
-
- /**
- * Adds new parameters to the procedure model for any new procedure parameter
- * blocks.
- *
- * @param containerBlock Root block in the mutator.
- */
- addParamsToModel_: function (containerBlock) {
- const model = this.getProcedureModel();
-
- let i = 0;
- let paramBlock = containerBlock.getInputTargetBlock('STACK');
- while (paramBlock && !paramBlock.isInsertionMarker()) {
- if (
- !model.getParameter(i) ||
- model.getParameter(i).getId() !== paramBlock.id
- ) {
- model.insertParameter(
- new ObservableParameterModel(
- this.workspace,
- paramBlock.getFieldValue('NAME'),
- paramBlock.id,
- ),
- i,
- );
- }
- paramBlock =
- paramBlock.nextConnection && paramBlock.nextConnection.targetBlock();
- i++;
- }
- },
-};
-Blockly.Extensions.registerMutator(
- 'procedure_def_mutator',
- procedureDefMutator,
- undefined,
- ['procedures_mutatorarg'],
-);
-
-const procedureDefContextMenuMixin = {
- /**
- * Add custom menu options to this block's context menu.
- *
- * @param options List of menu options to add to.
- * @this {Blockly.Block}
- */
- customContextMenu: function (
- options: Array<
- | Blockly.ContextMenuRegistry.ContextMenuOption
- | Blockly.ContextMenuRegistry.LegacyContextMenuOption
- >,
- ) {
- if (this.isInFlyout) {
- return;
- }
-
- const xmlMutation = Blockly.utils.xml.createElement('mutation');
- xmlMutation.setAttribute('name', this.getFieldValue('NAME'));
- const params = this.getProcedureModel().getParameters();
- for (const param of params) {
- const xmlArg = Blockly.utils.xml.createElement('arg');
- xmlArg.setAttribute('name', param.getName());
- xmlMutation.appendChild(xmlArg);
- }
- const xmlBlock = Blockly.utils.xml.createElement('block');
- xmlBlock.setAttribute('type', this.callType_);
- xmlBlock.appendChild(xmlMutation);
-
- // Add option to create caller.
- options.push({
- enabled: true,
- text: Blockly.Msg['PROCEDURES_CREATE_DO'].replace(
- '%1',
- this.getFieldValue('NAME'),
- ),
- callback: Blockly.ContextMenu.callbackFactory(
- this,
- xmlBlock,
- ) as () => void,
- });
-
- // Add options to create getters for each parameter.
- if (this.isCollapsed()) return;
-
- for (const param of params) {
- const argVar = param.getVariableModel();
- const argXmlField = Blockly.Variables.generateVariableFieldDom(argVar);
- const argXmlBlock = Blockly.utils.xml.createElement('block');
- argXmlBlock.setAttribute('type', 'variables_get');
- argXmlBlock.appendChild(argXmlField);
- options.push({
- enabled: true,
- text: Blockly.Msg['VARIABLES_SET_CREATE_GET'].replace(
- '%1',
- argVar.name,
- ),
- callback: Blockly.ContextMenu.callbackFactory(
- this,
- argXmlBlock,
- ) as () => void,
- });
- }
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_def_context_menu_mixin',
- procedureDefContextMenuMixin,
-);
-
-const procedureDefOnChangeMixin = {
- onchange: function (e) {
- if (e.type === Blockly.Events.BLOCK_CREATE && e.blockId === this.id) {
- Blockly.Events.fire(
- new ProcedureCreate(this.workspace, this.getProcedureModel()),
- );
- }
- if (
- e.type === Blockly.Events.BLOCK_CHANGE &&
- e.blockId === this.id &&
- e.element === 'disabled'
- ) {
- this.getProcedureModel().setEnabled(this.isEnabled());
- }
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_def_onchange_mixin',
- procedureDefOnChangeMixin,
-);
-
-const procedureDefNoReturnSetCommentHelper = function () {
- if (
- (this.workspace.options.comments ||
- (this.workspace.options.parentWorkspace &&
- this.workspace.options.parentWorkspace.options.comments)) &&
- Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']
- ) {
- this.setCommentText(Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']);
- }
-};
-Blockly.Extensions.register(
- 'procedure_defnoreturn_set_comment_helper',
- procedureDefNoReturnSetCommentHelper,
-);
-
-const procedureDefReturnSetCommentHelper = function () {
- if (
- (this.workspace.options.comments ||
- (this.workspace.options.parentWorkspace &&
- this.workspace.options.parentWorkspace.options.comments)) &&
- Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']
- ) {
- this.setCommentText(Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']);
- }
-};
-Blockly.Extensions.register(
- 'procedure_defreturn_set_comment_helper',
- procedureDefReturnSetCommentHelper,
-);
-
-const procedureDefNoReturnGetCallerBlockMixin = {
- callType_: 'procedures_callnoreturn',
-};
-Blockly.Extensions.registerMixin(
- 'procedure_defnoreturn_get_caller_block_mixin',
- procedureDefNoReturnGetCallerBlockMixin,
-);
-
-const procedureDefReturnGetCallerBlockMixin = {
- callType_: 'procedures_callreturn',
-};
-Blockly.Extensions.registerMixin(
- 'procedure_defreturn_get_caller_block_mixin',
- procedureDefReturnGetCallerBlockMixin,
-);
-
-const procedureDefSetNoReturnHelper = function () {
- this.getProcedureModel().setReturnTypes(null);
-};
-Blockly.Extensions.register(
- 'procedure_def_set_no_return_helper',
- procedureDefSetNoReturnHelper,
-);
-
-const procedureDefSetReturnHelper = function () {
- this.getProcedureModel().setReturnTypes([]);
-};
-Blockly.Extensions.register(
- 'procedure_def_set_return_helper',
- procedureDefSetReturnHelper,
-);
-
-const procedureCallerGetDefMixin = function () {
- const mixin = {
- model_: null,
-
- prevParams_: [],
-
- argsMap_: new Map(),
-
- /**
- * Returns the procedure model associated with this block.
- *
- * @returns The procedure model associated with this block.
- */
- getProcedureModel() {
- return this.model_;
- },
-
- /**
- * Returns the procedure model tha was found.
- *
- * @param name The name of the procedure model to find.
- * @param params The param names of the procedure model
- * to find.
- * @returns The procedure model that was found.
- */
- findProcedureModel_(name, params = []) {
- const workspace = this.getTargetWorkspace_();
- const model = workspace
- .getProcedureMap()
- .getProcedures()
- .find((proc) => proc.getName() === name);
- if (!model) return null;
-
- const returnTypes = model.getReturnTypes();
- const hasMatchingReturn = this.hasReturn_ ? returnTypes : !returnTypes;
- if (!hasMatchingReturn) return null;
-
- const hasMatchingParams = model
- .getParameters()
- .every((p, i) => p.getName() === params[i]);
- if (!hasMatchingParams) return null;
-
- return model;
- },
-
- /**
- * Returns the main workspace (i.e. not the flyout workspace) associated
- * with this block.
- *
- * @returns The main workspace (i.e. not the flyout workspace) associated
- * with this block.
- */
- getTargetWorkspace_() {
- return this.workspace.isFlyout
- ? this.workspace.targetWorkspace
- : this.workspace;
- },
-
- /**
- * True if this is a procedure definition block, false otherwise (i.e.
- * it is a caller).
- *
- * @returns False because this is not a procedure definition block.
- */
- isProcedureDef() {
- return false;
- },
-
- /**
- * Return all variables referenced by this block.
- *
- * @returns List of variable names.
- * @this {Blockly.Block}
- */
- getVars: function () {
- return this.getProcedureModel()
- .getParameters()
- .map((p) => p.getVariableModel().name);
- },
-
- /**
- * Return all variables referenced by this block.
- *
- * @returns List of variable models.
- * @this {Blockly.Block}
- */
- getVarModels: function () {
- return this.getProcedureModel()
- .getParameters()
- .map((p) => p.getVariableModel());
- },
- };
-
- this.mixin(mixin, true);
-};
-// Using register instead of registerMixin to avoid triggering warnings about
-// overriding built-ins.
-Blockly.Extensions.register(
- 'procedure_caller_get_def_mixin',
- procedureCallerGetDefMixin,
-);
-
-const procedureCallerVarMixin = function () {
- const mixin = {
- /**
- * Notification that a variable is renaming but keeping the same ID. If the
- * variable is in use on this block, rerender to show the new name.
- *
- * @param variable The variable being renamed.
- * @package
- * @override
- * @this {Blockly.Block}
- */
- updateVarName: function (variable) {
- const containsVar = this.getProcedureModel()
- .getParameters()
- .some((p) => p.getVariableModel() === variable);
- if (containsVar) {
- this.doProcedureUpdate(); // Rerender.
- }
- },
- };
-
- this.mixin(mixin, true);
-};
-// Using register instead of registerMixin to avoid triggering warnings about
-// overriding built-ins.
-Blockly.Extensions.register(
- 'procedure_caller_var_mixin',
- procedureCallerVarMixin,
-);
-
-const procedureCallerMutator = {
- paramsFromSerializedState_: [],
-
- /**
- * Create XML to represent the (non-editable) name and arguments.
- * Backwards compatible serialization implementation.
- *
- * @returns XML storage element.
- * @this {Blockly.Block}
- */
- mutationToDom: function () {
- const container = Blockly.utils.xml.createElement('mutation');
- const model = this.getProcedureModel();
- if (!model) return container;
-
- container.setAttribute('name', model.getName());
- for (const param of model.getParameters()) {
- const arg = Blockly.utils.xml.createElement('arg');
- arg.setAttribute('name', param.getName());
- container.appendChild(arg);
- }
- return container;
- },
-
- /**
- * Parse XML to restore the (non-editable) name and parameters.
- * Backwards compatible serialization implementation.
- *
- * @param xmlElement XML storage element.
- * @this {Blockly.Block}
- */
- domToMutation: function (xmlElement) {
- const name = xmlElement.getAttribute('name');
- const params = [];
- for (const n of xmlElement.childNodes) {
- if (n.nodeName.toLowerCase() === 'arg') {
- params.push(n.getAttribute('name'));
- }
- }
- this.deserialize_(name, params);
- },
-
- /**
- * Returns the state of this block as a JSON serializable object.
- *
- * @returns The state of
- * this block, ie the params and procedure name.
- */
- saveExtraState: function () {
- const state = Object.create(null);
- const model = this.getProcedureModel();
- if (!model) {
- // We reached here because we've deserialized a caller into a workspace
- // where its model did not already exist (no procedures array in the json,
- // and deserialized before any definition block), and are reserializing
- // it before the event delay has elapsed and change listeners have run.
- // (If they had run, we would have found or created a model).
- // Just reserialize any deserialized state. Nothing should have happened
- // in-between to change it.
- state['name'] = this.getFieldValue('NAME');
- state['params'] = this.paramsFromSerializedState_;
- return state;
- }
- state['name'] = model.getName();
- if (model.getParameters().length) {
- state['params'] = model.getParameters().map((p) => p.getName());
- }
- return state;
- },
-
- /**
- * Applies the given state to this block.
- *
- * @param state The state to apply to this block, ie the params and
- * procedure name.
- */
- loadExtraState: function (state) {
- this.deserialize_(state['name'], state['params'] || []);
- },
-
- /**
- * Applies the given name and params from the serialized state to the block.
- *
- * @param name The name to apply to the block.
- * @param params The parameters to apply to the block.
- */
- deserialize_: function (name, params) {
- this.setFieldValue(name, 'NAME');
- if (!this.model_) this.model_ = this.findProcedureModel_(name, params);
- if (this.getProcedureModel()) {
- this.initBlockWithProcedureModel_();
- } else {
- // Create inputs based on the mutation so that children can be connected.
- this.createArgInputs_(params);
- }
- this.paramsFromSerializedState_ = params;
- },
-};
-Blockly.Extensions.registerMutator(
- 'procedure_caller_mutator',
- procedureCallerMutator,
-);
-
-const PROCEDURE_MODEL_DISABLED_REASON = 'PROCEDURE_MODEL_DISABLED';
-
-const procedureCallerUpdateShapeMixin = {
- /**
- * Renders the block for the first time based on the procedure model.
- */
- initBlockWithProcedureModel_() {
- this.prevParams_ = [...this.getProcedureModel().getParameters()];
- this.doProcedureUpdate();
- },
-
- /**
- * Updates the shape of this block to reflect the state of the data model.
- */
- doProcedureUpdate: function () {
- if (!this.getProcedureModel() || this.isDeadOrDying()) return;
- const id = this.getProcedureModel().getId();
- if (
- !this.getTargetWorkspace_().getProcedureMap().has(id) &&
- !this.isInFlyout
- ) {
- this.dispose(true);
- return;
- }
- this.updateName_();
- this.updateEnabled_();
- this.updateParameters_();
- },
-
- /**
- * Updates the name field of this block to match the state of the data model.
- */
- updateName_: function () {
- const name = this.getProcedureModel().getName();
- this.setFieldValue(name, 'NAME');
- const baseMsg = this.outputConnection
- ? Blockly.Msg['PROCEDURES_CALLRETURN_TOOLTIP']
- : Blockly.Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];
- this.setTooltip(baseMsg.replace('%1', name));
- },
-
- /**
- * Updates the enabled state of this block to match the state of the data
- * model.
- */
- updateEnabled_: function () {
- this.setDisabledReason(
- !this.getProcedureModel().getEnabled(),
- PROCEDURE_MODEL_DISABLED_REASON,
- );
- },
-
- /**
- * Updates the parameter fields/inputs of this block to match the state of the
- * data model.
- */
- updateParameters_: function () {
- this.syncArgsMap_();
- this.deleteAllArgInputs_();
- this.addParametersLabel__();
- this.createArgInputs_();
- this.reattachBlocks_();
- this.prevParams_ = [...this.getProcedureModel().getParameters()];
- },
-
- /**
- * Makes sure that if we are updating the parameters before any move events
- * have happened, the args map records the current state of the block. Does
- * not remove entries from the array, since blocks can be disconnected
- * temporarily during mutation (which triggers this method).
- */
- syncArgsMap_: function () {
- // We look at the prevParams array because the current state of the block
- // matches the old params, not the new params state.
- for (const [i, p] of this.prevParams_.entries()) {
- const target = this.getInputTargetBlock(`ARG${i}`);
- if (target) this.argsMap_.set(p.getId(), target);
- }
- },
-
- /**
- * Saves a map of parameter IDs to target blocks attached to the inputs
- * of this caller block.
- */
- updateArgsMap_: function () {
- for (const [i, p] of this.getProcedureModel().getParameters().entries()) {
- const target = this.getInputTargetBlock(`ARG${i}`);
- if (target) {
- this.argsMap_.set(p.getId(), target);
- } else {
- this.argsMap_.delete(p.getId());
- }
- }
- },
-
- /**
- * Deletes all the parameter inputs on this block.
- */
- deleteAllArgInputs_: function () {
- let i = 0;
- while (this.getInput(`ARG${i}`)) {
- this.removeInput(`ARG${i}`);
- i++;
- }
- },
-
- /**
- * Adds or removes the parameter label to match the state of the data model.
- */
- addParametersLabel__: function () {
- const topRow = this.getInput('TOPROW');
- if (this.getProcedureModel().getParameters().length) {
- if (!this.getField('WITH')) {
- topRow.appendField(
- Blockly.Msg['PROCEDURES_CALL_BEFORE_PARAMS'],
- 'WITH',
- );
- topRow.init();
- }
- } else if (this.getField('WITH')) {
- topRow.removeField('WITH');
- }
- },
-
- /**
- * Creates all of the parameter inputs to match the state of the data model.
- *
- * @param params The params to add to the block, or null to
- * use the params defined in the procedure model.
- */
- createArgInputs_: function (params = null) {
- if (!params) {
- params = this.getProcedureModel()
- .getParameters()
- .map((p) => p.getName());
- }
- for (const [i, p] of params.entries()) {
- this.appendValueInput(`ARG${i}`)
- .appendField(new Blockly.FieldLabel(p), `ARGNAME${i}`)
- .setAlign(Blockly.inputs.Align.RIGHT);
- }
- },
-
- /**
- * Reattaches blocks to this blocks' inputs based on the data saved in the
- * argsMap_.
- */
- reattachBlocks_: function () {
- const params = this.getProcedureModel().getParameters();
- for (const [i, p] of params.entries()) {
- if (!this.argsMap_.has(p.getId())) continue;
- this.getInput(`ARG${i}`).connection.connect(
- this.argsMap_.get(p.getId()).outputConnection,
- );
- }
- },
-
- /**
- * Notification that a procedure is renaming.
- * If the name matches this block's procedure, rename it.
- *
- * @param oldName Previous name of procedure.
- * @param newName Renamed procedure.
- * @this {Blockly.Block}
- */
- renameProcedure: function (oldName, newName) {
- if (Blockly.Names.equals(oldName, this.getFieldValue('NAME'))) {
- this.setFieldValue(newName, 'NAME');
- const baseMsg = this.outputConnection
- ? Blockly.Msg['PROCEDURES_CALLRETURN_TOOLTIP']
- : Blockly.Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];
- this.setTooltip(baseMsg.replace('%1', newName));
- }
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_caller_update_shape_mixin',
- procedureCallerUpdateShapeMixin,
-);
-
-const procedureCallerOnChangeMixin = {
- /**
- * Procedure calls cannot exist without the corresponding procedure
- * definition. Enforce this link whenever an event is fired.
- *
- * @param event Change event.
- * @this {Blockly.Block}
- */
- onchange: function (event) {
- if (this.disposed || this.workspace.isFlyout) return;
- if (event.type === Blockly.Events.BLOCK_MOVE) this.updateArgsMap_(true);
- if (
- event.type !== Blockly.Events.FINISHED_LOADING &&
- !this.eventIsCreatingThisBlockDuringPaste_(event)
- )
- return;
-
- // We already found our model, which means we don't need to create a block.
- if (this.getProcedureModel()) return;
-
- // Look for the case where a procedure call was created (usually through
- // paste) and there is no matching definition. In this case, create
- // an empty definition block with the correct signature.
- const name = this.getFieldValue('NAME');
- let def = Blockly.Procedures.getDefinition(name, this.workspace);
- if (!this.defMatches_(def)) def = null;
- if (!def) {
- // We have no def nor procedure model.
- Blockly.Events.setGroup(event.group);
- this.model_ = this.createDef_(
- this.getFieldValue('NAME'),
- this.paramsFromSerializedState_,
- );
- Blockly.Events.setGroup(false);
- }
- if (!this.getProcedureModel()) {
- // We have a def, but no reference to its model.
- this.model_ = this.findProcedureModel_(
- this.getFieldValue('NAME'),
- this.paramsFromSerializedState_,
- );
- }
- this.initBlockWithProcedureModel_();
- },
-
- /**
- * @param event The event to check.
- * @returns True if the given event is a paste event for this block.
- */
- eventIsCreatingThisBlockDuringPaste_(event) {
- return (
- event.type === Blockly.Events.BLOCK_CREATE &&
- (event.blockId === this.id || event.ids.indexOf(this.id) !== -1) &&
- // Record undo makes sure this is during paste.
- event.recordUndo
- );
- },
-
- /**
- * Returns true if the given def block matches the definition of this caller
- * block.
- *
- * @param defBlock The definition block to check against.
- * @returns Whether the def block matches or not.
- */
- defMatches_(defBlock) {
- return (
- defBlock &&
- defBlock.type === this.defType_ &&
- JSON.stringify(defBlock.getVars()) ===
- JSON.stringify(this.paramsFromSerializedState_)
- );
- },
-
- /**
- * Creates a procedure definition block with the given name and params,
- * and returns the procedure model associated with it.
- *
- * @param name The name of the procedure to create.
- * @param params The names of the parameters to create.
- * @returns The procedure model associated with the new
- * procedure definition block.
- */
- createDef_(name, params = []) {
- const xy = this.getRelativeToSurfaceXY();
- const newName = Blockly.Procedures.findLegalName(name, this);
- this.renameProcedure(name, newName);
-
- const blockDef = {
- type: this.defType_,
- x: xy.x + Blockly.config.snapRadius * (this.RTL ? -1 : 1),
- y: xy.y + Blockly.config.snapRadius * 2,
- extraState: {
- params: params.map((p) => ({name: p})),
- },
- fields: {NAME: newName},
- };
- const block = Blockly.serialization.blocks.append(
- blockDef,
- this.getTargetWorkspace_(),
- {recordUndo: true},
- );
- return (block as unknown as IProcedureBlock).getProcedureModel();
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_caller_onchange_mixin',
- procedureCallerOnChangeMixin,
-);
-
-const procedureCallerContextMenuMixin = {
- /**
- * Add menu option to find the definition block for this call.
- *
- * @param options List of menu options to add to.
- * @this {Blockly.Block}
- */
- customContextMenu: function (options) {
- if (!this.workspace.isMovable()) {
- // If we center on the block and the workspace isn't movable we could
- // lose blocks at the edges of the workspace.
- return;
- }
-
- const name = this.getFieldValue('NAME');
- const workspace = this.workspace;
- const callback = function () {
- const def = Blockly.Procedures.getDefinition(name, workspace);
- if (def && def instanceof Blockly.BlockSvg) {
- workspace.centerOnBlock(def.id);
- def.select();
- }
- };
- options.push({
- enabled: true,
- text: Blockly.Msg['PROCEDURES_HIGHLIGHT_DEF'],
- callback: callback,
- });
- },
-};
-Blockly.Extensions.registerMixin(
- 'procedure_caller_context_menu_mixin',
- procedureCallerContextMenuMixin,
-);
-
-const procedureCallerNoReturnGetDefBlockMixin = {
- hasReturn_: false,
- defType_: 'procedures_defnoreturn',
-};
-Blockly.Extensions.registerMixin(
- 'procedure_callernoreturn_get_def_block_mixin',
- procedureCallerNoReturnGetDefBlockMixin,
-);
-
-const procedureCallerReturnGetDefBlockMixin = {
- hasReturn_: true,
- defType_: 'procedures_defreturn',
-};
-Blockly.Extensions.registerMixin(
- 'procedure_callerreturn_get_def_block_mixin',
- procedureCallerReturnGetDefBlockMixin,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_base.ts b/plugins/block-shareable-procedures/src/events_procedure_base.ts
deleted file mode 100644
index 11a7978f5..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_base.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * The base event for an event associated with a procedure.
- */
-export abstract class ProcedureBase extends Blockly.Events.Abstract {
- static readonly TYPE: string = 'procedure_base';
-
- /** A string used to check the type of the event. */
- type = ProcedureBase.TYPE;
-
- isBlank = false;
-
- /**
- * Constructs the base procedure event.
- *
- * @param workspace The workspace the procedure model exists in.
- * @param procedure The procedure model associated with this event.
- */
- constructor(
- workspace: Blockly.Workspace,
- readonly procedure: Blockly.procedures.IProcedureModel,
- ) {
- super();
- this.workspaceId = workspace.id;
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureBaseJson {
- const json = super.toJson() as ProcedureBaseJson;
- json['procedureId'] = this.procedure.getId();
- return json;
- }
-}
-
-export interface ProcedureBaseJson extends Blockly.Events.AbstractEventJson {
- procedureId: string;
-}
diff --git a/plugins/block-shareable-procedures/src/events_procedure_change_return.ts b/plugins/block-shareable-procedures/src/events_procedure_change_return.ts
deleted file mode 100644
index 956f748ce..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_change_return.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-
-/**
- * Notifies listeners that a procedure's return type/status has changed.
- */
-export class ProcedureChangeReturn extends ProcedureBase {
- static readonly TYPE = 'procedure_change';
-
- /** A string used to check the type of the event. */
- type = ProcedureChangeReturn.TYPE;
-
- /** The new type(s) the procedure's return has been set to. */
- private newTypes: string[] | null;
-
- /**
- * Constructs the procedure change event.
- *
- * @param workpace The workspace this change event is associated with.
- * @param procedure The model this change event is associated with.
- * @param oldTypes The type(s) the procedure's return was set to before it
- * changed.
- */
- constructor(
- workpace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- readonly oldTypes: string[] | null,
- ) {
- super(workpace, procedure);
-
- this.newTypes = procedure.getReturnTypes();
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const procedureModel = this.getEventWorkspace_()
- .getProcedureMap()
- .get(this.procedure.getId());
- if (!procedureModel) {
- throw new Error(
- 'Cannot change the type of a procedure that does not exist ' +
- 'in the procedure map',
- );
- }
- if (forward) {
- procedureModel.setReturnTypes(this.newTypes);
- } else {
- procedureModel.setReturnTypes(this.oldTypes);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureChangeReturnJson {
- const json = super.toJson() as ProcedureChangeReturnJson;
- json['oldTypes'] = this.oldTypes;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure change event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure change return event.
- * @internal
- */
- static fromJson(
- json: ProcedureChangeReturnJson,
- workspace: Blockly.Workspace,
- ): ProcedureChangeReturn {
- const model = workspace.getProcedureMap().get(json['procedureId']);
- if (!model) {
- throw new Error(
- 'Cannot deserialize procedure change return event because the ' +
- 'target procedure does not exist',
- );
- }
- return new ProcedureChangeReturn(workspace, model, json['oldTypes']);
- }
-}
-
-export interface ProcedureChangeReturnJson extends ProcedureBaseJson {
- oldTypes: string[] | null;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureChangeReturn.TYPE,
- ProcedureChangeReturn,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_create.ts b/plugins/block-shareable-procedures/src/events_procedure_create.ts
deleted file mode 100644
index f4ede8dd9..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_create.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-import {ObservableParameterModel} from './observable_parameter_model';
-import {ObservableProcedureModel} from './observable_procedure_model';
-
-/**
- * Notifies listeners that a procedure data model has been created.
- */
-export class ProcedureCreate extends ProcedureBase {
- static readonly TYPE = 'procedure_create';
-
- /** A string used to check the type of the event. */
- type = ProcedureCreate.TYPE;
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const workspace = this.getEventWorkspace_();
- const procedureMap = workspace.getProcedureMap();
- if (forward) {
- if (procedureMap.get(this.procedure.getId())) return;
- procedureMap.add(this.procedure);
- } else {
- if (!procedureMap.get(this.procedure.getId())) return;
- procedureMap.delete(this.procedure.getId());
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureCreateJson {
- const json = super.toJson() as ProcedureCreateJson;
- json['procedure'] = Blockly.serialization.procedures.saveProcedure(
- this.procedure,
- );
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure create event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure create event.
- * @internal
- */
- static fromJson(
- json: ProcedureCreateJson,
- workspace: Blockly.Workspace,
- ): ProcedureCreate {
- return new ProcedureCreate(
- workspace,
- Blockly.serialization.procedures.loadProcedure(
- ObservableProcedureModel,
- ObservableParameterModel,
- json['procedure'],
- workspace,
- ),
- );
- }
-}
-
-export interface ProcedureCreateJson extends ProcedureBaseJson {
- procedure: Blockly.serialization.procedures.State;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureCreate.TYPE,
- ProcedureCreate,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_delete.ts b/plugins/block-shareable-procedures/src/events_procedure_delete.ts
deleted file mode 100644
index 02b8a9f97..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_delete.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-
-/**
- * Notifies listeners that a procedure data model has been deleted.
- */
-export class ProcedureDelete extends ProcedureBase {
- static readonly TYPE = 'procedure_delete';
-
- /** A string used to check the type of the event. */
- type = ProcedureDelete.TYPE;
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const workspace = this.getEventWorkspace_();
- const procedureMap = workspace.getProcedureMap();
- if (forward) {
- if (!procedureMap.get(this.procedure.getId())) return;
- procedureMap.delete(this.procedure.getId());
- } else {
- if (procedureMap.get(this.procedure.getId())) return;
- procedureMap.add(this.procedure);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureDeleteJson {
- return super.toJson() as ProcedureDeleteJson;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure delete event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure delete event.
- * @internal
- */
- static fromJson(
- json: ProcedureDeleteJson,
- workspace: Blockly.Workspace,
- ): ProcedureDelete {
- const model = workspace.getProcedureMap().get(json['procedureId']);
- if (!model) {
- throw new Error(
- 'Cannot deserialize procedure delete event because the ' +
- 'target procedure does not exist',
- );
- }
- return new ProcedureDelete(workspace, model);
- }
-}
-
-export type ProcedureDeleteJson = ProcedureBaseJson;
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureDelete.TYPE,
- ProcedureDelete,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_enable.ts b/plugins/block-shareable-procedures/src/events_procedure_enable.ts
deleted file mode 100644
index 0122b9f31..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_enable.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-
-/**
- * Notifies listeners that the procedure data model has been enabled or
- * disabled.
- */
-export class ProcedureEnable extends ProcedureBase {
- static readonly TYPE = 'procedure_enable';
-
- /** A string used to check the type of the event. */
- type = ProcedureEnable.TYPE;
-
- private oldState: boolean;
- private newState: boolean;
-
- /**
- * Constructs the procedure enable event.
- *
- * @param workspace The workspace this event is associated with.
- * @param procedure The model this event is associated with.
- * @param newState The (optional) new enabled state of the procedure model.
- * If not provided, the procedure model will be inspected to determine
- * its current state.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- newState?: boolean,
- ) {
- super(workspace, procedure);
-
- if (newState === undefined) {
- this.oldState = !procedure.getEnabled();
- this.newState = procedure.getEnabled();
- } else {
- this.oldState = !newState;
- this.newState = newState;
- }
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const procedureModel = this.getEventWorkspace_()
- .getProcedureMap()
- .get(this.procedure.getId());
- if (!procedureModel) {
- throw new Error(
- 'Cannot change the enabled state of a procedure that does not ' +
- 'exist in the procedure map',
- );
- }
- if (forward) {
- procedureModel.setEnabled(this.newState);
- } else {
- procedureModel.setEnabled(this.oldState);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureEnableJson {
- const json = super.toJson() as ProcedureEnableJson;
- json['newState'] = this.newState;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure enable event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure enable event.
- * @internal
- */
- static fromJson(
- json: ProcedureEnableJson,
- workspace: Blockly.Workspace,
- ): ProcedureEnable {
- const model = workspace.getProcedureMap().get(json['procedureId']);
- if (!model) {
- throw new Error(
- 'Cannot deserialize procedure enable event because the ' +
- 'target procedure does not exist',
- );
- }
- return new ProcedureEnable(workspace, model, json['newState']);
- }
-}
-
-export interface ProcedureEnableJson extends ProcedureBaseJson {
- newState: boolean;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureEnable.TYPE,
- ProcedureEnable,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_parameter_base.ts b/plugins/block-shareable-procedures/src/events_procedure_parameter_base.ts
deleted file mode 100644
index 3884126a2..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_parameter_base.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-
-/**
- * The base event for an event associated with a procedure parameter.
- */
-export abstract class ProcedureParameterBase extends ProcedureBase {
- static readonly TYPE: string = 'procedure_parameter_base';
-
- /** A string used to check the type of the event. */
- type = ProcedureParameterBase.TYPE;
-
- /**
- * Constructs the procedure parameter base event.
- *
- * @param workspace The workspace the parameter model exists in.
- * @param procedure The procedure model the parameter model belongs to.
- * @param parameter The parameter model associated with this event.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- readonly parameter: Blockly.procedures.IParameterModel,
- ) {
- super(workspace, procedure);
- this.recordUndo = false;
- }
-
- /**
- * Finds the parameter with the given ID in the procedure model with the given
- * ID, if both things exist.
- *
- * @param workspace The workspace to search for the parameter.
- * @param procedureId The ID of the procedure model to search for
- * the parameter.
- * @param paramId The ID of the parameter to search for.
- * @returns The parameter model that was found.
- * @internal
- */
- static findMatchingParameter(
- workspace: Blockly.Workspace,
- procedureId: string,
- paramId: string,
- ): ProcedureParameterPair {
- const procedure = workspace.getProcedureMap().get(procedureId);
- if (!procedure) return {procedure: undefined, parameter: undefined};
- const parameter = procedure
- .getParameters()
- .find((p) => p.getId() === paramId);
- if (!parameter) return {procedure, parameter: undefined};
- return {procedure, parameter};
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureParameterBaseJson {
- const json = super.toJson() as ProcedureParameterBaseJson;
- json['parameterId'] = this.parameter.getId();
- return json;
- }
-}
-
-export interface ProcedureParameterPair {
- procedure?: Blockly.procedures.IProcedureModel;
- parameter?: Blockly.procedures.IParameterModel;
-}
-
-export interface ProcedureParameterBaseJson extends ProcedureBaseJson {
- parameterId: string;
-}
diff --git a/plugins/block-shareable-procedures/src/events_procedure_parameter_create.ts b/plugins/block-shareable-procedures/src/events_procedure_parameter_create.ts
deleted file mode 100644
index 9b7617045..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_parameter_create.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {
- ProcedureParameterBase,
- ProcedureParameterBaseJson,
-} from './events_procedure_parameter_base';
-import {ObservableParameterModel} from './observable_parameter_model';
-
-/**
- * Notifies listeners that a parameter has been added to a procedure model.
- */
-export class ProcedureParameterCreate extends ProcedureParameterBase {
- static readonly TYPE = 'procedure_parameter_create';
-
- /** A string used to check the type of the event. */
- type = ProcedureParameterCreate.TYPE;
-
- parameter: ObservableParameterModel;
-
- /**
- * Constructs the procedure parameter create event.js.
- *
- * @param workspace The workspace this event is associated with.
- * @param procedure The procedure model this event is associated with.
- * @param parameter The parameter model that was just added to the procedure.
- * @param index The index the parameter was inserted at.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- parameter: ObservableParameterModel,
- readonly index: number,
- ) {
- super(workspace, procedure, parameter);
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const workspace = this.getEventWorkspace_();
- const procedureMap = workspace.getProcedureMap();
- const procedureModel = procedureMap.get(this.procedure.getId());
- if (!procedureModel) {
- throw new Error(
- 'Cannot add a parameter to a procedure that does not exist ' +
- 'in the procedure map',
- );
- }
- if (forward) {
- procedureModel.insertParameter(this.parameter, this.index);
- } else {
- procedureModel.deleteParameter(this.index);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureParameterCreateJson {
- const json = super.toJson() as ProcedureParameterCreateJson;
- json['name'] = this.parameter.getName();
- json['id'] = this.parameter.getId();
- json['varId'] = this.parameter.getVariableModel().getId();
- json['index'] = this.index;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure parameter create event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure parameter create event.
- * @internal
- */
- static fromJson(
- json: ProcedureParameterCreateJson,
- workspace: Blockly.Workspace,
- ): ProcedureParameterCreate {
- const procedure = workspace.getProcedureMap().get(json['procedureId']);
- if (!procedure) {
- throw new Error(
- 'Cannot deserialize parameter create event because the ' +
- 'target procedure does not exist',
- );
- }
- return new ProcedureParameterCreate(
- workspace,
- procedure,
- new ObservableParameterModel(
- workspace,
- json['name'],
- json['id'],
- json['varId'],
- ),
- json['index'],
- );
- }
-}
-
-export interface ProcedureParameterCreateJson extends ProcedureParameterBaseJson {
- parameter: Blockly.serialization.procedures.ParameterState;
- index: number;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureParameterCreate.TYPE,
- ProcedureParameterCreate,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_parameter_delete.ts b/plugins/block-shareable-procedures/src/events_procedure_parameter_delete.ts
deleted file mode 100644
index ef467931b..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_parameter_delete.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {
- ProcedureParameterBase,
- ProcedureParameterBaseJson,
-} from './events_procedure_parameter_base';
-
-/**
- * Notifies listeners that a parameter has been removed from a procedure.
- */
-export class ProcedureParameterDelete extends ProcedureParameterBase {
- static readonly TYPE = 'procedure_parameter_delete';
-
- /** A string used to check the type of the event. */
- type = ProcedureParameterDelete.TYPE;
-
- /**
- * Constructs the procedure parameter delete event.
- *
- * @param workspace The workspace this event is associated with.
- * @param procedure The procedure model this event is associated with.
- * @param parameter The parameter model that was just removed from the
- * procedure.
- * @param index The index the parameter was at before it was removed.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- parameter: Blockly.procedures.IParameterModel,
- readonly index: number,
- ) {
- super(workspace, procedure, parameter);
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const workspace = this.getEventWorkspace_();
- const procedureMap = workspace.getProcedureMap();
- const procedureModel = procedureMap.get(this.procedure.getId());
- if (!procedureModel) {
- throw new Error(
- 'Cannot add a parameter to a procedure that does not exist ' +
- 'in the procedure map',
- );
- }
- if (forward) {
- procedureModel.deleteParameter(this.index);
- } else {
- procedureModel.insertParameter(this.parameter, this.index);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureParameterDeleteJson {
- const json = super.toJson() as ProcedureParameterDeleteJson;
- json['index'] = this.index;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure parameter delete event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure parameter delete event.
- * @internal
- */
- static fromJson(
- json: ProcedureParameterDeleteJson,
- workspace: Blockly.Workspace,
- ): ProcedureParameterDelete {
- const {procedure, parameter} = ProcedureParameterBase.findMatchingParameter(
- workspace,
- json['procedureId'],
- json['parameterId'],
- );
- if (!parameter) {
- throw new Error('Cannot delete a non existant parameter');
- }
- return new ProcedureParameterDelete(
- workspace,
- procedure,
- parameter,
- json['index'],
- );
- }
-}
-
-export interface ProcedureParameterDeleteJson extends ProcedureParameterBaseJson {
- index: number;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureParameterDelete.TYPE,
- ProcedureParameterDelete,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_parameter_rename.ts b/plugins/block-shareable-procedures/src/events_procedure_parameter_rename.ts
deleted file mode 100644
index e2991c9cb..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_parameter_rename.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {
- ProcedureParameterBase,
- ProcedureParameterBaseJson,
-} from './events_procedure_parameter_base';
-import {ObservableParameterModel} from './observable_parameter_model';
-
-/**
- * Notifies listeners that a procedure parameter was renamed.
- */
-export class ProcedureParameterRename extends ProcedureParameterBase {
- static readonly TYPE = 'procedure_parameter_rename';
-
- /** A string used to check the type of the event. */
- type = ProcedureParameterRename.TYPE;
-
- /** The new name of the procedure parameter. */
- private readonly newName: string;
-
- /** The new ID the backing variable for the parameter. */
- private readonly newVarId: string;
-
- /**
- * Constructs the procedure parameter rename event.
- *
- * @param workspace The workpace this event is associated with.
- * @param procedure The procedure model this event is associated with.
- * @param parameter The parameter model this event is associated with.
- * @param oldName The old name of the procedure parameter.
- * @param newName The (optional) new name of the procedure parameter. If not
- * provided, the parameter model will be inspected to see what its current
- * name is.
- * @param newVarId The (optional) new id of the procedure parameter's backing
- * variable. If not provided, the parameter model will be inspected to
- * see what its current name is.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- parameter: ObservableParameterModel,
- readonly oldName: string,
- newName?: string,
- newVarId?: string,
- ) {
- super(workspace, procedure, parameter);
-
- this.newName = newName ?? parameter.getName();
- this.newVarId = newVarId ?? parameter.getVariableModel().getId();
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const {parameter} = ProcedureParameterBase.findMatchingParameter(
- this.getEventWorkspace_(),
- this.procedure.getId(),
- this.parameter.getId(),
- );
- if (forward) {
- if (parameter.getName() !== this.oldName) return;
- (parameter as ObservableParameterModel).setName(
- this.newName,
- this.newVarId,
- );
- } else {
- if (parameter.getName() !== this.newName) return;
- parameter.setName(this.oldName);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureParameterRenameJson {
- const json = super.toJson() as ProcedureParameterRenameJson;
- json['newName'] = this.newName;
- json['newVarId'] = this.newVarId;
- json['oldName'] = this.oldName;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure parameter rename event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure parameter rename event.
- * @internal
- */
- static fromJson(
- json: ProcedureParameterRenameJson,
- workspace: Blockly.Workspace,
- ): ProcedureParameterRename {
- const {procedure, parameter} = ProcedureParameterBase.findMatchingParameter(
- workspace,
- json['procedureId'],
- json['parameterId'],
- );
- if (!parameter) {
- throw new Error('Cannot delete a non existant parameter');
- }
- return new ProcedureParameterRename(
- workspace,
- procedure,
- parameter as ObservableParameterModel,
- json['oldName'],
- json['newName'],
- json['newVarId'],
- );
- }
-}
-
-export interface ProcedureParameterRenameJson extends ProcedureParameterBaseJson {
- oldName: string;
- newName: string;
- newVarId: string;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureParameterRename.TYPE,
- ProcedureParameterRename,
-);
diff --git a/plugins/block-shareable-procedures/src/events_procedure_rename.ts b/plugins/block-shareable-procedures/src/events_procedure_rename.ts
deleted file mode 100644
index 23f0d04ae..000000000
--- a/plugins/block-shareable-procedures/src/events_procedure_rename.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-
-/** Notifies listeners that a procedure model has been renamed. */
-export class ProcedureRename extends ProcedureBase {
- static readonly TYPE = 'procedure_rename';
-
- /** A string used to check the type of the event. */
- type = ProcedureRename.TYPE;
-
- private newName: string;
-
- /**
- * Constructs the procedure rename event.
- *
- * @param workspace The workspace this event is associated with.
- * @param procedure The model this event is associated with.
- * @param oldName The old name of the procedure model.
- * @param newName The (optional) new name of the procedure. If not provided,
- * the procedure model will be inspected to see what its current
- * name is.
- */
- constructor(
- workspace: Blockly.Workspace,
- procedure: Blockly.procedures.IProcedureModel,
- readonly oldName: string,
- newName?: string,
- ) {
- super(workspace, procedure);
-
- this.newName = newName ?? procedure.getName();
- }
-
- /**
- * Replays the event in the workspace.
- *
- * @param forward if true, play the event forward (redo), otherwise play it
- * backward (undo).
- */
- run(forward: boolean) {
- const procedureModel = this.getEventWorkspace_()
- .getProcedureMap()
- .get(this.procedure.getId());
- if (!procedureModel) {
- throw new Error(
- 'Cannot change the type of a procedure that does not exist ' +
- 'in the procedure map',
- );
- }
- if (forward) {
- if (procedureModel.getName() !== this.oldName) return;
- procedureModel.setName(this.newName);
- } else {
- if (procedureModel.getName() !== this.newName) return;
- procedureModel.setName(this.oldName);
- }
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): ProcedureRenameJson {
- const json = super.toJson() as ProcedureRenameJson;
- json['newName'] = this.newName;
- json['oldName'] = this.oldName;
- return json;
- }
-
- /**
- * Deserializes the JSON event.
- *
- * @param json The JSON representation of a procedure rename event.
- * @param workspace The workspace to deserialize the event into.
- * @returns The new procedure rename event.
- * @internal
- */
- static fromJson(
- json: ProcedureRenameJson,
- workspace: Blockly.Workspace,
- ): ProcedureRename {
- const model = workspace.getProcedureMap().get(json['procedureId']);
- if (!model) {
- throw new Error(
- 'Cannot deserialize procedure rename event because the ' +
- 'target procedure does not exist',
- );
- }
- return new ProcedureRename(
- workspace,
- model,
- json['oldName'],
- json['newName'],
- );
- }
-}
-
-export interface ProcedureRenameJson extends ProcedureBaseJson {
- oldName: string;
- newName: string;
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- ProcedureRename.TYPE,
- ProcedureRename,
-);
diff --git a/plugins/block-shareable-procedures/src/i_procedure_block.ts b/plugins/block-shareable-procedures/src/i_procedure_block.ts
deleted file mode 100644
index 166f9de9a..000000000
--- a/plugins/block-shareable-procedures/src/i_procedure_block.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-/* eslint-disable @typescript-eslint/naming-convention */
-
-/** The interface for a block which models a procedure. */
-export interface IProcedureBlock {
- getProcedureModel(): Blockly.procedures.IProcedureModel;
- doProcedureUpdate(): void;
- isProcedureDef(): boolean;
-}
-
-/**
- * A type guard which checks if the given block is a procedure block.
- *
- * @param block The block to check for procedure-y-ness.
- * @returns Whether this block is a procedure block or not.
- */
-export function isProcedureBlock(
- block: Blockly.Block | IProcedureBlock,
-): block is IProcedureBlock {
- return (
- (block as IProcedureBlock).getProcedureModel !== undefined &&
- (block as IProcedureBlock).doProcedureUpdate !== undefined &&
- (block as IProcedureBlock).isProcedureDef !== undefined
- );
-}
diff --git a/plugins/block-shareable-procedures/src/index.ts b/plugins/block-shareable-procedures/src/index.ts
deleted file mode 100644
index 27acbd794..000000000
--- a/plugins/block-shareable-procedures/src/index.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ObservableParameterModel} from './observable_parameter_model';
-import {ObservableProcedureModel} from './observable_procedure_model';
-
-export {blocks} from './blocks';
-export {IProcedureBlock, isProcedureBlock} from './i_procedure_block';
-export {ProcedureBase, ProcedureBaseJson} from './events_procedure_base';
-export {
- ProcedureChangeReturn,
- ProcedureChangeReturnJson,
-} from './events_procedure_change_return';
-export {ProcedureCreate, ProcedureCreateJson} from './events_procedure_create';
-export {ProcedureDelete, ProcedureDeleteJson} from './events_procedure_delete';
-export {
- ProcedureParameterBase,
- ProcedureParameterBaseJson,
-} from './events_procedure_parameter_base';
-export {
- ProcedureParameterCreate,
- ProcedureParameterCreateJson,
-} from './events_procedure_parameter_create';
-export {
- ProcedureParameterDelete,
- ProcedureParameterDeleteJson,
-} from './events_procedure_parameter_delete';
-export {
- ProcedureParameterRename,
- ProcedureParameterRenameJson,
-} from './events_procedure_parameter_rename';
-export {ProcedureRename, ProcedureRenameJson} from './events_procedure_rename';
-export {triggerProceduresUpdate} from './update_procedures';
-
-export {ObservableParameterModel, ObservableProcedureModel};
-
-/**
- * Unregisters all of the procedure blocks.
- *
- * Usually used to unregister the built-in blocks, before register the
- * blocks provided by this plugin.
- */
-export function unregisterProcedureBlocks() {
- delete Blockly.Blocks['procedures_defnoreturn'];
- delete Blockly.Blocks['procedures_callnoreturn'];
- delete Blockly.Blocks['procedures_defreturn'];
- delete Blockly.Blocks['procedures_callreturn'];
-}
-
-/**
- * Unregisters any existing procedure serializer, and registers a new one
- * parameterized with the shareable procedure backing data models.
- */
-export function registerProcedureSerializer() {
- Blockly.serialization.registry.unregister('procedures');
- Blockly.serialization.registry.register(
- 'procedures',
- new Blockly.serialization.procedures.ProcedureSerializer(
- ObservableProcedureModel,
- ObservableParameterModel,
- ),
- );
-}
diff --git a/plugins/block-shareable-procedures/src/observable_parameter_model.ts b/plugins/block-shareable-procedures/src/observable_parameter_model.ts
deleted file mode 100644
index d6f51f6d2..000000000
--- a/plugins/block-shareable-procedures/src/observable_parameter_model.ts
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ProcedureParameterRename} from './events_procedure_parameter_rename';
-import {triggerProceduresUpdate} from './update_procedures';
-
-/** Represents a procedure parameter. */
-export class ObservableParameterModel
- implements Blockly.procedures.IParameterModel
-{
- private id: string;
- private variable: Blockly.IVariableModel;
- private shouldFireEvents = false;
- private procedureModel: Blockly.procedures.IProcedureModel | null = null;
-
- /**
- * Constructor for the procedure parameter.
- *
- * @param workspace The workspace this parameter model exists in.
- * @param name The name of this parameter.
- * @param id The optional unique language-neutral ID of the parameter.
- * @param varId The optional ID of the variable this parameter should be
- * associated with.
- */
- constructor(
- private readonly workspace: Blockly.Workspace,
- name: string,
- id?: string,
- varId?: string,
- ) {
- this.id = id ?? Blockly.utils.idGenerator.genUid();
- this.variable = this.createBackingVariable(name, varId);
- }
-
- /**
- * Sets the name of this parameter to the given name.
- *
- * @param name The string to set the name to.
- * @param id The optional ID the backing variable should have.
- * @returns This parameter model.
- */
- setName(name: string, id?: string): this {
- if (name === this.variable.getName()) return this;
- const oldName = this.variable.getName();
- this.variable =
- this.workspace.getVariableMap().getVariable(name) ??
- this.workspace.getVariableMap().createVariable(name, '', id);
- triggerProceduresUpdate(this.workspace);
- if (this.shouldFireEvents) {
- Blockly.Events.fire(
- new ProcedureParameterRename(
- this.workspace,
- this.procedureModel,
- this,
- oldName,
- ),
- );
- }
- return this;
- }
-
- /**
- * Creates a backing variable in a way that is subclassable.
- *
- * @param name The string to set set the variable to.
- * @param varId The optional ID the backing variable should have.
- * @returns The created variable model.
- */
- protected createBackingVariable(
- name: string,
- varId?: string,
- ): Blockly.IVariableModel {
- this.variable = Blockly.Variables.getOrCreateVariablePackage(
- this.workspace,
- varId || null,
- name,
- '',
- );
- return this.variable;
- }
-
- /**
- * Unimplemented. The built-in ParameterModel does not support typing.
- * If you want your procedure blocks to have typed parameters, you need to
- * implement your own ParameterModel.
- *
- * @param types The types to set this parameter to.
- * @throws {!Error} Throws for the ObservableParameterModel specifically
- * because this method is unimplemented.
- */
- setTypes(types: string[]): this {
- throw new Error(
- 'The built-in ParameterModel does not support typing. You need to ' +
- 'implement your own custom ParameterModel.',
- );
- }
-
- /**
- * @returns the name of this parameter.
- */
- getName(): string {
- return this.variable.getName();
- }
-
- /**
- * @returns the types of this parameter.
- */
- getTypes(): string[] {
- return [];
- }
-
- /**
- * Returns the unique language-neutral ID for the parameter. This represents
- * the identity of the variable model which does not change over time.
- *
- * @returns The unique language-neutral ID for the parameter.
- */
- getId(): string {
- return this.id;
- }
-
- /**
- * @returns the variable model associated with the parameter model.
- */
- getVariableModel(): Blockly.IVariableModel {
- return this.variable;
- }
-
- /**
- * Tells the parameter model it should fire events.
- *
- * @internal
- */
- startPublishing() {
- this.shouldFireEvents = true;
- }
-
- /**
- * Tells the parameter model it should not fire events.
- *
- * @internal
- */
- stopPublishing() {
- this.shouldFireEvents = false;
- }
-
- /**
- * Sets the procedure model this parameter is a part of.
- *
- * @param model The procedure model this parameter is a part of.
- * @returns This parameter model.
- */
- setProcedureModel(model: Blockly.procedures.IProcedureModel): this {
- this.procedureModel = model;
- return this;
- }
-
- /**
- * Serializes the state of this parameter to JSON.
- *
- * @returns JSON serializable state of the parameter.
- */
- saveState(): Blockly.serialization.procedures.ParameterState {
- const state: Blockly.serialization.procedures.ParameterState = {
- id: this.getId(),
- name: this.getName(),
- };
- if (!this.getTypes().length) return state;
- state.types = this.getTypes();
- return state;
- }
-
- /**
- * Returns a new parameter model with the given state.
- *
- * @param state The state of the parameter to load.
- * @param workspace The workspace to load the parameter into.
- * @returns The loaded parameter model.
- */
- static loadState(
- state: Blockly.serialization.procedures.ParameterState,
- workspace: Blockly.Workspace,
- ): ObservableParameterModel {
- const model = new ObservableParameterModel(workspace, state.name, state.id);
- if (state.types) model.setTypes(state.types);
- return model;
- }
-}
diff --git a/plugins/block-shareable-procedures/src/observable_procedure_model.ts b/plugins/block-shareable-procedures/src/observable_procedure_model.ts
deleted file mode 100644
index e90d7ccf4..000000000
--- a/plugins/block-shareable-procedures/src/observable_procedure_model.ts
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ObservableParameterModel} from './observable_parameter_model';
-import {ProcedureChangeReturn} from './events_procedure_change_return';
-import {ProcedureCreate} from './events_procedure_create';
-import {ProcedureDelete} from './events_procedure_delete';
-import {ProcedureEnable} from './events_procedure_enable';
-import {ProcedureParameterCreate} from './events_procedure_parameter_create';
-import {ProcedureParameterDelete} from './events_procedure_parameter_delete';
-import {ProcedureRename} from './events_procedure_rename';
-import {triggerProceduresUpdate} from './update_procedures';
-
-/** Represents a procedure signature. */
-export class ObservableProcedureModel
- implements Blockly.procedures.IProcedureModel
-{
- private id: string;
- private name: string;
- private parameters: ObservableParameterModel[] = [];
- private returnTypes: string[] | null = null;
- private enabled = true;
- private shouldFireEvents = false;
- private shouldTriggerUpdates = true;
-
- /**
- * Constructor for the procedure model.
- *
- * @param workspace The workspace the procedure model is associated with.
- * @param name The name of the new procedure.
- * @param id The (optional) unique language-neutral ID for the procedure.
- */
- constructor(
- private readonly workspace: Blockly.Workspace,
- name: string,
- id?: string,
- ) {
- this.id = id ?? Blockly.utils.idGenerator.genUid();
- this.name = name;
- }
-
- /**
- * Sets the human-readable name of the procedure.
- *
- * @param name The human-readable name of the procedure.
- * @returns This procedure model.
- */
- setName(name: string): this {
- if (name === this.name) return this;
- const oldName = this.name;
- this.name = name;
- if (this.shouldTriggerUpdates) triggerProceduresUpdate(this.workspace);
- if (this.shouldFireEvents) {
- Blockly.Events.fire(new ProcedureRename(this.workspace, this, oldName));
- }
- return this;
- }
-
- /**
- * Inserts a parameter into the list of parameters.
- * To move a parameter, first delete it, and then re-insert.
- *
- * @param parameterModel The parameter model to insert.
- * @param index The index to insert it at.
- * @returns This procedure model.
- */
- insertParameter(
- parameterModel: ObservableParameterModel,
- index: number,
- ): this {
- if (
- this.parameters[index] &&
- this.parameters[index].getId() === parameterModel.getId()
- ) {
- return this;
- }
-
- this.parameters.splice(index, 0, parameterModel);
- parameterModel.setProcedureModel(this);
- if (Blockly.isObservable(parameterModel)) {
- if (this.shouldFireEvents) {
- parameterModel.startPublishing();
- } else {
- parameterModel.stopPublishing();
- }
- }
-
- if (this.shouldTriggerUpdates) triggerProceduresUpdate(this.workspace);
- if (this.shouldFireEvents) {
- Blockly.Events.fire(
- new ProcedureParameterCreate(
- this.workspace,
- this,
- parameterModel,
- index,
- ),
- );
- }
- return this;
- }
-
- /**
- * Removes the parameter at the given index from the parameter list.
- *
- * @param index The index of the parameter to remove.
- * @returns This procedure model.
- */
- deleteParameter(index: number): this {
- if (!this.parameters[index]) return this;
- const oldParam = this.parameters[index];
-
- this.parameters.splice(index, 1);
- if (this.shouldTriggerUpdates) triggerProceduresUpdate(this.workspace);
- if (Blockly.isObservable(oldParam)) {
- oldParam.stopPublishing();
- }
-
- if (this.shouldFireEvents) {
- Blockly.Events.fire(
- new ProcedureParameterDelete(this.workspace, this, oldParam, index),
- );
- }
- return this;
- }
-
- /**
- * Sets whether the procedure has a return value (empty array) or no return
- * value (null).
- * This procedure model does not support procedures that have actual
- * return types (i.e. non-empty arrays, e.g. ['number']).
- *
- * @param types Used to set whether this procedure has a return value
- * (empty array) or no return value (null).
- * @returns This procedure model.
- */
- setReturnTypes(types: string[] | null): this {
- if (types && types.length) {
- throw new Error(
- 'The built-in ProcedureModel does not support typing. You need to ' +
- 'implement your own custom ProcedureModel.',
- );
- }
- // Either they're both an empty array, or both null. Noop either way.
- if (!!types === !!this.returnTypes) return this;
- const oldReturnTypes = this.returnTypes;
- this.returnTypes = types;
- if (this.shouldTriggerUpdates) triggerProceduresUpdate(this.workspace);
- if (this.shouldFireEvents) {
- Blockly.Events.fire(
- new ProcedureChangeReturn(this.workspace, this, oldReturnTypes),
- );
- }
- return this;
- }
-
- /**
- * Sets whether this procedure is enabled/disabled. If a procedure is disabled
- * all procedure caller blocks should be disabled as well.
- *
- * @param enabled Whether this procedure is enabled/disabled.
- * @returns This procedure model.
- */
- setEnabled(enabled: boolean): this {
- if (enabled === this.enabled) return this;
- this.enabled = enabled;
- if (this.shouldTriggerUpdates) triggerProceduresUpdate(this.workspace);
- if (this.shouldFireEvents) {
- Blockly.Events.fire(new ProcedureEnable(this.workspace, this));
- }
- return this;
- }
-
- /**
- * Disables triggering updates to procedure blocks until the endBulkUpdate
- * is called.
- *
- * @internal
- */
- startBulkUpdate() {
- this.shouldTriggerUpdates = false;
- }
-
- /**
- * Triggers an update to procedure blocks. Should be used with
- * startBulkUpdate.
- *
- * @internal
- */
- endBulkUpdate() {
- this.shouldTriggerUpdates = true;
- triggerProceduresUpdate(this.workspace);
- }
-
- /**
- * @returns The unique language-neutral ID for the procedure.
- */
- getId(): string {
- return this.id;
- }
-
- /**
- * @returns The human-readable name of the procedure
- */
- getName(): string {
- return this.name;
- }
-
- /**
- * @param index The index of the parameter to return.
- * @returns the parameter at the given index in the parameter list.
- */
- getParameter(index: number): Blockly.procedures.IParameterModel {
- return this.parameters[index];
- }
-
- /**
- * @returns an array of all of the parameters in the parameter list.
- */
- getParameters(): Blockly.procedures.IParameterModel[] {
- return [...this.parameters];
- }
-
- /**
- * Returns the return type of the procedure.
- * Null represents a procedure that does not return a value.
- *
- * @returns the return type of the procedure.
- */
- getReturnTypes(): string[] | null {
- return this.returnTypes;
- }
-
- /**
- * Returns whether the procedure is enabled/disabled. If a procedure is
- * disabled, all procedure caller blocks should be disabled as well.
- *
- * @returns Returns whether the procedure is enabled/disabled.
- */
- getEnabled(): boolean {
- return this.enabled;
- }
-
- /**
- * Tells the procedure model it should fire events.
- *
- * @internal
- */
- startPublishing() {
- this.shouldFireEvents = true;
- Blockly.Events.fire(new ProcedureCreate(this.workspace, this));
- for (const param of this.parameters) {
- if (Blockly.isObservable(param)) param.startPublishing();
- }
- }
-
- /**
- * Tells the procedure model it should not fire events.
- *
- * @internal
- */
- stopPublishing() {
- triggerProceduresUpdate(this.workspace);
- Blockly.Events.fire(new ProcedureDelete(this.workspace, this));
- this.shouldFireEvents = false;
- for (const param of this.parameters) {
- if (Blockly.isObservable(param)) param.stopPublishing();
- }
- }
-
- /**
- * Serializes the state of the procedure to JSON.
- *
- * @returns JSON serializable state of the procedure.
- */
- saveState(): Blockly.serialization.procedures.State {
- // Parameter state is serialized by core.
- return {
- id: this.getId(),
- name: this.getName(),
- returnTypes: this.getReturnTypes(),
- };
- }
-
- /**
- * Returns a new procedure model with the given state.
- *
- * @param state The state of the procedure to load.
- * @param workspace The workspace to load the procedure into.
- * @returns The loaded procedure model.
- */
- static loadState(
- state: Blockly.serialization.procedures.State,
- workspace: Blockly.Workspace,
- ): ObservableProcedureModel {
- return new ObservableProcedureModel(
- workspace,
- state.name,
- state.id,
- ).setReturnTypes(state.returnTypes);
- }
-}
diff --git a/plugins/block-shareable-procedures/src/update_procedures.ts b/plugins/block-shareable-procedures/src/update_procedures.ts
deleted file mode 100644
index ed8714629..000000000
--- a/plugins/block-shareable-procedures/src/update_procedures.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * Calls the `doProcedureUpdate` method on all blocks which implement it.
- *
- * @param workspace The workspace within which to trigger block updates.
- * @internal
- */
-export function triggerProceduresUpdate(workspace: Blockly.Workspace) {
- if (workspace.isClearing) return;
- for (const block of workspace.getAllBlocks(false)) {
- if (Blockly.procedures.isProcedureBlock(block)) {
- block.doProcedureUpdate();
- }
- }
-}
diff --git a/plugins/block-shareable-procedures/test/data_models.mocha.js b/plugins/block-shareable-procedures/test/data_models.mocha.js
deleted file mode 100644
index 745f72ff7..000000000
--- a/plugins/block-shareable-procedures/test/data_models.mocha.js
+++ /dev/null
@@ -1,547 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const eventTestHelpers = require('./event_test_helpers');
-const Blockly = require('blockly');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ObservableParameterModel} = require('../src/observable_parameter_model');
-const {ProcedureCreate} = require('../src/events_procedure_create');
-const {ProcedureDelete} = require('../src/events_procedure_delete');
-const {ProcedureRename} = require('../src/events_procedure_rename');
-const {
- ProcedureChangeReturn,
-} = require('../src/events_procedure_change_return');
-const {ProcedureEnable} = require('../src/events_procedure_enable');
-const {
- ProcedureParameterCreate,
-} = require('../src/events_procedure_parameter_create');
-const {
- ProcedureParameterDelete,
-} = require('../src/events_procedure_parameter_delete');
-const {
- ProcedureParameterRename,
-} = require('../src/events_procedure_parameter_rename');
-
-suite('Procedure data models', function () {
- setup(function () {
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- });
-
- teardown(function () {
- this.workspace.dispose();
- this.clock.runAll();
- this.sandbox.restore();
- });
-
- suite('triggering block updates', function () {
- setup(function () {
- Blockly.Blocks['procedure_mock'] = {
- init: function () {},
- doProcedureUpdate: function () {},
- getProcedureModel: function () {},
- isProcedureDef: function () {},
- };
-
- this.procedureBlock = this.workspace.newBlock('procedure_mock');
-
- this.updateSpy = this.sandbox.spy(
- this.procedureBlock,
- 'doProcedureUpdate',
- );
- });
-
- teardown(function () {
- delete Blockly.Blocks['procedure_mock'];
- });
-
- suite('procedure map updates', function () {
- test('inserting a procedure does not trigger an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.set(procedureModel.getId(), procedureModel);
-
- chai.assert.isFalse(
- this.updateSpy.called,
- 'Expected no update to be triggered',
- );
- });
-
- test('adding a procedure does not trigger an update', function () {
- this.procedureMap.add(
- new ObservableProcedureModel(this.workspace, 'test name'),
- );
-
- chai.assert.isFalse(
- this.updateSpy.called,
- 'Expected no update to be triggered',
- );
- });
-
- test('deleting a procedure triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.add(procedureModel);
-
- this.procedureMap.delete(procedureModel.getId());
-
- chai.assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
- });
-
- suite('procedure model updates', function () {
- test('setting the name triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.add(procedureModel);
-
- procedureModel.setName('new name');
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('setting the return type triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.add(procedureModel);
-
- procedureModel.setReturnTypes([]);
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('removing the return type triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- ).setReturnTypes([]);
- this.procedureMap.add(procedureModel);
- this.updateSpy.resetHistory();
-
- procedureModel.setReturnTypes(null);
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('disabling the procedure triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.add(procedureModel);
-
- procedureModel.setEnabled(false);
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('enabling the procedure triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- ).setEnabled(false);
- this.procedureMap.add(procedureModel);
- this.updateSpy.resetHistory();
-
- procedureModel.setEnabled(true);
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('inserting a parameter triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- );
- this.procedureMap.add(procedureModel);
-
- procedureModel.insertParameter(
- new ObservableParameterModel(this.workspace, ''),
- 0,
- );
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
-
- test('deleting a parameter triggers an update', function () {
- const procedureModel = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- ).insertParameter(new ObservableParameterModel(this.workspace, ''), 0);
- this.procedureMap.add(procedureModel);
- this.updateSpy.resetHistory();
-
- procedureModel.deleteParameter(0);
-
- assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
- });
-
- suite('parameter model updates', function () {
- test('setting the name triggers an update', function () {
- const parameterModel = new ObservableParameterModel(
- this.workspace,
- 'test1',
- );
- this.procedureMap.add(
- new ObservableProcedureModel(
- this.workspace,
- 'test name',
- ).insertParameter(parameterModel, 0),
- );
- this.updateSpy.resetHistory();
-
- parameterModel.setName('test2');
-
- chai.assert.isTrue(
- this.updateSpy.calledOnce,
- 'Expected an update to be triggered',
- );
- });
- });
- });
-
- suite('firing events', function () {
- setup(function () {
- this.eventSpy = this.sandbox.spy();
- this.spyData = this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.workspace.removeChangeListener(this.spyData);
- });
-
- suite('procedure model creation and destruction', function () {
- test('inserting a procedure model fires a create event', function () {
- const procedure = new ObservableProcedureModel(this.workspace, 'proc');
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureCreate,
- {procedure},
- this.workspace.id,
- );
- });
-
- test('removing a procedure model fires a delete event', function () {
- const procedure = new ObservableProcedureModel(this.workspace, 'proc');
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- this.procedureMap.delete(procedure.getId());
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureDelete,
- {procedure},
- this.workspace.id,
- );
- });
- });
-
- suite('procedure model changes', function () {
- test('setting the name fires a rename event', function () {
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- );
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- procedure.setName('new name');
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureRename,
- {
- procedure,
- oldName: 'old name',
- newName: 'new name',
- },
- this.workspace.id,
- );
- });
-
- test('setting the return type fires a change return event', function () {
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- ).setReturnTypes(null);
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- const newTypes = [];
- procedure.setReturnTypes(newTypes);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureChangeReturn,
- {
- procedure,
- oldTypes: null,
- newTypes,
- },
- this.workspace.id,
- );
- });
-
- test('removing the return type fires a change return event', function () {
- const oldTypes = [];
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- ).setReturnTypes(oldTypes);
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- procedure.setReturnTypes(null);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureChangeReturn,
- {
- procedure,
- oldTypes,
- newTypes: null,
- },
- this.workspace.id,
- );
- });
-
- test('disabling the procedure fires an enable event', function () {
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- ).setEnabled(true);
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- procedure.setEnabled(false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureEnable,
- {
- procedure,
- oldState: true,
- newState: false,
- },
- this.workspace.id,
- );
- });
-
- test('enabling the procedure fires an enable event', function () {
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- ).setEnabled(false);
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- procedure.setEnabled(true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureEnable,
- {
- procedure,
- oldState: false,
- newState: true,
- },
- this.workspace.id,
- );
- });
-
- test('inserting a parameter fires a parameter create event', function () {
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- );
- this.procedureMap.add(procedure);
- this.clock.runAll();
- const parameter = new ObservableParameterModel(this.workspace, 'param');
-
- this.eventSpy.resetHistory();
- procedure.insertParameter(parameter, 0);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterCreate,
- {
- procedure,
- parameter,
- index: 0,
- },
- this.workspace.id,
- );
- });
-
- test('deleting a parameter fires a parameter delete event', function () {
- const parameter = new ObservableParameterModel(this.workspace, 'param');
- const procedure = new ObservableProcedureModel(
- this.workspace,
- 'old name',
- ).insertParameter(parameter, 0);
- this.procedureMap.add(procedure);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- procedure.deleteParameter(0);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterDelete,
- {
- procedure,
- parameter,
- index: 0,
- },
- this.workspace.id,
- );
- });
- });
-
- suite('parameter model changes', function () {
- test('setting the name fires a procedure rename event', function () {
- const parameter = new ObservableParameterModel(
- this.workspace,
- 'old name',
- );
- this.procedureMap.add(
- new ObservableProcedureModel(this.workspace, 'proc').insertParameter(
- parameter,
- 0,
- ),
- );
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- parameter.setName('new name');
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterRename,
- {
- parameter,
- oldName: 'old name',
- newName: 'new name',
- },
- this.workspace.id,
- );
- });
- });
- });
-
- suite('backing variable to parameters', function () {
- test('construction references an existing variable if available', function () {
- const variable = this.workspace.getVariableMap().createVariable('test1');
- const param = new ObservableParameterModel(this.workspace, 'test1');
-
- chai.assert.equal(
- variable,
- param.getVariableModel(),
- 'Expected the parameter model to reference the existing variable',
- );
- });
-
- test('construction creates a variable if none exists', function () {
- const param = new ObservableParameterModel(this.workspace, 'test1');
-
- chai.assert.equal(
- this.workspace.getVariableMap().getVariable('test1'),
- param.getVariableModel(),
- 'Expected the parameter model to create a variable',
- );
- });
-
- test('setName references an existing variable if available', function () {
- const variable = this.workspace.getVariableMap().createVariable('test2');
- const param = new ObservableParameterModel(this.workspace, 'test1');
-
- param.setName('test2');
-
- chai.assert.equal(
- variable,
- param.getVariableModel(),
- 'Expected the parameter model to reference the existing variable',
- );
- });
-
- test('setName creates a variable if none exits', function () {
- const param = new ObservableParameterModel(this.workspace, 'test1');
-
- param.setName('test2');
-
- chai.assert.equal(
- this.workspace.getVariableMap().getVariable('test2'),
- param.getVariableModel(),
- 'Expected the parameter model to create a variable',
- );
- });
-
- test('setTypes is unimplemented', function () {
- const param = new ObservableParameterModel(this.workspace, 'test1');
-
- chai.assert.throws(() => {
- param.setTypes(['some', 'types']);
- }, 'The built-in ParameterModel does not support typing');
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_change_return.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_change_return.mocha.js
deleted file mode 100644
index 280286ff2..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_change_return.mocha.js
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {
- ProcedureChangeReturn,
-} = require('../src/events_procedure_change_return');
-
-suite('Procedure Change Return Event', function () {
- const DEFAULT_TYPES = null;
- const NON_DEFAULT_TYPES = [];
-
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (id) => {
- return new ObservableProcedureModel(this.workspace, 'test name', id);
- };
-
- this.createEventToState = (procedureModel) => {
- const event = new ProcedureChangeReturn(
- this.workspace,
- procedureModel,
- procedureModel.getReturnTypes() === DEFAULT_TYPES
- ? NON_DEFAULT_TYPES
- : DEFAULT_TYPES,
- );
- return event;
- };
- });
-
- suite('forward (redo)', function () {
- test('the procedure with the matching ID has its return set', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initial.getReturnTypes(),
- final.getReturnTypes(),
- "Expected the procedure's return type to be toggled",
- );
- });
-
- test('one changing the return fires a change return event', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureChangeReturn,
- {
- procedure: initial,
- oldTypes: DEFAULT_TYPES,
- },
- this.workspace.id,
- );
- });
-
- test('noop return changes do not fire change return events', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureChangeReturn,
- {},
- this.workspace.id,
- );
- });
-
- test(
- 'attempting to change the return of a procedure that ' +
- 'does not exist in the map throws',
- function () {
- const final = this.createProcedureModel('test id');
- const event = this.createEventToState(final);
-
- assert.throws(() => {
- event.run(/* forward= */ true);
- });
- },
- );
- });
-
- suite('backward (undo)', function () {
- test('the procedure with the matching ID has its return set', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setReturnTypes(NON_DEFAULT_TYPES);
- undoable.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- initial.getReturnTypes(),
- DEFAULT_TYPES,
- "Expected the procedure's return type to be toggled",
- );
- });
-
- test('changing the return fires a change return event', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setReturnTypes(NON_DEFAULT_TYPES);
- undoable.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureChangeReturn,
- {
- procedure: initial,
- oldTypes: NON_DEFAULT_TYPES,
- },
- this.workspace.id,
- );
- });
-
- test('noop return changes do not fire change return events', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- undoable.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureChangeReturn,
- {},
- this.workspace.id,
- );
- });
-
- test(
- 'attempting to change the return of a procedure that ' +
- 'does not exist throws',
- function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setReturnTypes(NON_DEFAULT_TYPES);
- undoable.setReturnTypes(NON_DEFAULT_TYPES);
- const event = this.createEventToState(undoable);
-
- assert.throws(() => {
- event.run(/* forward= */ false);
- });
- },
- );
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- this.procedureMap.add(model);
- const origEvent = new ProcedureChangeReturn(
- this.workspace,
- model,
- NON_DEFAULT_TYPES,
- );
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_create.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_create.mocha.js
deleted file mode 100644
index b18193636..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_create.mocha.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const {testHelpers} = require('@blockly/dev-tools');
-const eventTestHelpers = require('./event_test_helpers');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ProcedureCreate} = require('../src/events_procedure_create');
-const {ProcedureDelete} = require('../src/events_procedure_delete');
-
-suite('Procedure Create Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (name, id) => {
- return new ObservableProcedureModel(this.workspace, name, id);
- };
-
- this.createEventToState = (procedureModel) => {
- return new ProcedureCreate(this.workspace, procedureModel);
- };
- });
-
- suite('forward', function () {
- test('a procedure model is created if it does not exist', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- const createdProc = this.procedureMap.get('test id');
- assert.isDefined(createdProc, 'Expected the procedure to exist');
- assert.equal(
- createdProc.getName(),
- model.getName(),
- "Expected the procedure's name to match the model",
- );
- assert.equal(
- createdProc.getId(),
- model.getId(),
- "Expected the procedure's id to match the model",
- );
- });
-
- test('creating a procedure model fires a create event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureCreate,
- {procedure: this.procedureMap.get('test id')},
- this.workspace.id,
- );
- });
-
- test(
- 'a procedure model is not created if a model with a ' +
- 'matching ID exists',
- function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- this.procedureMap.get('test id'),
- model,
- 'Expected the model in the procedure map to be the same ' +
- 'as the original model',
- );
- },
- );
-
- test('not creating a model does not fire a create event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- this.clock.runAll();
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureCreate,
- {},
- this.workspace.id,
- );
- });
- });
-
- suite('backward', function () {
- test('a procedure model is deleted if a model with a matching ID exists', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.isUndefined(
- this.procedureMap.get('test id'),
- 'Expected the procedure to be deleted',
- );
- });
-
- test('deleting a model fires a delete event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureDelete,
- {procedure: model},
- this.workspace.id,
- );
- });
-
- test('not deleting a model does not fire a delete event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureDelete,
- {},
- this.workspace.id,
- );
- });
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- const origEvent = new ProcedureCreate(this.workspace, model);
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_delete.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_delete.mocha.js
deleted file mode 100644
index 1a287ca96..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_delete.mocha.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ProcedureDelete} = require('../src/events_procedure_delete');
-const {ProcedureCreate} = require('../src/events_procedure_create');
-
-suite('Procedure Delete Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (name, id) => {
- return new ObservableProcedureModel(this.workspace, name, id);
- };
-
- this.createEventToState = (procedureModel) => {
- return new ProcedureDelete(this.workspace, procedureModel);
- };
- });
-
- suite('forward', function () {
- test('a procedure model is deleted if a model with a matching ID exists', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.isUndefined(
- this.procedureMap.get('test id'),
- 'Expected the procedure to be deleted',
- );
- });
-
- test('deleting a model fires a delete event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureDelete,
- {procedure: model},
- this.workspace.id,
- );
- });
-
- test('not deleting a model does not fire a delete event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureDelete,
- {},
- this.workspace.id,
- );
- });
- });
-
- suite('backward', function () {
- test('a procedure model is created if it does not exist', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- const createdProc = this.procedureMap.get('test id');
- assert.isDefined(createdProc, 'Expected the procedure to exist');
- assert.equal(
- createdProc.getName(),
- model.getName(),
- "Expected the procedure's name to match the model",
- );
- assert.equal(
- createdProc.getId(),
- model.getId(),
- "Expected the procedure's id to match the model",
- );
- });
-
- test('creating a procedure model fires a create event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureCreate,
- {procedure: this.procedureMap.get('test id')},
- this.workspace.id,
- );
- });
-
- test(
- 'a procedure model is not created if a model with a ' +
- 'matching ID exists',
- function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- this.procedureMap.get('test id'),
- model,
- 'Expected the model in the procedure map to be the same ' +
- 'as the original model',
- );
- },
- );
-
- test('not creating a model does not fire a create event', function () {
- const model = this.createProcedureModel('test name', 'test id');
- const event = this.createEventToState(model);
- this.procedureMap.add(model);
-
- this.clock.runAll();
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureCreate,
- {},
- this.workspace.id,
- );
- });
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- this.procedureMap.add(model);
- const origEvent = new ProcedureDelete(this.workspace, model);
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_enable.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_enable.mocha.js
deleted file mode 100644
index fe6fc2f24..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_enable.mocha.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ProcedureEnable} = require('../src/events_procedure_enable');
-
-suite('Procedure Enable Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (id) => {
- return new ObservableProcedureModel(this.workspace, 'test name', id);
- };
-
- this.createEventToState = (procedureModel) => {
- return new ProcedureEnable(this.workspace, procedureModel);
- };
- });
-
- suite('forward', function () {
- test('the procedure with the matching ID is toggled', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setEnabled(!final.getEnabled()); // Set it to the non-default.
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initial.getEnabled(),
- final.getEnabled(),
- "Expected the procedure's enabled state to be flipped",
- );
- });
-
- test('toggling a procedure fires an enable event', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setEnabled(!final.getEnabled()); // Set it to the non-default.
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureEnable,
- {procedure: initial},
- this.workspace.id,
- );
- });
-
- test('noop toggles do not fire enable events', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureEnable,
- this.workspace.id,
- );
- });
-
- test('attempting to toggle a procedure that does not exist throws', function () {
- const final = this.createProcedureModel('test id');
- final.setEnabled(!final.getEnabled()); // Set it to the non-default.
- const event = this.createEventToState(final);
-
- assert.throws(() => {
- event.run(/* forward= */ true);
- });
- });
-
- test('deserializing the event and running it triggers the effect', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setEnabled(!final.getEnabled()); // Set it to the non-default.
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- const newEvent = Blockly.Events.fromJson(
- event.toJson(),
- this.workspace,
- );
- newEvent.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initial.getEnabled(),
- final.getEnabled(),
- "Expected the procedure's enabled state to be flipped",
- );
- });
- });
-
- suite('backward', function () {
- test('the procedure with the matching ID is toggled', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- // Set them to be non-default.
- const defaultEnabled = initial.getEnabled();
- initial.setEnabled(!defaultEnabled);
- undoable.setEnabled(!defaultEnabled);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- initial.getEnabled(),
- defaultEnabled,
- "Expected the procedure's enabled state to be flipped",
- );
- });
-
- test('toggling a procedure fires an enable event', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- // Set them to be non-default.
- const defaultEnabled = initial.getEnabled();
- initial.setEnabled(!defaultEnabled);
- undoable.setEnabled(!defaultEnabled);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureEnable,
- {procedure: initial},
- this.workspace.id,
- );
- });
-
- test('noop toggles do not fire enable events', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- // Set them to be non-default.
- const defaultEnabled = initial.getEnabled();
- undoable.setEnabled(!defaultEnabled);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureEnable,
- {},
- this.workspace.id,
- );
- });
-
- test('attempting to toggle a procedure that does not exist throws', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- // Set them to be non-default.
- const defaultEnabled = initial.getEnabled();
- initial.setEnabled(!defaultEnabled);
- undoable.setEnabled(!defaultEnabled);
- const event = this.createEventToState(undoable);
-
- assert.throws(() => {
- event.run(/* forward= */ false);
- });
- });
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- this.procedureMap.add(model);
- const origEvent = new ProcedureEnable(this.workspace, model);
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_parameter_create.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_parameter_create.mocha.js
deleted file mode 100644
index 5a47900b6..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_parameter_create.mocha.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ObservableParameterModel} = require('../src/observable_parameter_model');
-const {
- ProcedureParameterCreate,
-} = require('../src/events_procedure_parameter_create');
-const {
- ProcedureParameterDelete,
-} = require('../src/events_procedure_parameter_delete');
-
-suite('Procedure Parameter Create Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (name, id, workspace) => {
- return new ObservableProcedureModel(
- workspace ?? this.workspace,
- name,
- id,
- );
- };
-
- this.createProcedureAndParameter = (
- procName,
- procId,
- paramName,
- paramId,
- ) => {
- const param = new ObservableParameterModel(
- this.workspace,
- paramName,
- paramId,
- );
- const proc = new ObservableProcedureModel(
- this.workspace,
- procName,
- procId,
- ).insertParameter(param, 0);
- return {param, proc};
- };
-
- this.createEventToState = (procedureModel, parameterModel) => {
- return new ProcedureParameterCreate(
- this.workspace,
- procedureModel,
- parameterModel,
- 0,
- );
- };
- });
-
- suite('forward', function () {
- test('a parameter is inserted if it does not exist', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- const actualProc = this.createProcedureModel('test name', 'test id');
- this.procedureMap.add(actualProc);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- const createdParam = actualProc.getParameter(0);
- assert.isDefined(createdParam, 'Expected the parameter to exist');
- assert.equal(
- createdParam.getName(),
- modelParam.getName(),
- "Expected the parameter's name to match the model",
- );
- assert.equal(
- createdParam.getId(),
- modelParam.getId(),
- "Expected the parameter's id to match the model",
- );
- });
-
- test('inserting a parameter fires a create event', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- const actualProc = this.createProcedureModel('test name', 'test id');
- this.procedureMap.add(actualProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterCreate,
- {
- procedure: actualProc,
- parameter: actualProc.getParameter(0),
- index: 0,
- },
- this.workspace.id,
- );
- });
-
- test(
- 'a parameter is not created if a parameter with a ' +
- 'matching ID and index already exists',
- function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- this.procedureMap.add(modelProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- const actualProc = this.procedureMap.get('test id');
- assert.equal(
- actualProc,
- modelProc,
- 'Expected the procedure in the procedure map to not ' +
- 'have changed',
- );
- assert.equal(
- actualProc.getParameter(0),
- modelParam,
- 'Expected the parameter to not have changed',
- );
- },
- );
-
- test('not creating a parameter model does not fire a create event', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- this.procedureMap.add(modelProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterCreate,
- {},
- this.workspace.id,
- );
- });
-
- test(
- 'deserializing the event into a different workspace creates ' +
- 'an identical parameter (including variable ID)',
- function () {
- const otherWorkspace = new Blockly.Workspace();
- const otherProcedureMap = otherWorkspace.getProcedureMap();
-
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- const actualProc = this.createProcedureModel(
- 'test name',
- 'test id',
- otherWorkspace,
- );
- otherProcedureMap.add(actualProc);
-
- const otherEvent = Blockly.Events.fromJson(
- event.toJson(),
- otherWorkspace,
- );
- otherEvent.run(/* forward= */ true);
- this.clock.runAll();
-
- const createdParam = actualProc.getParameter(0);
- assert.isDefined(createdParam, 'Expected the parameter to exist');
- assert.equal(
- createdParam.getName(),
- modelParam.getName(),
- "Expected the parameter's name to match the model",
- );
- assert.equal(
- createdParam.getId(),
- modelParam.getId(),
- "Expected the parameter's id to match the model",
- );
- assert.equal(
- createdParam.getVariableModel().getId(),
- modelParam.getVariableModel().getId(),
- "Expected the parameter's variable's id to match the model",
- );
- },
- );
- });
-
- suite('backward', function () {
- test('a parameter is removed if it exists', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.isUndefined(
- proc.getParameter(0),
- 'Expected the parameter to be deleted',
- );
- });
-
- test('removing a parameter fires a delete event', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterDelete,
- {
- procedure: proc,
- parameter: param,
- index: 0,
- },
- this.workspace.id,
- );
- });
-
- test(
- 'running the event throws if a parameter with a ' +
- 'matching ID and index does not exist',
- function () {
- // TODO: Figure out what we want to do in this case.
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
-
- this.eventSpy.resetHistory();
- chai.assert.throws(() => {
- event.run(/* forward= */ false);
- });
- },
- );
-
- test('not removing a parameter does not fire a delete event', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
- proc.deleteParameter(0);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterDelete,
- {},
- this.workspace.id,
- );
- });
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const param = new ObservableParameterModel(
- this.workspace,
- 'test param name',
- 'test param id',
- );
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- this.procedureMap.add(model);
- const origEvent = new ProcedureParameterCreate(
- this.workspace,
- model,
- param,
- 0,
- );
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_parameter_delete.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_parameter_delete.mocha.js
deleted file mode 100644
index ce7613322..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_parameter_delete.mocha.js
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ObservableParameterModel} = require('../src/observable_parameter_model');
-const {
- ProcedureParameterDelete,
-} = require('../src/events_procedure_parameter_delete');
-const {
- ProcedureParameterCreate,
-} = require('../src/events_procedure_parameter_create');
-
-suite('Procedure Parameter Delete Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.clock.runAll();
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (name, id) => {
- return new ObservableProcedureModel(this.workspace, name, id);
- };
-
- this.createProcedureAndParameter = (
- procName,
- procId,
- paramName,
- paramId,
- ) => {
- const param = new ObservableParameterModel(
- this.workspace,
- procName,
- paramId,
- );
- const proc = new ObservableProcedureModel(
- this.workspace,
- paramName,
- procId,
- ).insertParameter(param, 0);
- return {param, proc};
- };
-
- this.createEventToState = (procedureModel, parameterModel) => {
- return new ProcedureParameterDelete(
- this.workspace,
- procedureModel,
- parameterModel,
- 0,
- );
- };
- });
-
- suite('forward', function () {
- test('a parameter is removed if it exists', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.isUndefined(
- proc.getParameter(0),
- 'Expected the parameter to be deleted',
- );
- });
-
- test('removing a parameter fires a delete event', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterDelete,
- {
- procedure: proc,
- parameter: param,
- index: 0,
- },
- this.workspace.id,
- );
- });
-
- test(
- 'running the event throws if a parameter with a ' +
- 'matching ID and index does not exist',
- function () {
- // TODO: Figure out what we want to do in this case.
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
-
- this.eventSpy.resetHistory();
- chai.assert.throws(() => {
- event.run(/* forward= */ true);
- });
- },
- );
-
- test('not removing a parameter does not fire a delete event', function () {
- const {param, proc} = this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(proc, param);
- this.procedureMap.add(proc);
- proc.deleteParameter(0);
-
- this.clock.runAll();
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterDelete,
- {},
- this.workspace.id,
- );
- });
- });
-
- suite('backward', function () {
- test('a parameter is inserted if it does not exist', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- const actualProc = this.createProcedureModel('test name', 'test id');
- this.procedureMap.add(actualProc);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- const createdParam = actualProc.getParameter(0);
- assert.isDefined(createdParam, 'Expected the parameter to exist');
- assert.equal(
- createdParam.getName(),
- modelParam.getName(),
- "Expected the parameter's name to match the model",
- );
- assert.equal(
- createdParam.getId(),
- modelParam.getId(),
- "Expected the parameter's id to match the model",
- );
- });
-
- test('inserting a parameter fires a create event', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- const actualProc = this.createProcedureModel('test name', 'test id');
- this.procedureMap.add(actualProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterCreate,
- {
- procedure: actualProc,
- parameter: actualProc.getParameter(0),
- index: 0,
- },
- this.workspace.id,
- );
- });
-
- test(
- 'a parameter is not created if a parameter with a ' +
- 'matching ID and index already exists',
- function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- this.procedureMap.add(modelProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- const actualProc = this.procedureMap.get('test id');
- assert.equal(
- actualProc,
- modelProc,
- 'Expected the procedure in the procedure map to not ' +
- 'have changed',
- );
- assert.equal(
- actualProc.getParameter(0),
- modelParam,
- 'Expected the parameter to not have changed',
- );
- },
- );
-
- test('not creating a parameter model does not fire a create event', function () {
- const {param: modelParam, proc: modelProc} =
- this.createProcedureAndParameter(
- 'test name',
- 'test id',
- 'test param name',
- 'test param id',
- );
- const event = this.createEventToState(modelProc, modelParam);
- this.procedureMap.add(modelProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterCreate,
- {},
- this.workspace.id,
- );
- });
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const param = new ObservableParameterModel(
- this.workspace,
- 'test param name',
- 'test param id',
- );
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- ).insertParameter(param, 0);
- this.procedureMap.add(model);
- const origEvent = new ProcedureParameterDelete(
- this.workspace,
- model,
- param,
- 0,
- );
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_parameter_rename.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_parameter_rename.mocha.js
deleted file mode 100644
index 4505d69df..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_parameter_rename.mocha.js
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ObservableParameterModel} = require('../src/observable_parameter_model');
-const {
- ProcedureParameterRename,
-} = require('../src/events_procedure_parameter_rename');
-
-suite('Procedure Parameter Rename Event', function () {
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- const DEFAULT_NAME = 'default';
- const NON_DEFAULT_NAME = 'non-default';
-
- setup(function () {
- this.createProcedureAndParameter = (procId, paramId) => {
- const param = new ObservableParameterModel(
- this.workspace,
- DEFAULT_NAME,
- paramId,
- );
- const proc = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- procId,
- ).insertParameter(param, 0);
- return {param, proc};
- };
-
- this.createEventToState = (procedureModel, parameterModel) => {
- return new ProcedureParameterRename(
- this.workspace,
- procedureModel,
- parameterModel,
- parameterModel.getName() === DEFAULT_NAME
- ? NON_DEFAULT_NAME
- : DEFAULT_NAME,
- );
- };
- });
-
- suite('forward', function () {
- test('the parameter with the matching ID and index is renamed', function () {
- const {param: initialParam, proc: initialProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- finalParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(finalProc, finalParam);
- this.procedureMap.add(initialProc);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initialParam.getName(),
- finalParam.getName(),
- "Expected the procedure parameter's name to be changed",
- );
- });
-
- test('renaming a parameter fires a rename event', function () {
- const {param: initialParam, proc: initialProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- finalParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(finalProc, finalParam);
- this.procedureMap.add(initialProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterRename,
- {
- procedure: initialProc,
- parameter: initialParam,
- oldName: DEFAULT_NAME,
- },
- this.workspace.id,
- );
- });
-
- test('noop renames do not fire rename events', function () {
- const {proc: initialProc} = this.createProcedureAndParameter(
- 'test procId',
- 'test paramId',
- );
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const event = this.createEventToState(finalProc, finalParam);
- this.procedureMap.add(initialProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterRename,
- {},
- this.workspace.id,
- );
- });
-
- test('attempting to rename a parameter that does not exist throws', function () {
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- finalParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(finalProc, finalParam);
- this.clock.runAll();
-
- assert.throws(() => {
- event.run(/* forward= */ true);
- });
- });
-
- test(
- 'attempting to rename a procedure with a different old name ' +
- 'does not work',
- function () {
- const otherNonDefaultName = 'other non-default name';
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- finalParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(finalProc, finalParam);
- const {param: testParam, proc: testProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- testParam.setName(otherNonDefaultName);
- this.procedureMap.add(testProc);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- testParam.getName(),
- otherNonDefaultName,
- "Expected the parameter's name to be unchanged",
- );
- },
- );
-
- test('deserializing the event and running it triggers the effect', function () {
- const {param: initialParam, proc: initialProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const {param: finalParam, proc: finalProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- finalParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(finalProc, finalParam);
- this.procedureMap.add(initialProc);
-
- const newEvent = Blockly.Events.fromJson(
- event.toJson(),
- this.workspace,
- );
- newEvent.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initialParam.getName(),
- finalParam.getName(),
- "Expected the procedure parameter's name to be changed",
- );
- });
- });
-
- suite('backward', function () {
- test('the parameter with the matching ID and index is renamed', function () {
- const {param: initialParam, proc: initialProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const {param: undoableParam, proc: undoableProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- initialParam.setName(NON_DEFAULT_NAME);
- undoableParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoableProc, undoableParam);
- this.procedureMap.add(initialProc);
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- initialParam.getName(),
- DEFAULT_NAME,
- "Expected the procedure parameter's name to be changed",
- );
- });
-
- test('renaming a parameter fires a rename event', function () {
- const {param: initialParam, proc: initialProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- const {param: undoableParam, proc: undoableProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- initialParam.setName(NON_DEFAULT_NAME);
- undoableParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoableProc, undoableParam);
- this.procedureMap.add(initialProc);
- this.clock.runAll();
-
- this.eventSpy.resetHistory();
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureParameterRename,
- {
- procedure: initialProc,
- parameter: initialParam,
- oldName: NON_DEFAULT_NAME,
- },
- this.workspace.id,
- );
- });
-
- test('noop renames do not fire rename events', function () {
- const {proc: initialProc} = this.createProcedureAndParameter(
- 'test procId',
- 'test paramId',
- );
- const {param: undoableParam, proc: undoableProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- undoableParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoableProc, undoableParam);
- this.procedureMap.add(initialProc);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureParameterRename,
- {},
- this.workspace.id,
- );
- });
-
- test('attempting to rename a parameter that does not exist throws', function () {
- const {param: initialParam} = this.createProcedureAndParameter(
- 'test procId',
- 'test paramId',
- );
- const {param: undoableParam, proc: undoableProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- initialParam.setName(NON_DEFAULT_NAME);
- undoableParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoableProc, undoableParam);
-
- assert.throws(() => {
- event.run(/* forward= */ false);
- });
- });
-
- test(
- 'attempting to rename a procedure with a different old name ' +
- 'does not work',
- function () {
- const otherNonDefaultName = 'other non-default name';
- const {param: undoableParam, proc: undoableProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- undoableParam.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoableProc, undoableParam);
- const {param: testParam, proc: testProc} =
- this.createProcedureAndParameter('test procId', 'test paramId');
- testParam.setName(otherNonDefaultName);
- this.procedureMap.add(testProc);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- testParam.getName(),
- otherNonDefaultName,
- "Expected the parameter's name to be unchanged",
- );
- },
- );
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const param = new ObservableParameterModel(
- this.workspace,
- 'test param name',
- 'test param id',
- );
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- ).insertParameter(param, 0);
- this.procedureMap.add(model);
- const origEvent = new ProcedureParameterRename(
- this.workspace,
- model,
- param,
- 'old name',
- );
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_procedure_rename.mocha.js b/plugins/block-shareable-procedures/test/event_procedure_rename.mocha.js
deleted file mode 100644
index 4eeeeb59c..000000000
--- a/plugins/block-shareable-procedures/test/event_procedure_rename.mocha.js
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const assert = chai.assert;
-const Blockly = require('blockly');
-const eventTestHelpers = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {ProcedureRename} = require('../src/events_procedure_rename');
-
-suite('Procedure Rename Event', function () {
- const DEFAULT_NAME = 'default';
- const NON_DEFAULT_NAME = 'non-default';
-
- setup(function () {
- this.sandbox = sinon.createSandbox();
- this.clock = this.sandbox.useFakeTimers();
- this.workspace = new Blockly.Workspace();
- this.procedureMap = this.workspace.getProcedureMap();
- this.eventSpy = sinon.spy();
- this.workspace.addChangeListener(this.eventSpy);
- });
-
- teardown(function () {
- this.sandbox.restore();
- });
-
- suite('running', function () {
- setup(function () {
- this.createProcedureModel = (id) => {
- return new ObservableProcedureModel(this.workspace, DEFAULT_NAME, id);
- };
-
- this.createEventToState = (procedureModel) => {
- return new ProcedureRename(
- this.workspace,
- procedureModel,
- procedureModel.getName() === DEFAULT_NAME
- ? NON_DEFAULT_NAME
- : DEFAULT_NAME,
- );
- };
- });
-
- suite('forward', function () {
- test('the procedure with the matching ID is renamed', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initial.getName(),
- final.getName(),
- "Expected the procedure's name to be changed",
- );
- });
-
- test('renaming a procedure fires a rename event', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureRename,
- {procedure: initial, oldName: DEFAULT_NAME},
- this.workspace.id,
- );
- });
-
- test('noop renames do not fire rename events', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureRename,
- {},
- this.workspace.id,
- );
- });
-
- test('attempting to rename a procedure that does not exist throws', function () {
- const final = this.createProcedureModel('test id');
- final.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(final);
-
- assert.throws(() => {
- event.run(/* forward= */ true);
- });
- });
-
- test(
- 'attempting to rename a procedure with a different old name ' +
- 'does not work',
- function () {
- const otherNonDefaultName = 'other non-default name';
- const final =
- this.createProcedureModel('test id').setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(final);
- const testModel =
- this.createProcedureModel('test id').setName(otherNonDefaultName);
- this.procedureMap.add(testModel);
-
- event.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- testModel.getName(),
- otherNonDefaultName,
- "Expected the procedure's name to be unchanged",
- );
- },
- );
-
- test('deserializing the event and running it triggers the effect', function () {
- const initial = this.createProcedureModel('test id');
- const final = this.createProcedureModel('test id');
- final.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(final);
- this.procedureMap.add(initial);
-
- const newEvent = Blockly.Events.fromJson(
- event.toJson(),
- this.workspace,
- );
- newEvent.run(/* forward= */ true);
- this.clock.runAll();
-
- assert.equal(
- initial.getName(),
- final.getName(),
- "Expected the procedure's name to be changed",
- );
- });
- });
-
- suite('backward', function () {
- test('the procedure with the matching ID is renamed', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setName(NON_DEFAULT_NAME);
- undoable.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- initial.getName(),
- DEFAULT_NAME,
- "Expected the procedure's name to be changed",
- );
- });
-
- test('renaming a procedure fires a rename event', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setName(NON_DEFAULT_NAME);
- undoable.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- eventTestHelpers.assertEventFiredShallow(
- this.eventSpy,
- ProcedureRename,
- {procedure: initial, oldName: NON_DEFAULT_NAME},
- this.workspace.id,
- );
- });
-
- test('noop renames do not fire rename events', function () {
- const initial = this.createProcedureModel('test id');
- const undoable = this.createProcedureModel('test id');
- initial.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoable);
- this.procedureMap.add(initial);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- testHelpers.assertEventNotFired(
- this.eventSpy,
- ProcedureRename,
- {},
- this.workspace.id,
- );
- });
-
- test('attempting to rename a procedure that does not exist throws', function () {
- const undoable = this.createProcedureModel('test id');
- undoable.setName(NON_DEFAULT_NAME);
- const event = this.createEventToState(undoable);
-
- assert.throws(() => {
- event.run(/* forward= */ false);
- });
- });
-
- test(
- 'attempting to rename a procedure with a different new name ' +
- 'does not work',
- function () {
- const otherNonDefaultName = 'other non-default name';
- const undoable = this.createProcedureModel('test id');
- const event = this.createEventToState(undoable);
- const testModel =
- this.createProcedureModel('test id').setName(otherNonDefaultName);
- this.procedureMap.add(testModel);
-
- event.run(/* forward= */ false);
- this.clock.runAll();
-
- assert.equal(
- testModel.getName(),
- otherNonDefaultName,
- "Expected the procedure's name to be unchanged",
- );
- },
- );
- });
- });
-
- suite('serialization', function () {
- test('events round-trip through JSON', function () {
- const model = new ObservableProcedureModel(
- this.workspace,
- 'test name',
- 'test id',
- );
- this.procedureMap.add(model);
- const origEvent = new ProcedureRename(
- this.workspace,
- model,
- NON_DEFAULT_NAME,
- );
-
- const json = origEvent.toJson();
- const newEvent = Blockly.Events.fromJson(json, this.workspace);
-
- assert.deepEqual(newEvent, origEvent);
- });
- });
-});
diff --git a/plugins/block-shareable-procedures/test/event_test_helpers.js b/plugins/block-shareable-procedures/test/event_test_helpers.js
deleted file mode 100644
index 815cf8c11..000000000
--- a/plugins/block-shareable-procedures/test/event_test_helpers.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const sinon = require('sinon');
-
-/**
- * Returns a matcher that asserts that the actual object has the same properties
- * and values (shallowly equated) as the expected object.
- * @param {!Object} expected The expected set of properties we expect the
- * actual object to have.
- * @returns {function(*): boolean} A matcher that returns true if the `actual`
- * object has all of the properties of the `expected` param, with the same
- * values.
- */
-export function shallowMatch(expected) {
- return (actual) => {
- for (const key in expected) {
- if (actual[key] !== expected[key]) {
- return false;
- }
- }
- return true;
- };
-}
-
-/**
- * Asserts that an event with the given values (shallowly evaluated) was fired.
- * @param {!sinon.SinonSpyCall|!sinon.SinonSpy} spy The spy or spy call to use.
- * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance
- * type of event fired.
- * @param {!Object} expectedProperties Map of of expected properties
- * to check on fired event.
- * @param {string} expectedWorkspaceId Expected workspace id of event fired.
- * @param {?string=} expectedBlockId Expected block id of event fired.
- */
-export function assertEventFiredShallow(
- spy,
- instanceType,
- expectedProperties,
- expectedWorkspaceId,
- expectedBlockId,
-) {
- const properties = {
- ...expectedProperties,
- workspaceId: expectedWorkspaceId,
- blockId: expectedBlockId,
- };
- sinon.assert.calledWith(
- spy,
- sinon.match
- .instanceOf(instanceType)
- .and(sinon.match(shallowMatch(properties))),
- );
-}
diff --git a/plugins/block-shareable-procedures/test/index.html b/plugins/block-shareable-procedures/test/index.html
deleted file mode 100644
index 64d2578c2..000000000
--- a/plugins/block-shareable-procedures/test/index.html
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
- Blockly Shareable Procedures
-
-
-
-
-
-
-
-
-
Saved State
-
- Workspace 1
-
- Workspace 2
-
-
-
-
-
-
diff --git a/plugins/block-shareable-procedures/test/index.js b/plugins/block-shareable-procedures/test/index.js
deleted file mode 100644
index 72c9dda85..000000000
--- a/plugins/block-shareable-procedures/test/index.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-/**
- * @fileoverview Block test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories} from '@blockly/dev-tools';
-import {
- blocks,
- unregisterProcedureBlocks,
- registerProcedureSerializer,
-} from '../src/index';
-import {ProcedureBase} from '../src/events_procedure_base';
-
-/* eslint no-unused-vars: "off" */
-
-unregisterProcedureBlocks();
-Blockly.common.defineBlocks(blocks);
-
-registerProcedureSerializer();
-
-let workspace1;
-let workspace2;
-
-document.addEventListener('DOMContentLoaded', function () {
- injectTwoWorkspaces();
-});
-
-/**
- * Injects two workspaces that share procedure models. Undo and redo are off.
- */
-function injectTwoWorkspaces() {
- const options = {
- toolbox: toolboxCategories,
- };
- workspace1 = Blockly.inject('blockly1', options);
- workspace2 = Blockly.inject('blockly2', options);
- // If we allow undoing operations, it can create event loops when sharing
- // events between workspaces.
- workspace1.MAX_UNDO = 0;
- workspace2.MAX_UNDO = 0;
- workspace1.addChangeListener(createEventSharer(workspace2));
- workspace2.addChangeListener(createEventSharer(workspace1));
-
- workspace1.addChangeListener(
- createSerializationListener(workspace1, 'save1'),
- );
- workspace2.addChangeListener(
- createSerializationListener(workspace2, 'save2'),
- );
-
- document
- .getElementById('load')
- .addEventListener('click', () => reloadWorkspaces());
-}
-
-/** Injects one workspace with undo and redo enabled. */
-function injectOneWorkspace() {
- const elem = document.getElementById('blockly2');
- elem.parentElement.removeChild(elem);
-
- const options = {
- toolbox: toolboxCategories,
- };
- workspace1 = Blockly.inject('blockly1', options);
-
- workspace1.addChangeListener(
- createSerializationListener(workspace1, 'save1'),
- );
-
- document
- .getElementById('load')
- .addEventListener('click', () => loadWorkspace());
-}
-
-/**
- * Returns an event listener that shares procedure and var events from the
- * connected workspace to the other workspace.
- * @param {!Blockly.Workspace} otherWorkspace The workspace to share events to.
- * @returns {function(Blockly.Events.Abstract)} The listener.
- */
-function createEventSharer(otherWorkspace) {
- return (e) => {
- if (
- !(e instanceof ProcedureBase) &&
- !(e instanceof Blockly.Events.VarBase)
- ) {
- return;
- }
- let event;
- try {
- event = Blockly.Events.fromJson(e.toJson(), otherWorkspace);
- } catch (e) {
- // Could not deserialize event. This is expected to happen. E.g.
- // when round-tripping parameter deletes, the delete in the
- // secondary workspace cannot be deserialized into the original
- // workspace.
- return;
- }
- event.run(true);
- };
-}
-
-/**
- * Returns an event listener that serializes the given workspace to JSON and
- * outputs it to the text area with the given ID.
- * @param {!Blockly.Workspace} workspace The workspace to serialize.
- * @param {string} textAreaId The ID of the text area to output to.
- * @returns {function(Blockly.Events.Abstract)} The listener.
- */
-function createSerializationListener(workspace, textAreaId) {
- const textArea = document.getElementById(textAreaId);
- return (e) => {
- if (workspace.isDragging()) return;
- textArea.value = JSON.stringify(
- Blockly.serialization.workspaces.save(workspace),
- undefined,
- 2,
- );
- };
-}
-
-/**
- * Reloads both workspaces to showcase serialization working.
- */
-async function reloadWorkspaces() {
- const save1 = Blockly.serialization.workspaces.save(workspace1);
- const save2 = Blockly.serialization.workspaces.save(workspace2);
- workspace1.clear();
- workspace2.clear();
- // Show people the cleared workspace so they know the reload did something.
- await new Promise((resolve) => setTimeout(resolve, 500));
- Blockly.serialization.workspaces.load(save1, workspace1);
- Blockly.serialization.workspaces.load(save2, workspace2);
-}
-
-/** Loads the workspace in single workspace mode. */
-function loadWorkspace() {
- const save1 = JSON.parse(document.getElementById('save1').value);
- workspace1.clear();
- Blockly.serialization.workspaces.load(save1, workspace1);
-}
diff --git a/plugins/block-shareable-procedures/test/procedure_blocks.mocha.js b/plugins/block-shareable-procedures/test/procedure_blocks.mocha.js
deleted file mode 100644
index c2e95b9eb..000000000
--- a/plugins/block-shareable-procedures/test/procedure_blocks.mocha.js
+++ /dev/null
@@ -1,2588 +0,0 @@
-/**
- * @license
- * Copyright 2019 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const Blockly = require('blockly');
-const chai = require('chai');
-const assert = chai.assert;
-const sinon = require('sinon');
-const {
- assertCallBlockStructure,
- assertDefBlockStructure,
- createGenUidStubWithReturns,
- createProcCallBlock,
- createProcDefBlock,
-} = require('./procedure_test_helpers');
-const {assertEventFiredShallow} = require('./event_test_helpers');
-const {testHelpers} = require('@blockly/dev-tools');
-const {ObservableParameterModel} = require('../src/observable_parameter_model');
-const {ObservableProcedureModel} = require('../src/observable_procedure_model');
-const {blocks} = require('../src/blocks');
-const {
- unregisterProcedureBlocks,
- registerProcedureSerializer,
-} = require('../src/index');
-const {ProcedureDelete} = require('../src/events_procedure_delete');
-const {ProcedureCreate} = require('../src/events_procedure_create');
-
-suite('Procedures', function () {
- setup(function () {
- this.jsdomCleanup = require('jsdom-global')(
- '
',
- {pretendToBeVisual: true},
- );
-
- this.sandbox = sinon.createSandbox();
- globalThis.clock = this.sandbox.useFakeTimers();
-
- unregisterProcedureBlocks();
- Blockly.common.defineBlocks(blocks);
-
- registerProcedureSerializer();
-
- this.workspace = Blockly.inject('blocklyDiv', {});
-
- this.eventSpy = this.sandbox.spy();
- this.workspace.addChangeListener(this.eventSpy);
-
- this.workspace
- .getVariableMap()
- .createVariable('preCreatedVar', '', 'preCreatedVarId');
- this.workspace
- .getVariableMap()
- .createVariable('preCreatedTypedVar', 'type', 'preCreatedTypedVarId');
-
- Blockly.defineBlocksWithJsonArray([
- {
- type: 'row_block',
- message0: '%1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- output: null,
- },
- ]);
-
- this.getContextStub = this.sandbox
- .stub(window.HTMLCanvasElement.prototype, 'getContext')
- .callsFake(() => {
- return {
- measureText: function () {
- return {width: 0};
- },
- };
- });
- this.findParentWsStub = this.sandbox
- .stub(Blockly.Workspace.prototype, 'getRootWorkspace')
- .callsFake(() => {
- return this.workspace;
- });
- });
-
- teardown(function () {
- globalThis.clock.runAll();
- delete Blockly.Blocks['row_block'];
- this.sandbox.restore();
- this.jsdomCleanup();
- });
-
- suite('updating data models', function () {
- test('renaming a procedure def block updates the procedure model', function () {
- const defBlock = createProcDefBlock(this.workspace);
-
- defBlock.setFieldValue('new name', 'NAME');
-
- assert.equal(
- defBlock.getProcedureModel().getName(),
- 'new name',
- 'Expected the procedure model name to be updated',
- );
- });
-
- test('disabling a procedure def block updates the procedure model', function () {
- const defBlock = createProcDefBlock(this.workspace);
-
- defBlock.setDisabledReason(true);
- globalThis.clock.runAll();
-
- assert.isFalse(
- defBlock.getProcedureModel().getEnabled(),
- 'Expected the procedure model to be disabled',
- );
- });
-
- test('adding a parameter to a procedure def updates the procedure model', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param name', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
-
- defBlock.compose(containerBlock);
-
- assert.equal(
- defBlock.getProcedureModel().getParameter(0).getName(),
- 'param name',
- 'Expected the procedure model to have a matching parameter',
- );
- });
-
- test('adding a parameter adds a variable to the variable map', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param name', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
-
- defBlock.compose(containerBlock);
-
- assert.isTrue(
- this.workspace
- .getVariableMap()
- .getVariablesOfType('')
- .some((variable) => variable.name === 'param name'),
- 'Expected the variable map to have a matching variable',
- );
- });
-
- test('moving a parameter in the procedure def updates the procedure model', function () {
- // Create a stack of container, param1, param2.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock1 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock1.setFieldValue('param name1', 'NAME');
- const paramBlock2 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock2.setFieldValue('param name2', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock1.previousConnection);
- paramBlock1.nextConnection.connect(paramBlock2.previousConnection);
- defBlock.compose(containerBlock);
- const id1 = defBlock.getProcedureModel().getParameter(0).getId();
- const id2 = defBlock.getProcedureModel().getParameter(1).getId();
-
- // Reconfigure the stack to be container, param2, param1.
- paramBlock2.previousConnection.disconnect();
- paramBlock1.previousConnection.disconnect();
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock2.previousConnection);
- paramBlock2.nextConnection.connect(paramBlock1.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.equal(
- defBlock.getProcedureModel().getParameter(0).getName(),
- 'param name2',
- 'Expected the first parameter of the procedure to be param 2',
- );
- assert.equal(
- defBlock.getProcedureModel().getParameter(0).getId(),
- id2,
- 'Expected the first parameter of the procedure to be param 2',
- );
- assert.equal(
- defBlock.getProcedureModel().getParameter(1).getName(),
- 'param name1',
- 'Expected the second parameter of the procedure to be param 1',
- );
- assert.equal(
- defBlock.getProcedureModel().getParameter(1).getId(),
- id1,
- 'Expected the second parameter of the procedure to be param 1',
- );
- });
-
- test('decomposing and recomposing maintains parameter IDs', function () {
- // Create a stack of container, param.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param name', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
- const paramBlockId = defBlock.getProcedureModel().getParameter(0).getId();
-
- Blockly.Events.disable();
- this.workspace.clear();
- Blockly.Events.enable();
- const container = defBlock.decompose(this.workspace);
- defBlock.compose(container);
-
- assert.equal(
- defBlock.getProcedureModel().getParameter(0).getId(),
- paramBlockId,
- 'Expected the parameter ID to be maintained',
- );
- });
-
- test('deleting a parameter from a procedure def updates the procedure model', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param name', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- containerBlock.getInput('STACK').connection.disconnect();
- defBlock.compose(containerBlock);
-
- assert.isEmpty(
- defBlock.getProcedureModel().getParameters(),
- 'Expected the procedure model to have no parameters',
- );
- });
-
- test('renaming a procedure parameter updates the parameter model', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param name', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.setFieldValue('new param name', 'NAME');
- defBlock.compose(containerBlock);
-
- assert.equal(
- defBlock.getProcedureModel().getParameter(0).getName(),
- 'new param name',
- 'Expected the procedure model to have a matching parameter',
- );
- });
-
- test('deleting a procedure deletes the procedure model', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const model = defBlock.getProcedureModel();
- defBlock.dispose();
-
- assert.isUndefined(
- this.workspace.getProcedureMap().get(model.getId()),
- 'Expected the model to be removed from the procedure map',
- );
- });
- });
-
- suite('responding to data model updates', function () {
- suite('def blocks', function () {
- test('renaming the procedure data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.setName('new name');
-
- assert.equal(
- defBlock.getFieldValue('NAME'),
- 'new name',
- 'Expected the procedure block to be renamed',
- );
- });
-
- test('disabling a procedure data model disables blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.setEnabled(false);
-
- assert.isFalse(
- defBlock.isEnabled(),
- 'Expected the procedure block to be disabled',
- );
- });
-
- test('adding a parameter to a data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.insertParameter(
- new ObservableParameterModel(this.workspace, 'param1', 'id'),
- 0,
- );
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('param1'),
- 'Expected the params field to contain the name of the new param',
- );
- });
-
- test('moving a parameter in the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- const param2 = new ObservableParameterModel(
- this.workspace,
- 'param2',
- 'id2',
- );
- procModel.insertParameter(param1, 0);
- procModel.insertParameter(param2, 1);
-
- procModel.deleteParameter(1);
- procModel.insertParameter(param2, 0);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('param2, param1'),
- 'Expected the params field order to match the parameter order',
- );
- });
-
- test('deleting a parameter from the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- const param2 = new ObservableParameterModel(
- this.workspace,
- 'param2',
- 'id2',
- );
- procModel.insertParameter(param1, 0);
- procModel.insertParameter(param2, 1);
-
- procModel.deleteParameter(0);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('param2'),
- 'Expected the params field order to contain one parameter',
- );
- assert.isFalse(
- defBlock.getFieldValue('PARAMS').includes('param1'),
- 'Expected the params field to not contain the ' + 'deleted parameter',
- );
- });
-
- test('renaming a procedure parameter in the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- procModel.insertParameter(param1, 0);
-
- param1.setName('new name');
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('new name'),
- 'Expected the params field to contain the new param name',
- );
- });
- });
-
- suite('caller blocks', function () {
- test('renaming the procedure data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.setName('new name');
-
- assert.equal(
- callBlock.getFieldValue('NAME'),
- 'new name',
- 'Expected the procedure block to be renamed',
- );
- });
-
- test('disabling a procedure data model disables blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.setEnabled(false);
-
- assert.isFalse(
- callBlock.isEnabled(),
- 'Expected the procedure block to be disabled',
- );
- });
-
- test('adding a parameter to a data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
-
- procModel.insertParameter(
- new ObservableParameterModel(this.workspace, 'param1', 'id'),
- 0,
- );
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'param1',
- 'Expected the params field to match the name of the new param',
- );
- });
-
- test('moving a parameter in the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- const param2 = new ObservableParameterModel(
- this.workspace,
- 'param2',
- 'id2',
- );
- procModel.insertParameter(param1, 0);
- procModel.insertParameter(param2, 1);
-
- procModel.deleteParameter(1);
- procModel.insertParameter(param2, 0);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the first param input to exist',
- );
- assert.isNotNull(
- callBlock.getInput('ARG1'),
- 'Expected the second param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'param2',
- 'Expected the first params field to match the name of the param',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME1'),
- 'param1',
- 'Expected the second params field to match the name of the param',
- );
- });
-
- test('moving a parameter in the data model moves input blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- const param2 = new ObservableParameterModel(
- this.workspace,
- 'param2',
- 'id2',
- );
- procModel.insertParameter(param1, 0);
- procModel.insertParameter(param2, 1);
- const rowBlock1 = this.workspace.newBlock('row_block');
- const rowBlock2 = this.workspace.newBlock('row_block');
- callBlock
- .getInput('ARG0')
- .connection.connect(rowBlock1.outputConnection);
- callBlock
- .getInput('ARG1')
- .connection.connect(rowBlock2.outputConnection);
- globalThis.clock.runAll();
-
- procModel.deleteParameter(1);
- procModel.insertParameter(param2, 0);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the first param input to exist',
- );
- assert.equal(
- callBlock.getInputTargetBlock('ARG0'),
- rowBlock2,
- 'Expected the second row block to be attached to the ' +
- 'first input',
- );
- assert.isNotNull(
- callBlock.getInput('ARG1'),
- 'Expected the second param input to exist',
- );
- assert.equal(
- callBlock.getInputTargetBlock('ARG1'),
- rowBlock1,
- 'Expected the first row block to be attached to the ' +
- 'second input',
- );
- });
-
- test('deleting a parameter from the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- const param2 = new ObservableParameterModel(
- this.workspace,
- 'param2',
- 'id2',
- );
- procModel.insertParameter(param1, 0);
- procModel.insertParameter(param2, 1);
-
- procModel.deleteParameter(0);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the first param input to exist',
- );
- assert.isNull(
- callBlock.getInput('ARG1'),
- 'Expected the second param input to not exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'param2',
- 'Expected the first params field to match the name of ' + 'the param',
- );
- });
-
- test('renaming a procedure parameter in the data model updates blocks', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const procModel = defBlock.getProcedureModel();
- const param1 = new ObservableParameterModel(
- this.workspace,
- 'param1',
- 'id1',
- );
- procModel.insertParameter(param1, 0);
-
- param1.setName('new name');
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'new name',
- 'Expected the params field to match the new name of the param',
- );
- });
- });
- });
-
- suite('renaming procedures', function () {
- test('callers are updated to have the new name', function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
-
- defBlock.setFieldValue('new name', 'NAME');
-
- assert.equal(
- callBlock.getFieldValue('NAME'),
- 'new name',
- 'Expected the procedure block to be renamed',
- );
- });
-
- test(
- 'setting an illegal name results in both the ' +
- 'procedure and the caller getting the legal name',
- function () {
- createProcDefBlock(this.workspace, undefined, undefined, 'procA');
- const defBlockB = createProcDefBlock(
- this.workspace,
- undefined,
- undefined,
- 'procB',
- );
- const callBlockB = createProcCallBlock(
- this.workspace,
- undefined,
- 'procB',
- );
-
- defBlockB.setFieldValue('procA', 'NAME');
-
- assert.notEqual(
- defBlockB.getFieldValue('NAME'),
- 'procA',
- 'Expected the procedure def block to have a legal name',
- );
- assert.notEqual(
- callBlockB.getFieldValue('NAME'),
- 'procA',
- 'Expected the procedure call block to have a legal name',
- );
- },
- );
- });
-
- suite('adding procedure parameters', function () {
- test('adding a parameter to the procedure updates procedure defs', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('param1'),
- 'Expected the params field to contain the name of the new param',
- );
- });
-
- test('adding a parameter to the procedure updates procedure callers', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'param1',
- 'Expected the params field to match the name of the new param',
- );
- });
- });
-
- suite('deleting procedure parameters', function () {
- test('deleting a parameter from the procedure updates procedure defs', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.dispose();
- defBlock.compose(containerBlock);
-
- assert.isFalse(
- defBlock.getFieldValue('PARAMS').includes('param1'),
- 'Expected the params field to not contain the name of the ' +
- 'new param',
- );
- });
-
- test('deleting a parameter from the procedure updates procedure callers', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.checkAndDelete();
- defBlock.compose(containerBlock);
-
- assert.isNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to not exist',
- );
- });
- });
-
- suite('renaming procedure parameters', function () {
- test('defs are updated for parameter renames', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.setFieldValue('new name', 'NAME');
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('new name'),
- 'Expected the params field to contain the new name of the param',
- );
- });
-
- test('defs are updated for parameter renames when two params exist', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock1 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock1.setFieldValue('param1', 'NAME');
- const paramBlock2 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock2.setFieldValue('param2', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock1.previousConnection);
- paramBlock1.nextConnection.connect(paramBlock2.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock1.setFieldValue('new name', 'NAME');
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('new name'),
- 'Expected the params field to contain the new name of the param',
- );
- });
-
- test('callers are updated for parameter renames', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.setFieldValue('new name', 'NAME');
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'new name',
- 'Expected the params field to match the name of the new param',
- );
- });
-
- test('variables associated with procedure parameters are not renamed', function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- paramBlock.setFieldValue('param2', 'NAME');
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- this.workspace.getVariableMap().getVariable('param1', ''),
- 'Expected the old variable to continue to exist',
- );
- });
-
- test(
- 'renaming a variable associated with a parameter updates ' +
- 'procedure defs',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace.getVariableMap().renameVariable(variable, 'new name');
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('new name'),
- 'Expected the params field to contain the new name of the param',
- );
- },
- );
-
- // TODO(blockly/#): We can't open mutators in node (even with JSDOM) due to
- // failing instanceof checks. So we can't currently test this.
- test.skip(
- 'renaming a variable associated with a parameter updates ' +
- 'mutator parameters',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace.getVariableMap().renameVariable(variable, 'new name');
-
- assert.equal(
- paramBlock.getFieldValue('NAME'),
- 'new name',
- 'Expected the params field to contain the new name of the param',
- );
- },
- );
-
- test(
- 'renaming a variable associated with a parameter updates ' +
- 'procedure callers',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace.getVariableMap().renameVariable(variable, 'new name');
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'new name',
- 'Expected the params field to match the name of the new param',
- );
- },
- );
-
- test(
- 'coalescing a variable associated with a parameter updates ' +
- 'procedure defs',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace
- .getVariableMap()
- .renameVariable(variable, 'preCreatedVar');
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('preCreatedVar'),
- 'Expected the params field to contain the new name of the param',
- );
- },
- );
-
- // TODO(blockly/#): We can't open mutators in node (even with JSDOM) due to
- // failing instanceof checks. So we can't currently test this.
- test.skip(
- 'coalescing a variable associated with a parameter updates ' +
- 'mutator parameters',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace
- .getVariableMap()
- .renameVariable(variable, 'preCreatedVar');
-
- assert.equal(
- paramBlock.getFieldValue('NAME'),
- 'preCreatedVar',
- 'Expected the params field to contain the new name of the param',
- );
- },
- );
-
- test(
- 'coalescing a variable associated with a parameter updates ' +
- 'procedure callers',
- function () {
- // Create a stack of container, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock.setFieldValue('param1', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock.previousConnection);
- defBlock.compose(containerBlock);
-
- const variable = this.workspace
- .getVariableMap()
- .getVariable('param1', '');
- this.workspace
- .getVariableMap()
- .renameVariable(variable, 'preCreatedVar');
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'preCreatedVar',
- 'Expected the params field to match the name of the new param',
- );
- },
- );
-
- test.skip(
- 'renaming a variable such that you get a parameter ' +
- 'conflict does... something!',
- function () {},
- );
- });
-
- suite('reordering procedure parameters', function () {
- test('reordering procedure parameters updates procedure blocks', function () {
- // Create a stack of container, parameter, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock1 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock1.setFieldValue('param1', 'NAME');
- const paramBlock2 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock2.setFieldValue('param2', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock1.previousConnection);
- paramBlock1.nextConnection.connect(paramBlock2.previousConnection);
- defBlock.compose(containerBlock);
-
- // Reorder the parameters.
- paramBlock2.previousConnection.disconnect();
- paramBlock1.previousConnection.disconnect();
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock2.previousConnection);
- paramBlock2.nextConnection.connect(paramBlock1.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- defBlock.getField('PARAMS'),
- 'Expected the params field to exist',
- );
- assert.isTrue(
- defBlock.getFieldValue('PARAMS').includes('param2, param1'),
- 'Expected the params field order to match the parameter order',
- );
- });
-
- test('reordering procedure parameters updates caller blocks', function () {
- // Create a stack of container, parameter, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock1 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock1.setFieldValue('param1', 'NAME');
- const paramBlock2 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock2.setFieldValue('param2', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock1.previousConnection);
- paramBlock1.nextConnection.connect(paramBlock2.previousConnection);
- defBlock.compose(containerBlock);
-
- // Reorder the parameters.
- paramBlock2.previousConnection.disconnect();
- paramBlock1.previousConnection.disconnect();
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock2.previousConnection);
- paramBlock2.nextConnection.connect(paramBlock1.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.isNotNull(
- callBlock.getInput('ARG0'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME0'),
- 'param2',
- 'Expected the params field to match the name of the second param',
- );
- assert.isNotNull(
- callBlock.getInput('ARG1'),
- 'Expected the param input to exist',
- );
- assert.equal(
- callBlock.getFieldValue('ARGNAME1'),
- 'param1',
- 'Expected the params field to match the name of the first param',
- );
- });
-
- test(
- 'reordering procedure parameters reorders the blocks ' +
- 'attached to caller inputs',
- function () {
- // Create a stack of container, parameter, parameter.
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- const containerBlock = this.workspace.newBlock(
- 'procedures_mutatorcontainer',
- );
- const paramBlock1 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock1.setFieldValue('param1', 'NAME');
- const paramBlock2 = this.workspace.newBlock('procedures_mutatorarg');
- paramBlock2.setFieldValue('param2', 'NAME');
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock1.previousConnection);
- paramBlock1.nextConnection.connect(paramBlock2.previousConnection);
- defBlock.compose(containerBlock);
-
- // Add args to the parameter inputs on the caller.
- const block1 = this.workspace.newBlock('text');
- const block2 = this.workspace.newBlock('text');
- callBlock.getInput('ARG0').connection.connect(block1.outputConnection);
- callBlock.getInput('ARG1').connection.connect(block2.outputConnection);
- globalThis.clock.runAll();
-
- // Reorder the parameters.
- paramBlock2.previousConnection.disconnect();
- paramBlock1.previousConnection.disconnect();
- defBlock.compose(containerBlock);
- containerBlock
- .getInput('STACK')
- .connection.connect(paramBlock2.previousConnection);
- paramBlock2.nextConnection.connect(paramBlock1.previousConnection);
- defBlock.compose(containerBlock);
-
- assert.equal(
- callBlock.getInputTargetBlock('ARG0'),
- block2,
- 'Expected the second block to be in the first slot',
- );
- assert.equal(
- callBlock.getInputTargetBlock('ARG1'),
- block1,
- 'Expected the first block to be in the second slot',
- );
- },
- );
- });
-
- suite('enabling and disabling procedure blocks', function () {
- test(
- 'if a procedure definition is disabled, the procedure caller ' +
- 'is also disabled',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
-
- defBlock.setDisabledReason(true);
- globalThis.clock.runAll();
-
- assert.isFalse(
- callBlock.isEnabled(),
- 'Expected the caller block to be disabled',
- );
- },
- );
-
- test(
- 'if a procedure definition is enabled, the procedure caller ' +
- 'is also enabled',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- defBlock.setDisabledReason(true);
- globalThis.clock.runAll();
-
- defBlock.setDisabledReason(false);
- globalThis.clock.runAll();
-
- assert.isTrue(
- callBlock.isEnabled(),
- 'Expected the caller block to be enabled',
- );
- },
- );
-
- test(
- 'if a procedure caller block was already disabled before ' +
- 'its definition was disabled, it is not reenabled',
- function () {
- this.workspace.options.disable = true;
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock = createProcCallBlock(this.workspace);
- globalThis.clock.runAll();
- callBlock.setDisabledReason(true);
- globalThis.clock.runAll();
- defBlock.setDisabledReason(true);
- globalThis.clock.runAll();
-
- defBlock.setDisabledReason(false);
- globalThis.clock.runAll();
-
- assert.isFalse(
- callBlock.isEnabled(),
- 'Expected the caller block to continue to be disabled',
- );
- },
- );
- });
-
- suite('creating procedure blocks', function () {
- test(
- 'when a procedure definition block is created, a create event for ' +
- 'its data model is fired',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procedure = defBlock.getProcedureModel();
- globalThis.clock.runAll();
-
- assertEventFiredShallow(
- this.eventSpy,
- ProcedureCreate,
- {
- procedure: procedure,
- },
- this.workspace.id,
- );
- },
- );
- });
-
- suite('deleting procedure blocks', function () {
- test(
- 'when the procedure definition block is deleted, all of its ' +
- 'associated callers are deleted as well',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock1 = createProcCallBlock(this.workspace);
- const callBlock2 = createProcCallBlock(this.workspace);
-
- defBlock.dispose();
- globalThis.clock.runAll();
-
- assert.isTrue(
- callBlock1.disposed,
- 'Expected the first caller to be disposed',
- );
- assert.isTrue(
- callBlock2.disposed,
- 'Expected the second caller to be disposed',
- );
- },
- );
-
- test(
- 'when a procedure definition block is deleted, deleting its callers ' +
- 'with arguments that call another procedure does not cause a crash',
- function () {
- // This test exercises the scenario reported in
- // https://github.com/RaspberryPiFoundation/blockly-samples/issues/2557
- Blockly.serialization.workspaces.load(
- {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- id: 'dosomething',
- extraState: {
- procedureId: 'dosomething_procmodel',
- },
- fields: {
- NAME: 'do something',
- },
- },
- {
- type: 'procedures_defreturn',
- id: 'dosomething2',
- extraState: {
- procedureId: 'dosomething2_procmodel',
- },
- fields: {
- NAME: 'do something2',
- },
- },
- {
- type: 'procedures_callnoreturn',
- id: 'call_dosomething',
- extraState: {
- name: 'do something',
- params: ['x'],
- },
- inputs: {
- ARG0: {
- block: {
- type: 'procedures_callreturn',
- id: 'call_dosomething2',
- extraState: {
- name: 'do something2',
- },
- },
- },
- },
- },
- ],
- },
- variables: [
- {
- name: 'x',
- id: 'x_var',
- },
- ],
- procedures: [
- {
- id: 'dosomething_procmodel',
- name: 'do something',
- returnTypes: null,
- parameters: [
- {
- id: 'x_param',
- name: 'x',
- },
- ],
- },
- {
- id: 'dosomething2_procmodel',
- name: 'do something2',
- returnTypes: [],
- },
- ],
- },
- this.workspace,
- );
-
- const defBlock = this.workspace.getBlockById('dosomething');
- // Should not cause an exception to be thrown.
- defBlock.dispose();
- globalThis.clock.runAll();
- },
- );
-
- test(
- 'when a procedure definition block is deleted, a delete event for ' +
- 'its data model is fired',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const procedure = defBlock.getProcedureModel();
-
- defBlock.dispose();
- globalThis.clock.runAll();
-
- assertEventFiredShallow(
- this.eventSpy,
- ProcedureDelete,
- {
- procedure: procedure,
- },
- this.workspace.id,
- );
- },
- );
-
- test(
- 'when the procedure definition block is deleted, all of its ' +
- 'associated callers are deleted, but the other blocks remain',
- function () {
- const defBlock = createProcDefBlock(this.workspace);
- const callBlock1 = createProcCallBlock(this.workspace);
- const ifBlock1 = this.workspace.newBlock('controls_if');
- const ifBlock2 = this.workspace.newBlock('controls_if');
-
- ifBlock1.nextConnection.connect(callBlock1.previousConnection);
- callBlock1.nextConnection.connect(ifBlock2.previousConnection);
-
- defBlock.dispose(true);
- globalThis.clock.runAll();
-
- assert.isTrue(
- callBlock1.disposed,
- 'Expected the first caller to be disposed',
- );
- assert.isFalse(
- ifBlock1.disposed,
- 'Expected the first if block 1 to be not be disposed',
- );
- assert.isFalse(
- ifBlock2.disposed,
- 'Expected the second if block 2 to be not be disposed',
- );
- },
- );
- });
-
- suite('caller blocks creating new def blocks', function () {
- setup(function () {
- this.TEST_VAR_ID = 'test-id';
- this.genUidStub = createGenUidStubWithReturns(this.TEST_VAR_ID);
- });
-
- teardown(function () {
- this.genUidStub.restore();
- });
-
- suite('xml', function () {
- test('callers that can find models do not create defs', function () {
- this.workspace
- .getProcedureMap()
- .add(new ObservableProcedureModel(this.workspace, 'do something'));
- Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(`
-
-
- `),
- this.workspace,
- );
- globalThis.clock.runAll();
- assert.equal(
- this.workspace.getTopBlocks().length,
- 1,
- 'Expected only the call block to exist',
- );
- });
-
- test('callers without defs create new defs', function () {
- const callBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(`
-
-
- `),
- this.workspace,
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(
- this.workspace.getBlocksByType('procedures_defreturn')[0],
- true,
- );
- assertCallBlockStructure(callBlock, [], [], 'do something');
- });
-
- test('callers without mutations create unnamed defs', function () {
- const callBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(
- ' ',
- ),
- this.workspace,
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(
- this.workspace.getBlocksByType('procedures_defreturn')[0],
- true,
- );
- assertCallBlockStructure(callBlock, [], [], 'unnamed');
- });
-
- test('callers with missing args create new defs', function () {
- const defBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(`
-
- do something
-
-
-
-
- `),
- this.workspace,
- );
- const callBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(
- '' +
- ' ' +
- ' ',
- ),
- this.workspace,
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(callBlock, [], [], 'do something2');
- });
-
- test('callers with mismatched args create new defs', function () {
- const defBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(`
-
- do something
-
-
-
-
- `),
- this.workspace,
- );
- const callBlock = Blockly.Xml.domToBlock(
- Blockly.utils.xml.textToDom(`
-
-
-
-
-
- `),
- this.workspace,
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(
- callBlock,
- ['y'],
- [this.TEST_VAR_ID],
- 'do something2',
- );
- });
-
- test('callers whose defs are deserialized later do not create defs', function () {
- Blockly.Xml.domToWorkspace(
- Blockly.utils.xml.textToDom(`
-
-
-
-
-
-
-
- do something
-
-
-
-
-
- `),
- this.workspace,
- );
- globalThis.clock.runAll();
- const defBlock = this.workspace.getBlocksByType(
- 'procedures_defreturn',
- )[0];
- const callBlock = this.workspace.getBlocksByType(
- 'procedures_callreturn',
- )[0];
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(callBlock, ['x'], ['arg'], 'do something');
- assert.equal(
- defBlock.getProcedureModel(),
- callBlock.getProcedureModel(),
- 'Expected the blocks to have the same procedure model',
- );
- });
- });
-
- suite('json', function () {
- test('callers that can find models do not create defs', function () {
- this.workspace
- .getProcedureMap()
- .add(new ObservableProcedureModel(this.workspace, 'do something'));
- Blockly.serialization.blocks.append(
- {
- type: 'procedures_callnoreturn',
- extraState: {
- name: 'do something',
- },
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- assert.equal(
- this.workspace.getTopBlocks().length,
- 1,
- 'Expected only the call block to exist',
- );
- });
-
- test('callers without defs create new defs', function () {
- const callBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_callreturn',
- extraState: {
- name: 'do something',
- },
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(
- this.workspace.getBlocksByType('procedures_defreturn')[0],
- true,
- );
- assertCallBlockStructure(callBlock, [], [], 'do something');
- });
-
- test('callers without extra state create unamed defs', function () {
- // recordUndo must be true to trigger change listener.
- const callBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_callreturn',
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(
- this.workspace.getBlocksByType('procedures_defreturn')[0],
- true,
- );
- assertCallBlockStructure(callBlock, [], [], 'unnamed');
- });
-
- test('callers with missing args create new defs', function () {
- const defBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_defreturn',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'arg',
- },
- ],
- },
- },
- this.workspace,
- );
- const callBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_callreturn',
- extraState: {
- name: 'do something',
- },
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(callBlock, [], [], 'do something2');
- });
-
- test('callers with mismatched args create new defs', function () {
- const defBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_defreturn',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'arg',
- },
- ],
- },
- },
- this.workspace,
- );
- const callBlock = Blockly.serialization.blocks.append(
- {
- type: 'procedures_callreturn',
- extraState: {
- name: 'do something',
- params: ['y'],
- },
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(
- callBlock,
- ['y'],
- [this.TEST_VAR_ID],
- 'do something2',
- );
- });
-
- test('callers whose defs are deserialized later do not create defs', function () {
- Blockly.serialization.workspaces.load(
- {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_callreturn',
- extraState: {
- params: ['x'],
- },
- },
- {
- type: 'procedures_defreturn',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'arg',
- },
- ],
- },
- },
- ],
- },
- },
- this.workspace,
- {recordUndo: true},
- );
- globalThis.clock.runAll();
- const defBlock = this.workspace.getBlocksByType(
- 'procedures_defreturn',
- )[0];
- const callBlock = this.workspace.getBlocksByType(
- 'procedures_callreturn',
- )[0];
- assertDefBlockStructure(defBlock, true, ['x'], ['arg']);
- assertCallBlockStructure(callBlock, ['x'], ['arg'], 'do something');
- assert.equal(
- defBlock.getProcedureModel(),
- callBlock.getProcedureModel(),
- 'Expected the blocks to have the same procedure model',
- );
- });
- });
- });
-
- suite('definition block context menu', function () {
- test('the context menu includes an option for creating the caller', function () {
- const def = Blockly.serialization.blocks.append(
- {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'test name',
- },
- },
- this.workspace,
- );
-
- const options = [];
- def.customContextMenu(options);
-
- assert.isTrue(
- options[0].text.includes('test name'),
- 'Expected the context menu to have an option to create ' + 'the caller',
- );
- });
-
- test('the context menu includes an option for each parameter', function () {
- const def = Blockly.serialization.blocks.append(
- {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'test name',
- },
- extraState: {
- params: [
- {
- name: 'testParam1',
- id: 'varId1',
- paramId: 'paramId1',
- },
- {
- name: 'testParam2',
- id: 'varId2',
- paramId: 'paramId2',
- },
- ],
- },
- },
- this.workspace,
- );
-
- const options = [];
- def.customContextMenu(options);
-
- assert.isTrue(
- options[1].text.includes('testParam1'),
- 'Expected the context menu to have an option to create the ' +
- 'first param',
- );
- assert.isTrue(
- options[2].text.includes('testParam2'),
- 'Expected the context menu to have an option to create the ' +
- 'second param',
- );
- });
- });
-
- suite('deserializing data models', function () {
- suite('return types', function () {
- test('procedure defs without returns have null return types', function () {
- const json = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'test name',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(json, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.isNull(
- procedureModel.getReturnTypes(),
- 'Expected the return types to be null',
- );
- });
-
- test('procedure defs with returns have array return types', function () {
- const json = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defreturn',
- fields: {
- NAME: 'test name',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(json, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.isArray(
- procedureModel.getReturnTypes(),
- 'Expected the return types to be an array',
- );
- });
- });
-
- suite('json', function () {
- test('procedure names get deserialized', function () {
- const json = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'test name',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(json, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.name,
- 'test name',
- 'Expected the name of the procedure model to equal the name ' +
- 'being deserialized.',
- );
- });
-
- test('procedure parameter names get deserialized', function () {
- const json = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'test name',
- },
- extraState: {
- params: [
- {
- id: 'test id 1',
- name: 'test name 1',
- },
- {
- id: 'test id 2',
- name: 'test name 2',
- },
- ],
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(json, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.getParameter(0).getName(),
- 'test name 1',
- 'Expected the name of the first parameter to equal the name ' +
- 'being deserialized.',
- );
- assert.equal(
- procedureModel.getParameter(1).getName(),
- 'test name 2',
- 'Expected the name of the second parameter to equal the name ' +
- 'being deserialized.',
- );
- });
-
- test('procedure variables get matching IDs', function () {
- const json = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- extraState: {
- params: [
- {
- name: 'test param name',
- id: 'test param id',
- },
- ],
- },
- fields: {
- NAME: 'test proc name',
- },
- },
- ],
- },
- variables: [
- {
- name: 'test param name',
- id: 'test param id',
- },
- ],
- };
- Blockly.serialization.workspaces.load(json, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.getParameter(0).getVariableModel().getId(),
- 'test param id',
- 'Expected the variable id to match the serialized param id',
- );
- });
- });
-
- suite('xml', function () {
- test('procedure names get deserialized', function () {
- const xml = Blockly.utils.xml.textToDom(
- `` +
- ` test name ` +
- ` `,
- );
- Blockly.Xml.domToBlock(xml, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.name,
- 'test name',
- 'Expected the name of the procedure model to equal the name ' +
- 'being deserialized.',
- );
- });
-
- test('procedure parameter names get deserialized', function () {
- const xml = Blockly.utils.xml.textToDom(
- `` +
- ` ` +
- ` ` +
- ` ` +
- ` ` +
- ` test name ` +
- ` `,
- );
- Blockly.Xml.domToBlock(xml, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.getParameter(0).getName(),
- 'test name 1',
- 'Expected the name of the first parameter to equal the name ' +
- 'being deserialized.',
- );
- assert.equal(
- procedureModel.getParameter(1).getName(),
- 'test name 2',
- 'Expected the name of the second parameter to equal the name ' +
- 'being deserialized.',
- );
- });
-
- test('procedure variables get matching IDs', function () {
- const xml = Blockly.utils.xml.textToDom(
- `` +
- ` ` +
- ` test param name ` +
- ` ` +
- ` ` +
- ` ` +
- ` ` +
- ` ` +
- ` test name ` +
- ` ` +
- ` `,
- );
- Blockly.Xml.domToWorkspace(xml, this.workspace);
- const procedureModel = this.workspace
- .getProcedureMap()
- .getProcedures()[0];
-
- assert.equal(
- procedureModel.getParameter(0).getVariableModel().getId(),
- 'test param id',
- 'Expected the variable id to match the serialized param id',
- );
- });
- });
- });
-
- suite('full workspace serialization test cases', function () {
- test('definitions with parameters are properly rendered', function () {
- Blockly.serialization.workspaces.load(
- {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'procedures_defnoreturn',
- extraState: {
- procedureId: 'procId',
- },
- fields: {
- NAME: 'do something',
- },
- },
- ],
- },
- procedures: [
- {
- id: 'procId',
- name: 'do something',
- returnTypes: null,
- parameters: [
- {
- id: 'paramId',
- name: 'x',
- },
- ],
- },
- ],
- variables: [
- {
- name: 'x',
- id: 'varId',
- },
- ],
- },
- this.workspace,
- );
- assertDefBlockStructure(
- this.workspace.getTopBlocks(false)[0],
- false,
- ['x'],
- ['varId'],
- );
- });
- });
-
- suite('getDefinition', function () {
- test('individual definitions are returned', function () {
- const defBlock = createProcDefBlock(
- this.workspace,
- false,
- [],
- 'proc name',
- );
- const def = Blockly.procedures.getDefinition('proc name', this.workspace);
- assert.equal(def, defBlock);
- });
-
- test('definitions of different procedures are not returned', function () {
- const defBlock1 = createProcDefBlock(
- this.workspace,
- false,
- [],
- 'proc name',
- );
- createProcDefBlock(this.workspace, false, [], 'other proc name');
- const def = Blockly.procedures.getDefinition('proc name', this.workspace);
- assert.equal(def, defBlock1);
- });
- });
-
- suite('getCallers', function () {
- test('individual callers are returned', function () {
- createProcDefBlock(this.workspace, false, [], 'proc name');
- const callBlock = createProcCallBlock(this.workspace, false, 'proc name');
- const callers = Blockly.procedures.getCallers(
- 'proc name',
- this.workspace,
- );
- assert.equal(callers.length, 1);
- assert.equal(callers[0], callBlock);
- });
-
- test('multiple callers of the same procedure are returned', function () {
- createProcDefBlock(this.workspace, false, [], 'proc name');
- const callBlock1 = createProcCallBlock(
- this.workspace,
- false,
- 'proc name',
- );
- const callBlock2 = createProcCallBlock(
- this.workspace,
- false,
- 'proc name',
- );
- const callers = Blockly.procedures.getCallers(
- 'proc name',
- this.workspace,
- );
- assert.equal(callers.length, 2);
- assert.includeMembers(callers, [callBlock1, callBlock2]);
- });
-
- test('callers of different procedures are not returned', function () {
- createProcDefBlock(this.workspace, false, [], 'proc name1');
- const callBlock1 = createProcCallBlock(
- this.workspace,
- false,
- 'proc name1',
- );
- createProcDefBlock(this.workspace, false, [], 'proc name2');
- createProcCallBlock(this.workspace, false, 'proc name2');
- const callers = Blockly.procedures.getCallers(
- 'proc name1',
- this.workspace,
- );
- assert.equal(callers.length, 1);
- assert.equal(callers[0], callBlock1);
- });
- });
-
- const xmlTestCases = [
- {
- title: 'XML - Minimal definition',
- xml: ' ',
- expectedXml:
- '\n' +
- ' unnamed \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false);
- },
- },
- {
- title: 'XML - Common definition',
- xml:
- '' +
- ' do something ' +
- ' ',
- expectedXml:
- '\n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false);
- },
- },
- {
- title: 'XML - With vars definition',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false, ['x', 'y'], ['arg1', 'arg2']);
- },
- },
- {
- title: 'XML - With pre-created vars definition',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(
- block,
- false,
- ['preCreatedVar'],
- ['preCreatedVarId'],
- );
- },
- },
- {
- title: 'XML - No statements definition',
- xml:
- '\n' +
- ' \n' +
- ' do something \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' do something \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, true, [], [], false);
- },
- },
- {
- title: 'XML - Minimal caller',
- xml: ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'XML - Common caller',
- xml:
- '\n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'XML - With pre-created vars caller',
- xml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- expectedXml:
- '\n' +
- ' \n' +
- ' \n' +
- ' \n' +
- ' ',
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block, ['preCreatedVar'], ['preCreatedVarId']);
- },
- },
- ];
- testHelpers.runSerializationTestSuite(xmlTestCases, Blockly);
-
- const jsonTestCases = [
- {
- title: 'JSON - Minimal definition',
- json: {
- type: 'procedures_defnoreturn',
- },
- expectedJson: {
- type: 'procedures_defnoreturn',
- id: '1',
- fields: {
- NAME: 'unnamed',
- },
- extraState: {
- procedureId: '1',
- fullSerialization: true,
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false);
- },
- },
- {
- title: 'JSON - Common definition',
- json: {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'do something',
- },
- },
- expectedJson: {
- type: 'procedures_defnoreturn',
- id: '1',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- procedureId: '1',
- fullSerialization: true,
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false);
- },
- },
- {
- title: 'JSON - With vars definition',
- json: {
- type: 'procedures_defnoreturn',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- params: [
- {
- name: 'x',
- id: 'arg1',
- },
- {
- name: 'y',
- id: 'arg2',
- },
- ],
- },
- },
- expectedJson: {
- type: 'procedures_defnoreturn',
- id: '1',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- procedureId: '1',
- fullSerialization: true,
- params: [
- {
- name: 'x',
- id: 'arg1',
- paramId: '1',
- },
- {
- name: 'y',
- id: 'arg2',
- paramId: '1',
- },
- ],
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, false, ['x', 'y'], ['arg1', 'arg2']);
- },
- },
- {
- title: 'JSON - With pre-created vars definition',
- json: {
- type: 'procedures_defnoreturn',
- extraState: {
- params: [
- {
- name: 'preCreatedVar',
- id: 'preCreatedVarId',
- },
- ],
- },
- fields: {
- NAME: 'do something',
- },
- },
- expectedJson: {
- type: 'procedures_defnoreturn',
- id: '1',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- procedureId: '1',
- fullSerialization: true,
- params: [
- {
- name: 'preCreatedVar',
- id: 'preCreatedVarId',
- paramId: '1',
- },
- ],
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(
- block,
- false,
- ['preCreatedVar'],
- ['preCreatedVarId'],
- );
- },
- },
- {
- title: 'JSON - No statements definition',
- json: {
- type: 'procedures_defreturn',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- hasStatements: false,
- },
- },
- expectedJson: {
- type: 'procedures_defreturn',
- id: '1',
- fields: {
- NAME: 'do something',
- },
- extraState: {
- procedureId: '1',
- fullSerialization: true,
- hasStatements: false,
- },
- },
- assertBlockStructure: (block) => {
- assertDefBlockStructure(block, true, [], [], false);
- },
- },
- {
- title: 'JSON - Minimal caller',
- json: {
- type: 'procedures_callnoreturn',
- },
- expectedJson: {
- type: 'procedures_callnoreturn',
- id: '1',
- extraState: {
- name: 'unnamed',
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'JSON - Common caller',
- json: {
- type: 'procedures_callnoreturn',
- extraState: {
- name: 'do something',
- },
- },
- expectedJson: {
- type: 'procedures_callnoreturn',
- id: '1',
- extraState: {
- name: 'do something',
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block);
- },
- },
- {
- title: 'JSON - With pre-created vars caller',
- json: {
- type: 'procedures_callnoreturn',
- extraState: {
- name: 'do something',
- params: ['preCreatedVar'],
- },
- },
- expectedJson: {
- type: 'procedures_callnoreturn',
- id: '1',
- extraState: {
- name: 'do something',
- params: ['preCreatedVar'],
- },
- },
- assertBlockStructure: (block) => {
- assertCallBlockStructure(block, ['preCreatedVar'], ['preCreatedVarId']);
- },
- },
- ];
- testHelpers.runSerializationTestSuite(jsonTestCases, Blockly);
-});
diff --git a/plugins/block-shareable-procedures/test/procedure_test_helpers.js b/plugins/block-shareable-procedures/test/procedure_test_helpers.js
deleted file mode 100644
index 1b574e0c8..000000000
--- a/plugins/block-shareable-procedures/test/procedure_test_helpers.js
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-'use strict';
-
-const Blockly = require('blockly/core');
-const chai = require('chai');
-const assert = chai.assert;
-const sinon = require('sinon');
-
-/**
- * Creates stub for Blockly.utils.idGenerator.genUid that returns the
- * provided id or ids.
- * Recommended to also assert that the stub is called the expected number of
- * times.
- * @param {string|!Array} returnIds The return values to use for the
- * created stub. If a single value is passed, then the stub always returns
- * that value.
- * @returns {!sinon.SinonStub} The created stub.
- */
-export function createGenUidStubWithReturns(returnIds) {
- const stub = sinon.stub(Blockly.utils.idGenerator.TEST_ONLY, 'genUid');
- if (Array.isArray(returnIds)) {
- for (let i = 0; i < returnIds.length; i++) {
- stub.onCall(i).returns(returnIds[i]);
- }
- } else {
- stub.returns(returnIds);
- }
- return stub;
-}
-
-/**
- * Asserts that the procedure definition or call block has the expected var
- * models.
- * @param {!Blockly.Block} block The procedure definition or call block to
- * check.
- * @param {!Array} varIds An array of variable ids.
- */
-export function assertBlockVarModels(block, varIds) {
- const expectedVarModels = [];
- for (let i = 0; i < varIds.length; i++) {
- expectedVarModels.push(
- block.workspace.getVariableMap().getVariableById(varIds[i]),
- );
- }
- assert.sameDeepOrderedMembers(block.getVarModels(), expectedVarModels);
-}
-
-/**
- * Asserts that the procedure call block has the expected arguments.
- * @param {!Blockly.Block} callBlock The procedure definition block.
- * @param {Array=} args An array of argument names.
- */
-export function assertCallBlockArgsStructure(callBlock, args) {
- // inputList also contains "TOPROW"
- assert.equal(
- callBlock.inputList.length - 1,
- args.length,
- 'call block has the expected number of args',
- );
-
- for (let i = 0; i < args.length; i++) {
- const expectedName = args[i];
- const callInput = callBlock.inputList[i + 1];
- assert.equal(callInput.type, Blockly.ConnectionType.INPUT_VALUE);
- assert.equal(callInput.name, 'ARG' + i);
- assert.equal(
- callInput.fieldRow[0].getValue(),
- expectedName,
- 'Call block consts did not match expected.',
- );
- }
- assert.sameOrderedMembers(callBlock.getVars(), args);
-}
-
-/**
- * Asserts that the procedure definition block has the expected inputs and
- * fields.
- * @param {!Blockly.Block} defBlock The procedure definition block.
- * @param {boolean=} hasReturn If we expect the procedure def to have a return
- * input or not.
- * @param {Array=} args An array of argument names.
- * @param {Array=} varIds An array of variable ids.
- * @param {boolean=} hasStatements If we expect the procedure def to have a
- * statement input or not.
- */
-export function assertDefBlockStructure(
- defBlock,
- hasReturn = false,
- args = [],
- varIds = [],
- hasStatements = true,
-) {
- if (hasStatements) {
- assert.isNotNull(
- defBlock.getInput('STACK'),
- 'Def block should have STACK input',
- );
- } else {
- assert.isNull(
- defBlock.getInput('STACK'),
- 'Def block should not have STACK input',
- );
- }
- if (hasReturn) {
- assert.isNotNull(
- defBlock.getInput('RETURN'),
- 'Def block should have RETURN input',
- );
- } else {
- assert.isNull(
- defBlock.getInput('RETURN'),
- 'Def block should not have RETURN input',
- );
- }
- if (args.length) {
- assert.include(
- defBlock.toString(),
- 'with',
- 'Def block string should include "with"',
- );
- } else {
- assert.notInclude(
- defBlock.toString(),
- 'with',
- 'Def block string should not include "with"',
- );
- }
-
- assert.sameOrderedMembers(defBlock.getVars(), args);
- assertBlockVarModels(defBlock, varIds);
-}
-
-/**
- * Asserts that the procedure call block has the expected inputs and
- * fields.
- * @param {!Blockly.Block} callBlock The procedure call block.
- * @param {Array=} args An array of argument names.
- * @param {Array=} varIds An array of variable ids.
- * @param {string=} name The name we expect the caller to have.
- */
-export function assertCallBlockStructure(
- callBlock,
- args = [],
- varIds = [],
- name = undefined,
-) {
- if (args.length) {
- assert.include(callBlock.toString(), 'with');
- } else {
- assert.notInclude(callBlock.toString(), 'with');
- }
-
- assertCallBlockArgsStructure(callBlock, args);
- assertBlockVarModels(callBlock, varIds);
- if (name !== undefined) {
- assert.equal(callBlock.getFieldValue('NAME'), name);
- }
-}
-
-/**
- * Creates procedure definition block using domToBlock call.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- * @param {boolean=} hasReturn Whether the procedure definition should have
- * return.
- * @param {Array=} args An array of argument names.
- * @param {string=} name The name of the def block (defaults to 'proc name').
- * @returns {Blockly.Block} The created block.
- */
-export function createProcDefBlock(
- workspace,
- hasReturn = false,
- args = [],
- name = 'proc name',
-) {
- return Blockly.serialization.blocks.append(
- {
- type: hasReturn ? 'procedures_defreturn' : 'procedures_defnoreturn',
- fields: {
- NAME: name,
- },
- extraState: {
- params: args.map((a) => ({name: a})),
- },
- },
- workspace,
- );
-}
-
-/**
- * Creates procedure call block using domToBlock call.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- * @param {boolean=} hasReturn Whether the corresponding procedure definition
- * has return.
- * @param {string=} name The name of the caller block
- * (defaults to 'proc name').
- * @returns {Blockly.Block} The created block.
- */
-export function createProcCallBlock(
- workspace,
- hasReturn = false,
- name = 'proc name',
-) {
- return Blockly.serialization.blocks.append(
- {
- type: hasReturn ? 'procedures_callreturn' : 'procedures_callnoreturn',
- extraState: {
- name: name,
- },
- },
- workspace,
- );
-}
diff --git a/plugins/block-shareable-procedures/tsconfig.json b/plugins/block-shareable-procedures/tsconfig.json
deleted file mode 100644
index b4bc95bc1..000000000
--- a/plugins/block-shareable-procedures/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": false
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/block-test/CHANGELOG.md b/plugins/block-test/CHANGELOG.md
deleted file mode 100644
index de6888d52..000000000
--- a/plugins/block-test/CHANGELOG.md
+++ /dev/null
@@ -1,536 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/block-test
-
-
-
-
-
-## [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/plugins/block-test/README.md b/plugins/block-test/README.md
deleted file mode 100644
index d97290898..000000000
--- a/plugins/block-test/README.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# @blockly/block-test [](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/plugins/block-test/package.json b/plugins/block-test/package.json
deleted file mode 100644
index c3ec58375..000000000
--- a/plugins/block-test/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "@blockly/block-test",
- "version": "13.2.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.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/block-test/src/align.js b/plugins/block-test/src/align.js
deleted file mode 100644
index 235728ca4..000000000
--- a/plugins/block-test/src/align.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * @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/plugins/block-test/src/basic.js b/plugins/block-test/src/basic.js
deleted file mode 100644
index 68d093125..000000000
--- a/plugins/block-test/src/basic.js
+++ /dev/null
@@ -1,219 +0,0 @@
-/**
- * @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/plugins/block-test/src/chameleon.js b/plugins/block-test/src/chameleon.js
deleted file mode 100644
index 00754aab8..000000000
--- a/plugins/block-test/src/chameleon.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @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/plugins/block-test/src/connections/index.js b/plugins/block-test/src/connections/index.js
deleted file mode 100644
index 7e9610930..000000000
--- a/plugins/block-test/src/connections/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * @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/plugins/block-test/src/connections/row.js b/plugins/block-test/src/connections/row.js
deleted file mode 100644
index 8f879c325..000000000
--- a/plugins/block-test/src/connections/row.js
+++ /dev/null
@@ -1,290 +0,0 @@
-/**
- * @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/plugins/block-test/src/connections/stack.js b/plugins/block-test/src/connections/stack.js
deleted file mode 100644
index d19edae98..000000000
--- a/plugins/block-test/src/connections/stack.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * @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/plugins/block-test/src/connections/statement.js b/plugins/block-test/src/connections/statement.js
deleted file mode 100644
index 603c52f18..000000000
--- a/plugins/block-test/src/connections/statement.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * @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/plugins/block-test/src/drag.js b/plugins/block-test/src/drag.js
deleted file mode 100644
index 1eac79eee..000000000
--- a/plugins/block-test/src/drag.js
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/defaults.js b/plugins/block-test/src/fields/defaults.js
deleted file mode 100644
index cf2a9bd91..000000000
--- a/plugins/block-test/src/fields/defaults.js
+++ /dev/null
@@ -1,281 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/dropdowns.js b/plugins/block-test/src/fields/dropdowns.js
deleted file mode 100644
index 723bbebf6..000000000
--- a/plugins/block-test/src/fields/dropdowns.js
+++ /dev/null
@@ -1,591 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/emojis.js b/plugins/block-test/src/fields/emojis.js
deleted file mode 100644
index fc4ae83f7..000000000
--- a/plugins/block-test/src/fields/emojis.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/images.js b/plugins/block-test/src/fields/images.js
deleted file mode 100644
index 607b8f940..000000000
--- a/plugins/block-test/src/fields/images.js
+++ /dev/null
@@ -1,281 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/index.js b/plugins/block-test/src/fields/index.js
deleted file mode 100644
index 259058e35..000000000
--- a/plugins/block-test/src/fields/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/numbers.js b/plugins/block-test/src/fields/numbers.js
deleted file mode 100644
index fd7d0b412..000000000
--- a/plugins/block-test/src/fields/numbers.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * @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/plugins/block-test/src/fields/validators.js b/plugins/block-test/src/fields/validators.js
deleted file mode 100644
index a0c155fb4..000000000
--- a/plugins/block-test/src/fields/validators.js
+++ /dev/null
@@ -1,577 +0,0 @@
-/**
- * @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/plugins/block-test/src/index.js b/plugins/block-test/src/index.js
deleted file mode 100644
index 4b0771834..000000000
--- a/plugins/block-test/src/index.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * @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/plugins/block-test/src/mutators.js b/plugins/block-test/src/mutators.js
deleted file mode 100644
index 76316f9cc..000000000
--- a/plugins/block-test/src/mutators.js
+++ /dev/null
@@ -1,257 +0,0 @@
-/**
- * @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/plugins/block-test/src/serialization/blocks.js b/plugins/block-test/src/serialization/blocks.js
deleted file mode 100644
index bb7d6a0ae..000000000
--- a/plugins/block-test/src/serialization/blocks.js
+++ /dev/null
@@ -1,112 +0,0 @@
-// @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/plugins/block-test/src/serialization/category.js b/plugins/block-test/src/serialization/category.js
deleted file mode 100644
index 776f1bd89..000000000
--- a/plugins/block-test/src/serialization/category.js
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * @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/plugins/block-test/src/serialization/fields.js b/plugins/block-test/src/serialization/fields.js
deleted file mode 100644
index 0c687225c..000000000
--- a/plugins/block-test/src/serialization/fields.js
+++ /dev/null
@@ -1,201 +0,0 @@
-/**
- * @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/plugins/block-test/src/style.js b/plugins/block-test/src/style.js
deleted file mode 100644
index 06c3715a6..000000000
--- a/plugins/block-test/src/style.js
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * @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/plugins/block-test/test/index.html b/plugins/block-test/test/index.html
deleted file mode 100644
index 8d4238a20..000000000
--- a/plugins/block-test/test/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- Blockly Test Blocks
-
-
-
-
-
-
-
-
diff --git a/plugins/block-test/test/index.js b/plugins/block-test/test/index.js
deleted file mode 100644
index 2f7e56754..000000000
--- a/plugins/block-test/test/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * @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/plugins/content-highlight/CHANGELOG.md b/plugins/content-highlight/CHANGELOG.md
deleted file mode 100644
index 630e89852..000000000
--- a/plugins/content-highlight/CHANGELOG.md
+++ /dev/null
@@ -1,687 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [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)
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.8...@blockly/workspace-content-highlight@6.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.7...@blockly/workspace-content-highlight@6.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.6...@blockly/workspace-content-highlight@6.0.7) (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))
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.5...@blockly/workspace-content-highlight@6.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.4...@blockly/workspace-content-highlight@6.0.5) (2025-12-19)
-
-
-### Bug Fixes
-
-* handle comment moves and resizes in content-highlight ([#2653](https://github.com/google/blockly-samples/issues/2653)) ([031f351](https://github.com/google/blockly-samples/commit/031f351c295c60c5df1db7e9136c35b7e72661fd))
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.3...@blockly/workspace-content-highlight@6.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.2...@blockly/workspace-content-highlight@6.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.1...@blockly/workspace-content-highlight@6.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@6.0.0...@blockly/workspace-content-highlight@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.17...@blockly/workspace-content-highlight@6.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))
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.16...@blockly/workspace-content-highlight@5.0.17) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.15...@blockly/workspace-content-highlight@5.0.16) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.14...@blockly/workspace-content-highlight@5.0.15) (2025-02-20)
-
-
-### Bug Fixes
-
-* update content highlight when undoing the deletion of blocks. ([#2487](https://github.com/google/blockly-samples/issues/2487)) ([b216e9e](https://github.com/google/blockly-samples/commit/b216e9eeaf84e5f51af2bc72b8b15a40c7137697))
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.13...@blockly/workspace-content-highlight@5.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.12...@blockly/workspace-content-highlight@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.11...@blockly/workspace-content-highlight@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.10...@blockly/workspace-content-highlight@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.9...@blockly/workspace-content-highlight@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.8...@blockly/workspace-content-highlight@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.7...@blockly/workspace-content-highlight@5.0.8) (2024-08-22)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.6...@blockly/workspace-content-highlight@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.5...@blockly/workspace-content-highlight@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.4...@blockly/workspace-content-highlight@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.3...@blockly/workspace-content-highlight@5.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.2...@blockly/workspace-content-highlight@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.1...@blockly/workspace-content-highlight@5.0.2) (2024-06-06)
-
-
-### Bug Fixes
-
-* Update content highlight when workspace comment is moved. ([#2381](https://github.com/google/blockly-samples/issues/2381)) ([f769849](https://github.com/google/blockly-samples/commit/f769849a01799f38245134587311d244f731d1a1))
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@5.0.0...@blockly/workspace-content-highlight@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.17...@blockly/workspace-content-highlight@5.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)
-* make content highlight build with v11 beta ([#2168](https://github.com/google/blockly-samples/issues/2168)) ([2596711](https://github.com/google/blockly-samples/commit/25967118219142281db52a16299c4a6c5795ff28))
-
-
-
-## [4.0.17](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.16...@blockly/workspace-content-highlight@4.0.17) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.16](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.15...@blockly/workspace-content-highlight@4.0.16) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.15](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.14...@blockly/workspace-content-highlight@4.0.15) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.14](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.13...@blockly/workspace-content-highlight@4.0.14) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.13](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.12...@blockly/workspace-content-highlight@4.0.13) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.12](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.11...@blockly/workspace-content-highlight@4.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.11](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.10...@blockly/workspace-content-highlight@4.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.9...@blockly/workspace-content-highlight@4.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.8...@blockly/workspace-content-highlight@4.0.9) (2023-11-23)
-
-
-### Bug Fixes
-
-* enables strict mode for content-highlight ([#2076](https://github.com/google/blockly-samples/issues/2076)) ([cc4e02e](https://github.com/google/blockly-samples/commit/cc4e02e1962c8ee6b7f40c2bfd55f090ccb754ae))
-
-
-
-## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.7...@blockly/workspace-content-highlight@4.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.6...@blockly/workspace-content-highlight@4.0.7) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.5...@blockly/workspace-content-highlight@4.0.6) (2023-10-30)
-
-
-### Bug Fixes
-
-* [#1898](https://github.com/google/blockly-samples/issues/1898) publish types for content-highlight ([#1949](https://github.com/google/blockly-samples/issues/1949)) ([b049389](https://github.com/google/blockly-samples/commit/b049389a35a80979776207a5d967ab6eb49327e3))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.4...@blockly/workspace-content-highlight@4.0.5) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.3...@blockly/workspace-content-highlight@4.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.2...@blockly/workspace-content-highlight@4.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.1...@blockly/workspace-content-highlight@4.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@4.0.0...@blockly/workspace-content-highlight@4.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@3.0.1...@blockly/workspace-content-highlight@4.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@3.0.0...@blockly/workspace-content-highlight@3.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.17...@blockly/workspace-content-highlight@3.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))
-
-
-
-## [2.0.17](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.16...@blockly/workspace-content-highlight@2.0.17) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.16](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.15...@blockly/workspace-content-highlight@2.0.16) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.15](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.14...@blockly/workspace-content-highlight@2.0.15) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.14](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.13...@blockly/workspace-content-highlight@2.0.14) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.13](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.12...@blockly/workspace-content-highlight@2.0.13) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.12](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.11...@blockly/workspace-content-highlight@2.0.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.11](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.10...@blockly/workspace-content-highlight@2.0.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.10](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.9...@blockly/workspace-content-highlight@2.0.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.9](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.8...@blockly/workspace-content-highlight@2.0.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.8](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.7...@blockly/workspace-content-highlight@2.0.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.7](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.6...@blockly/workspace-content-highlight@2.0.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.6](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.5...@blockly/workspace-content-highlight@2.0.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.4...@blockly/workspace-content-highlight@2.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.3...@blockly/workspace-content-highlight@2.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.2...@blockly/workspace-content-highlight@2.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.1...@blockly/workspace-content-highlight@2.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@2.0.0...@blockly/workspace-content-highlight@2.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/workspace-content-highlight@1.0.31...@blockly/workspace-content-highlight@2.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* references to deprecated functions in v9 ([#1313](https://github.com/google/blockly-samples/issues/1313)) ([cb2e679](https://github.com/google/blockly-samples/commit/cb2e67987e0b62a77c26adc660cc6ade1ba67954))
-* resizing the content highlight when it's a block change event ([#1288](https://github.com/google/blockly-samples/issues/1288)) ([5ea46b4](https://github.com/google/blockly-samples/commit/5ea46b46f7ceeb7efdfe8817d11c397442913389))
-
-
-### 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))
-
-
-
-## 1.0.31 (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.0.30 (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.0.28 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## 1.0.27 (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.0.26 (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.0.25 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/workspace-content-highlight
-
-
-
-
-
-## 1.0.24 (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.0.23 (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/plugins/content-highlight/README.md b/plugins/content-highlight/README.md
deleted file mode 100644
index 7fe317cda..000000000
--- a/plugins/content-highlight/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# @blockly/workspace-content-highlight [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that highlights the
-content on the workspace.
-
-
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/workspace-content-highlight
-```
-
-### npm
-
-```
-npm install @blockly/workspace-content-highlight --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import {ContentHighlight} from '@blockly/workspace-content-highlight';
-
-// Inject Blockly.
-const workspace = Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
-});
-
-// Initialize plugin.
-const contentHighlight = new ContentHighlight(workspace);
-contentHighlight.init();
-```
-
-## API
-
-- `init`: Initializes the content highlight.
-- `dispose`: Disposes of content highlight.
-
-## License
-
-Apache 2.0
diff --git a/plugins/content-highlight/package.json b/plugins/content-highlight/package.json
deleted file mode 100644
index 27c5f3c78..000000000
--- a/plugins/content-highlight/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "name": "@blockly/workspace-content-highlight",
- "version": "13.2.0",
- "description": "A Blockly workspace plugin that adds a highlight around the content area.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "content",
- "content-highlight",
- "highlight",
- "workspace"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/content-highlight#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/content-highlight"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/content-highlight/readme-media/content-highlight.gif b/plugins/content-highlight/readme-media/content-highlight.gif
deleted file mode 100644
index 61c82cd47..000000000
Binary files a/plugins/content-highlight/readme-media/content-highlight.gif and /dev/null differ
diff --git a/plugins/content-highlight/src/index.ts b/plugins/content-highlight/src/index.ts
deleted file mode 100644
index 3fd6551d4..000000000
--- a/plugins/content-highlight/src/index.ts
+++ /dev/null
@@ -1,302 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A plugin that highlights the content on the workspace.
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * List of events that cause a change in content area size.
- */
-const contentChangeEvents: string[] = [
- Blockly.Events.VIEWPORT_CHANGE,
- Blockly.Events.BLOCK_CREATE,
- Blockly.Events.BLOCK_MOVE,
- Blockly.Events.BLOCK_DELETE,
- Blockly.Events.COMMENT_MOVE,
- Blockly.Events.COMMENT_RESIZE,
- Blockly.Events.COMMENT_CREATE,
- Blockly.Events.COMMENT_DELETE,
-];
-
-/**
- * The default padding to use for the content highlight in workspace units.
- */
-const defaultPadding = 10;
-
-/**
- * Length of opacity change transition in seconds.
- */
-const animationTime = 0.25;
-
-/**
- * A plugin that highlights the area where content exists on the workspace.
- */
-export class ContentHighlight {
- /**
- * The width of the highlight rectangle in workspace units.
- */
- private width = 0;
-
- /**
- * The height of the highlight rectangle in workspace units.
- */
- private height = 0;
-
- /**
- * The top offset of the highlight rectangle in pixels.
- */
- private top = 0;
-
- /**
- * The left offset of the highlight rectangle in pixels.
- */
- private left = 0;
-
- /**
- * The last scale value applied on the content highlight.
- */
- private lastScale = 1;
-
- /**
- * The cached content metrics for the workspace in workspace units.
- */
- private cachedContentMetrics?: Blockly.MetricsManager.ContainerRegion;
-
- /**
- * The padding to use around the content area.
- */
- private padding = defaultPadding;
-
- private svgGroup?: SVGGElement;
- private rect?: SVGRectElement;
- private background?: SVGRectElement;
- private onChangeWrapper?: (event: Blockly.Events.Abstract) => void;
-
- /**
- * Constructor for the content highlight plugin.
- *
- * @param workspace The workspace that the plugin will be added to.
- */
- constructor(protected workspace: Blockly.WorkspaceSvg) {}
-
- /**
- * Initializes the plugin.
- *
- * @param padding The padding to use for the content area highlight
- * rectangle, in workspace units.
- */
- init(padding?: number) {
- this.padding = padding || defaultPadding;
-
- /** @type {SVGElement} */
- this.svgGroup = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.G,
- {class: 'contentAreaHighlight'},
- null,
- );
-
- const rnd = String(Math.random()).substring(2);
- const mask = Blockly.utils.dom.createSvgElement(
- new Blockly.utils.Svg('mask'),
- {
- id: 'contentAreaHighlightMask' + rnd,
- },
- this.svgGroup,
- );
- Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.RECT,
- {
- x: 0,
- y: 0,
- width: '100%',
- height: '100%',
- fill: 'white',
- },
- mask,
- );
- this.rect = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.RECT,
- {
- x: 0,
- y: 0,
- rx: Blockly.bubbles.Bubble.BORDER_WIDTH,
- ry: Blockly.bubbles.Bubble.BORDER_WIDTH,
- fill: 'black',
- },
- mask,
- );
- this.background = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.RECT,
- {
- x: 0,
- y: 0,
- width: '100%',
- height: '100%',
- mask: `url(#contentAreaHighlightMask${rnd})`,
- },
- this.svgGroup,
- );
-
- this.applyColor();
- const metricsManager = this.workspace.getMetricsManager();
- this.cachedContentMetrics = metricsManager.getContentMetrics(true);
- this.resize(this.cachedContentMetrics);
- const absoluteMetrics = metricsManager.getAbsoluteMetrics();
- this.position(this.cachedContentMetrics, absoluteMetrics);
-
- // Apply transition animation for opacity changes.
- this.svgGroup.style.transition = `opacity ${animationTime}s`;
-
- const parentSvg = this.workspace.getParentSvg();
- if (parentSvg.firstChild) {
- parentSvg.insertBefore(this.svgGroup, parentSvg.firstChild);
- } else {
- parentSvg.appendChild(this.svgGroup);
- }
-
- this.onChangeWrapper = this.onChange.bind(this);
- this.workspace.addChangeListener(this.onChangeWrapper);
- }
-
- /**
- * Disposes of content highlight.
- * Unlinks from all DOM elements and remove all event listeners
- * to prevent memory leaks.
- */
- dispose() {
- if (this.svgGroup) {
- Blockly.utils.dom.removeNode(this.svgGroup);
- }
- if (this.onChangeWrapper) {
- this.workspace.removeChangeListener(this.onChangeWrapper);
- }
- }
-
- /**
- * Handles events triggered on the workspace.
- *
- * @param event The event.
- */
- private onChange(event: Blockly.Events.Abstract) {
- if (event.type === Blockly.Events.THEME_CHANGE) {
- this.applyColor();
- } else if (contentChangeEvents.indexOf(event.type) !== -1) {
- const metricsManager = this.workspace.getMetricsManager();
- if (event.type !== Blockly.Events.VIEWPORT_CHANGE) {
- // The content metrics change when it's not a viewport change event.
- this.cachedContentMetrics = metricsManager.getContentMetrics(true);
- this.resize(this.cachedContentMetrics);
- }
- const absoluteMetrics = metricsManager.getAbsoluteMetrics();
- if (this.cachedContentMetrics) {
- this.position(this.cachedContentMetrics, absoluteMetrics);
- }
- } else if (event.type === Blockly.Events.BLOCK_DRAG) {
- this.handleDragEvent(event as Blockly.Events.BlockDrag);
- } else if (event.type === Blockly.Events.COMMENT_DRAG) {
- this.handleDragEvent(event as Blockly.Events.CommentDrag);
- } else if (event.type === Blockly.Events.BLOCK_CHANGE) {
- // Resizes the content highlight when it is a block change event
- const metricsManager = this.workspace.getMetricsManager();
- this.cachedContentMetrics = metricsManager.getContentMetrics(true);
- this.resize(this.cachedContentMetrics);
- }
- }
-
- /**
- * Changes opacity of the highlight based on what kind of block drag event
- * is passed.
- *
- * @param event The BlockDrag event.
- */
- private handleDragEvent(
- event: Blockly.Events.BlockDrag | Blockly.Events.CommentDrag,
- ) {
- const opacity = event.isStart ? '0' : '1';
- this.svgGroup?.setAttribute('opacity', opacity);
- }
-
- /**
- * Applies the color fill for the highlight based on the current theme.
- */
- private applyColor() {
- const theme = this.workspace.getTheme();
- const bgColor =
- theme.getComponentStyle('workspaceBackgroundColour') || '#ffffff';
-
- const colorDarkened = Blockly.utils.colour.blend('#000', bgColor, 0.1);
- const colorLightened = Blockly.utils.colour.blend('#fff', bgColor, 0.1);
- const color =
- bgColor === '#ffffff' || bgColor === '#fff'
- ? colorDarkened
- : colorLightened;
- if (!color) return;
- this.background?.setAttribute('fill', color);
- }
-
- /**
- * Resizes the content highlight.
- *
- * @param contentMetrics The content metrics for the workspace in workspace
- * coordinates.
- */
- private resize(contentMetrics: Blockly.MetricsManager.ContainerRegion) {
- const width = contentMetrics.width
- ? contentMetrics.width + 2 * this.padding
- : 0;
- const height = contentMetrics.height
- ? contentMetrics.height + 2 * this.padding
- : 0;
- if (width !== this.width) {
- this.width = width;
- this.rect?.setAttribute('width', `${width}`);
- }
- if (height !== this.height) {
- this.height = height;
- this.rect?.setAttribute('height', `${height}`);
- }
- }
-
- /**
- * Positions the highlight on the workspace based on the workspace metrics.
- *
- * @param contentMetrics The content metrics for the workspace in workspace
- * coordinates.
- * @param absoluteMetrics The absolute metrics for the workspace.
- */
- private position(
- contentMetrics: Blockly.MetricsManager.ContainerRegion,
- absoluteMetrics: Blockly.MetricsManager.AbsoluteMetrics,
- ) {
- // Compute top/left manually to avoid unnecessary extra computation.
- const viewTop = -this.workspace.scrollY;
- const viewLeft = -this.workspace.scrollX;
- const scale = this.workspace.scale;
- const top =
- absoluteMetrics.top +
- contentMetrics.top * scale -
- viewTop -
- this.padding * scale;
- const left =
- absoluteMetrics.left +
- contentMetrics.left * scale -
- viewLeft -
- this.padding * scale;
-
- if (top !== this.top || left !== this.left || this.lastScale !== scale) {
- this.top = top;
- this.left = left;
- this.lastScale = scale;
- this.rect?.setAttribute(
- 'transform',
- `translate(${left}, ${top}) scale(${scale})`,
- );
- }
- }
-}
diff --git a/plugins/content-highlight/test/index.html b/plugins/content-highlight/test/index.html
deleted file mode 100644
index dc96c578f..000000000
--- a/plugins/content-highlight/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/content-highlight/test/index.js b/plugins/content-highlight/test/index.js
deleted file mode 100644
index fdf5b888e..000000000
--- a/plugins/content-highlight/test/index.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Content highlight test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import {ContentHighlight} from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
-
- const contentHighlight = new ContentHighlight(workspace);
- contentHighlight.init();
-
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- grid: {
- spacing: 25,
- length: 3,
- colour: '#ccc',
- snap: true,
- },
- zoom: {
- controls: true,
- },
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/content-highlight/tsconfig.json b/plugins/content-highlight/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/content-highlight/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/continuous-toolbox/CHANGELOG.md b/plugins/continuous-toolbox/CHANGELOG.md
deleted file mode 100644
index 4ba956c9d..000000000
--- a/plugins/continuous-toolbox/CHANGELOG.md
+++ /dev/null
@@ -1,704 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [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 keyboard navigation for the continuous toolbox ([#2690](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2690))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [7.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/continuous-toolbox@7.0.8...@blockly/continuous-toolbox@7.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [7.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/continuous-toolbox@7.0.7...@blockly/continuous-toolbox@7.0.8) (2026-01-15)
-
-
-### Bug Fixes
-
-* Remove unsafe cast in ContinuousFlyout ([#2671](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2671)) ([5d84f65](https://github.com/RaspberryPiFoundation/blockly-samples/commit/5d84f65d6689d3c73839f4e0b012f2547bb22d47))
-
-
-
-## [7.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/continuous-toolbox@7.0.6...@blockly/continuous-toolbox@7.0.7) (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.6](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.5...@blockly/continuous-toolbox@7.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [7.0.5](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.4...@blockly/continuous-toolbox@7.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [7.0.4](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.3...@blockly/continuous-toolbox@7.0.4) (2025-12-19)
-
-
-### Bug Fixes
-
-* In continuous toolbox plugin, replace blocklyTreeLabel with blocklyToolboxCategoryLabel ([#2633](https://github.com/google/blockly-samples/issues/2633)) ([9ac3c28](https://github.com/google/blockly-samples/commit/9ac3c284b03955587ca9f573c52ebcf99f6c00e2))
-
-
-
-## [7.0.3](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.2...@blockly/continuous-toolbox@7.0.3) (2025-10-02)
-
-
-### Bug Fixes
-
-* use type-only export for LabelFlyoutItem to fix build error ([#2607](https://github.com/google/blockly-samples/issues/2607)) ([cd10c49](https://github.com/google/blockly-samples/commit/cd10c4957363e39363297acb8d3a0ee595a78e29))
-
-
-
-## [7.0.2](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.1...@blockly/continuous-toolbox@7.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@7.0.0...@blockly/continuous-toolbox@7.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.16...@blockly/continuous-toolbox@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.16](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.15...@blockly/continuous-toolbox@6.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.15](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.14...@blockly/continuous-toolbox@6.0.15) (2025-05-15)
-
-
-### Bug Fixes
-
-* Don't pin continuous-toolbox to Blockly v12.0.0-beta.0. ([#2532](https://github.com/google/blockly-samples/issues/2532)) ([9f49e28](https://github.com/google/blockly-samples/commit/9f49e2811a8c078a6377c4b38025c2cf5d04e744))
-* Fix scrolling and API issues with the continuous toolbox plugin. ([#2485](https://github.com/google/blockly-samples/issues/2485)) ([7476290](https://github.com/google/blockly-samples/commit/7476290ff118105c2b6fa39c747b0871cf5ea411))
-
-
-
-
-
-## [6.0.14](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.13...@blockly/continuous-toolbox@6.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.13](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.12...@blockly/continuous-toolbox@6.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.12](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.11...@blockly/continuous-toolbox@6.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.11](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.10...@blockly/continuous-toolbox@6.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.10](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.9...@blockly/continuous-toolbox@6.0.10) (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.9](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.8...@blockly/continuous-toolbox@6.0.9) (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.8](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.7...@blockly/continuous-toolbox@6.0.8) (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.7](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.6...@blockly/continuous-toolbox@6.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.5...@blockly/continuous-toolbox@6.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.4...@blockly/continuous-toolbox@6.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.3...@blockly/continuous-toolbox@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/continuous-toolbox@6.0.2...@blockly/continuous-toolbox@6.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.1...@blockly/continuous-toolbox@6.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@6.0.0...@blockly/continuous-toolbox@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/continuous-toolbox@5.0.19...@blockly/continuous-toolbox@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.0.19](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.18...@blockly/continuous-toolbox@5.0.19) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.18](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.17...@blockly/continuous-toolbox@5.0.18) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.16...@blockly/continuous-toolbox@5.0.17) (2024-05-02)
-
-
-### Bug Fixes
-
-* only select the first category when the flyout is shown when there is no selection ([#2337](https://github.com/google/blockly-samples/issues/2337)) ([fe779cb](https://github.com/google/blockly-samples/commit/fe779cba6318ae95861f6d932b20666ec22cdccb))
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.15...@blockly/continuous-toolbox@5.0.16) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.14...@blockly/continuous-toolbox@5.0.15) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.13...@blockly/continuous-toolbox@5.0.14) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.12...@blockly/continuous-toolbox@5.0.13) (2024-02-29)
-
-
-### Bug Fixes
-
-* Include padding above category labels when jumping to a category. ([#2218](https://github.com/google/blockly-samples/issues/2218)) ([bd3cba1](https://github.com/google/blockly-samples/commit/bd3cba121c33e6a5dc3b1d11d432f5af5f169074))
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.11...@blockly/continuous-toolbox@5.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.10...@blockly/continuous-toolbox@5.0.11) (2024-01-25)
-
-
-### Bug Fixes
-
-* Use the referencesVariables() method to identify variable-related fields instead of checking their type. ([#2161](https://github.com/google/blockly-samples/issues/2161)) ([09b650a](https://github.com/google/blockly-samples/commit/09b650aa269ebbf170a3297214fc197b647b2e33))
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.9...@blockly/continuous-toolbox@5.0.10) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.8...@blockly/continuous-toolbox@5.0.9) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.7...@blockly/continuous-toolbox@5.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.6...@blockly/continuous-toolbox@5.0.7) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.5...@blockly/continuous-toolbox@5.0.6) (2023-10-30)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.4...@blockly/continuous-toolbox@5.0.5) (2023-10-19)
-
-
-### Bug Fixes
-
-* fix continuous toolbox not enabling blocks ([#2016](https://github.com/google/blockly-samples/issues/2016)) ([4d8aaf2](https://github.com/google/blockly-samples/commit/4d8aaf2fbcd00bd36fdb5394db17c93efb167c12))
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.3...@blockly/continuous-toolbox@5.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.2...@blockly/continuous-toolbox@5.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.1...@blockly/continuous-toolbox@5.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@5.0.0...@blockly/continuous-toolbox@5.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@4.0.1...@blockly/continuous-toolbox@5.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@4.0.0...@blockly/continuous-toolbox@4.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.17...@blockly/continuous-toolbox@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))
-
-
-### Bug Fixes
-
-* continuous flyout calling wrong private method ([#1725](https://github.com/google/blockly-samples/issues/1725)) ([1fbf9ff](https://github.com/google/blockly-samples/commit/1fbf9ff4644c8dbe0a0b9f98109b824f37574e12))
-
-
-
-## [3.0.17](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.16...@blockly/continuous-toolbox@3.0.17) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.16](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.15...@blockly/continuous-toolbox@3.0.16) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.15](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.14...@blockly/continuous-toolbox@3.0.15) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.14](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.13...@blockly/continuous-toolbox@3.0.14) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.13](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.12...@blockly/continuous-toolbox@3.0.13) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.12](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.11...@blockly/continuous-toolbox@3.0.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.11](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.10...@blockly/continuous-toolbox@3.0.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.10](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.9...@blockly/continuous-toolbox@3.0.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.8...@blockly/continuous-toolbox@3.0.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.7...@blockly/continuous-toolbox@3.0.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.6...@blockly/continuous-toolbox@3.0.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.5...@blockly/continuous-toolbox@3.0.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.4...@blockly/continuous-toolbox@3.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.3...@blockly/continuous-toolbox@3.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.2...@blockly/continuous-toolbox@3.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.1...@blockly/continuous-toolbox@3.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@3.0.0...@blockly/continuous-toolbox@3.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/continuous-toolbox@2.0.40...@blockly/continuous-toolbox@3.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* 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.40 (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.39 (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.37 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## 2.0.36 (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.35 (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.34 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/continuous-toolbox
-
-
-
-
-
-## 2.0.33 (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.32 (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/plugins/continuous-toolbox/GETSTARTED.md b/plugins/continuous-toolbox/GETSTARTED.md
deleted file mode 100644
index 5a69fc1d5..000000000
--- a/plugins/continuous-toolbox/GETSTARTED.md
+++ /dev/null
@@ -1,22 +0,0 @@
-## Available Scripts
-
-In this directory, you can run:
-
-### `npm 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.
-
-### `npm run build`
-
-Builds the package into the `dist` directory.
-
-### `npm run lint`
-
-Runs eslint on the `src` and `test` directories.
-
-### `npm run clean`
-
-Deletes the `dist` and `build` directories if they exist.
diff --git a/plugins/continuous-toolbox/README.md b/plugins/continuous-toolbox/README.md
deleted file mode 100644
index 65d6e9126..000000000
--- a/plugins/continuous-toolbox/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# @blockly/continuous-toolbox [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that creates a continuous-scrolling style toolbox/flyout that is always open. All of the blocks from all categories are in the flyout together, and the user can either click a category name in the toolbox or scroll to the category they're looking for. This flyout only works as a vertical flyout and it works in both left-to-right and right-to-left modes. Parts of the toolbox style have been changed already, but you can customize the style further by following the [toolbox documentation](https://developers.google.com/blockly/guides/configure/web/toolbox).
-
-
-The continuous toolbox is shown here with the 'Zelos' theme, and the style can be further customized.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/continuous-toolbox
-```
-
-### npm
-
-```
-npm install @blockly/continuous-toolbox --save
-```
-
-## Usage
-
-Import and call the `registerContinuousToolbox()` function before injecting
-Blockly. This style of flyout works best with a toolbox definition that does
-not use collapsible categories.
-
-Note that this plugin uses APIs introduced in the `v12` release of Blockly, so
-you will need to use at least this version or higher.
-
-```js
-import * as Blockly from 'blockly';
-import {registerContinuousToolbox} from '@blockly/continuous-toolbox';
-
-// Inject Blockly.
-registerContinuousToolbox();
-const workspace = Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
- plugins: {
- flyoutsVerticalToolbox: 'ContinuousFlyout',
- metricsManager: 'ContinuousMetrics',
- toolbox: 'ContinuousToolbox',
- },
- // ... your other options here ...
-});
-```
-
-## Block Recycling
-
-As a performance optimization, by default the continuous toolbox "recycles"
-blocks to avoid having to create DOM elements for potentially hundreds of blocks
-every time the flyout is shown. With the default set of blocks, this drops the
-time to show the flyout from roughly 35ms to 25ms; the effect is naturally
-larger with larger block sets.
-
-Recycling is unrelated to Blockly's Trash feature; instead, it entails moving
-the blocks offscreen when the flyout is hidden, and then simply repositioning
-them when the flyout is shown again. Not all block types are amenable to this;
-in particular, blocks with dynamic behavior (e.g. those that reference
-variables, support mutations, or have dynamic dropdown fields) are excluded by
-default.
-
-This feature can be toggled by calling `setRecyclingEnabled()` on an instance of
-`ContinuousFlyout`, and the default ruleset for determining which blocks are
-safe for recycling can be replaced with a custom callback by passing that
-function to `setBlockIsRecyclable()`.
-
-## License
-
-Apache 2.0
diff --git a/plugins/continuous-toolbox/package.json b/plugins/continuous-toolbox/package.json
deleted file mode 100644
index 3e6283184..000000000
--- a/plugins/continuous-toolbox/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "name": "@blockly/continuous-toolbox",
- "version": "13.2.0",
- "description": "A Blockly plugin that adds a continous-scrolling style toolbox and flyout",
- "scripts": {
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "audit:fix": "blockly-scripts auditFix",
- "predeploy": "npm run build && blockly-scripts predeploy"
- },
- "main": "./dist/index.js",
- "module": "./src/index.js",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "continuous-toolbox"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/continuous-toolbox#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/continuous-toolbox"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/continuous-toolbox/screenshot.png b/plugins/continuous-toolbox/screenshot.png
deleted file mode 100644
index 368bb29aa..000000000
Binary files a/plugins/continuous-toolbox/screenshot.png and /dev/null differ
diff --git a/plugins/continuous-toolbox/src/ContinuousCategory.ts b/plugins/continuous-toolbox/src/ContinuousCategory.ts
deleted file mode 100644
index 6a5da76c9..000000000
--- a/plugins/continuous-toolbox/src/ContinuousCategory.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Toolbox category with styling for continuous toolbox.
- */
-
-import * as Blockly from 'blockly/core';
-
-/** Toolbox category for continuous toolbox. */
-export class ContinuousCategory extends Blockly.ToolboxCategory {
- /**
- * Creates a DOM element to display the category's label.
- *
- * @param name The name of this category.
- * @returns The newly created category label DOM element.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override createLabelDom_(name: string): Element {
- const label = document.createElement('div');
- label.setAttribute('id', this.getId() + '.label');
- label.textContent = name;
- label.classList.add(this.cssConfig_['label'] ?? '');
- return label;
- }
-
- /**
- * Creates a DOM element to display the category's icon. This category uses
- * color swatches instead of graphical icons.
- *
- * @returns The newly created category icon DOM element.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override createIconDom_(): Element {
- const icon = document.createElement('div');
- icon.classList.add('categoryBubble');
- icon.style.backgroundColor = this.colour_;
- return icon;
- }
-
- /**
- * Adds a color indicator to the toolbox category. Intentionally a no-op.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override addColourBorder_() {
- // No-op
- }
-
- /**
- * Sets whether or not this category is selected in the toolbox.
- *
- * @param isSelected True if this category is selected, otherwise false.
- */
- override setSelected(isSelected: boolean) {
- if (!this.rowDiv_ || !this.htmlDiv_) return;
- if (isSelected) {
- this.rowDiv_.style.backgroundColor = 'gray';
- Blockly.utils.dom.addClass(
- this.rowDiv_,
- this.cssConfig_['selected'] ?? '',
- );
- } else {
- this.rowDiv_.style.backgroundColor = '';
- Blockly.utils.dom.removeClass(
- this.rowDiv_,
- this.cssConfig_['selected'] ?? '',
- );
- }
- Blockly.utils.aria.setState(
- this.htmlDiv_,
- Blockly.utils.aria.State.SELECTED,
- isSelected,
- );
- }
-}
diff --git a/plugins/continuous-toolbox/src/ContinuousFlyout.ts b/plugins/continuous-toolbox/src/ContinuousFlyout.ts
deleted file mode 100644
index 27f1c63ac..000000000
--- a/plugins/continuous-toolbox/src/ContinuousFlyout.ts
+++ /dev/null
@@ -1,340 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Flyout that supports always-open continuous scrolling.
- */
-
-import * as Blockly from 'blockly/core';
-import {ContinuousToolbox} from './ContinuousToolbox';
-import {ContinuousFlyoutMetrics} from './ContinuousFlyoutMetrics';
-import {RecyclableBlockFlyoutInflater} from './RecyclableBlockFlyoutInflater';
-
-export interface LabelFlyoutItem extends Blockly.FlyoutItem {
- // Blockly.FlyoutButton represents both buttons and labels; a label is just
- // a borderless, non-clickable button.
- getElement(): Blockly.FlyoutButton;
-}
-
-/**
- * Class for continuous flyout.
- */
-export class ContinuousFlyout extends Blockly.VerticalFlyout {
- /**
- * Target scroll position, used to smoothly scroll to a given category
- * location when selected.
- */
- private scrollTarget?: number;
-
- /**
- * Map from category name to its position in the flyout.
- */
- private scrollPositions = new Map();
-
- /**
- * The percentage of the distance to the scrollTarget that should be
- * scrolled at a time. Lower values will produce a smoother, slower scroll.
- */
- protected scrollAnimationFraction = 0.3;
-
- /**
- * Prevents the flyout from closing automatically when a block is dragged out.
- */
- override autoClose = false;
-
- /**
- * Creates a new ContinuousFlyout.
- *
- * @param workspaceOptions The injection options for the flyout's workspace.
- */
- constructor(workspaceOptions: Blockly.Options) {
- super(workspaceOptions);
-
- this.getWorkspace().setMetricsManager(
- new ContinuousFlyoutMetrics(this.getWorkspace(), this),
- );
-
- this.getWorkspace().addChangeListener((e: Blockly.Events.Abstract) => {
- if (e.type === Blockly.Events.VIEWPORT_CHANGE) {
- this.selectCategoryByScrollPosition(-this.getWorkspace().scrollY);
- }
- });
-
- this.setRecyclingEnabled(true);
- }
-
- /**
- * Gets parent toolbox.
- * Since we registered the ContinuousToolbox, we know that's its type.
- *
- * @returns Toolbox that owns this flyout.
- */
- private getParentToolbox(): ContinuousToolbox | null {
- const toolbox = this.targetWorkspace.getToolbox();
- if (!toolbox || toolbox instanceof ContinuousToolbox) return toolbox;
-
- console.warn(
- 'Expected a `ContinuousToolbox` instance but did not find one. ' +
- 'Make sure `registerContinuousToolbox()` has been called and the ' +
- 'continuous toolbox has been injected.',
- );
-
- return null;
- }
-
- /**
- * Records scroll position for each category in the toolbox.
- * The scroll position is determined by the coordinates of each category's
- * label after the entire flyout has been rendered.
- */
- private recordScrollPositions() {
- this.scrollPositions.clear();
- this.getContents()
- .filter(this.toolboxItemIsLabel.bind(this))
- .map((item) => item.getElement())
- .forEach((label) => {
- this.scrollPositions.set(
- label.getButtonText(),
- Math.max(0, label.getPosition().y - this.GAP_Y / 2),
- );
- });
- }
-
- /**
- * Validates and typechecks that the given toolbox item represents a label.
- *
- * @param item The toolbox item to check.
- * @returns True if the item represents a label in the flyout, and is a
- * Blockly.FlyoutButton.
- */
- protected toolboxItemIsLabel(
- item: Blockly.FlyoutItem,
- ): item is LabelFlyoutItem {
- const element = item.getElement();
- return !!(
- item.getType() === 'label' &&
- // Note that `FlyoutButton` represents both buttons and labels.
- element instanceof Blockly.FlyoutButton &&
- element.isLabel() &&
- this.getParentToolbox()?.getCategoryByName(element.getButtonText())
- );
- }
-
- /**
- * Returns the scroll position for the given category name.
- *
- * @param name Category name.
- * @returns Scroll position for given category in workspace units, or null if
- * not found.
- */
- getCategoryScrollPosition(name: string): number | null {
- const position = this.scrollPositions.get(name);
- if (position === undefined) {
- console.warn(`Scroll position not recorded for category ${name}`);
- }
- return position ?? null;
- }
-
- /**
- * Selects an item in the toolbox based on the scroll position of the flyout.
- *
- * @param position Current scroll position of the workspace.
- */
- private selectCategoryByScrollPosition(position: number) {
- // If we are currently auto-scrolling, due to selecting a category by
- // clicking on it, do not update the category selection.
- if (this.scrollTarget) return;
-
- const scaledPosition = Math.round(position / this.getWorkspace().scale);
- // Traverse the array of scroll positions in reverse, so we can select the
- // furthest category that the scroll position is beyond.
- for (const [name, position] of [
- ...this.scrollPositions.entries(),
- ].reverse()) {
- if (scaledPosition >= position) {
- this.getParentToolbox()?.selectCategoryByName(name);
- return;
- }
- }
- }
-
- /**
- * Scrolls the flyout to given position.
- *
- * @param position The Y coordinate to scroll to.
- */
- scrollTo(position: number) {
- // Set the scroll target to either the scaled position or the lowest
- // possible scroll point, whichever is smaller.
- const metrics = this.getWorkspace().getMetrics();
- this.scrollTarget = Math.min(
- position * this.getWorkspace().scale,
- metrics.scrollHeight - metrics.viewHeight,
- );
-
- this.stepScrollAnimation();
- }
-
- /**
- * Scrolls the flyout to display the given category at the top.
- *
- * @param category The toolbox category to scroll to in the flyout.
- */
- scrollToCategory(category: Blockly.ISelectableToolboxItem) {
- const position = this.scrollPositions.get(category.getName());
- if (position === undefined) {
- console.warn(`Scroll position not recorded for category ${name}`);
- return;
- }
- this.scrollTo(position);
- }
-
- /**
- * Returns the header item in the flyout corresponding to the given
- * toolbox category, if any.
- *
- * @param category The toolbox category to retrieve header item for.
- * @returns The given category's header item, or undefined if not found.
- */
- headerForCategory(
- category: Blockly.ISelectableToolboxItem,
- ): Blockly.IFocusableNode | undefined {
- return this.getContents()
- .find((item) => {
- return (
- this.toolboxItemIsLabel(item) &&
- item.getElement().getButtonText() === category.getName()
- );
- })
- ?.getElement();
- }
-
- /**
- * Step the scrolling animation by scrolling a fraction of the way to
- * a scroll target, and request the next frame if necessary.
- */
- private stepScrollAnimation() {
- if (this.scrollTarget === undefined) return;
- const currentScrollPos = -this.getWorkspace().scrollY;
- const diff = this.scrollTarget - currentScrollPos;
- if (Math.abs(diff) < 1) {
- this.getWorkspace().scrollbar?.setY(this.scrollTarget);
- this.scrollTarget = undefined;
- return;
- }
- this.getWorkspace().scrollbar?.setY(
- currentScrollPos + diff * this.scrollAnimationFraction,
- );
-
- requestAnimationFrame(this.stepScrollAnimation.bind(this));
- }
-
- /**
- * Handles mouse wheel events.
- *
- * @param e The mouse wheel event to handle.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override wheel_(e: WheelEvent) {
- // Don't scroll in response to mouse wheel events if we're currently
- // animating scrolling to a category.
- if (this.scrollTarget) return;
-
- super.wheel_(e);
- }
-
- /**
- * Calculates the additional padding needed at the bottom of the flyout in
- * order to make it possible to scroll to the top of the last category.
- *
- * @param contentMetrics Content metrics for the flyout.
- * @param viewMetrics View metrics for the flyout.
- * @returns The additional bottom padding needed.
- */
- calculateBottomPadding(
- contentMetrics: Blockly.MetricsManager.ContainerRegion,
- viewMetrics: Blockly.MetricsManager.ContainerRegion,
- ): number {
- if (this.scrollPositions.size === 0) return 0;
-
- const lastPosition =
- ([...this.scrollPositions.values()].pop() ?? 0) *
- this.getWorkspace().scale;
- const lastCategoryHeight = contentMetrics.height - lastPosition;
- if (lastCategoryHeight < viewMetrics.height) {
- return viewMetrics.height - lastCategoryHeight;
- }
-
- return 0;
- }
-
- /**
- * Returns the X coordinate for the flyout's position.
- */
- override getX(): number {
- if (
- this.isVisible() &&
- // Make sure that this flyout is associated with a toolbox and not e.g.
- // a simple flyout or the trashcan flyout.
- this.targetWorkspace.toolboxPosition === this.toolboxPosition_ &&
- this.targetWorkspace.getToolbox() &&
- this.toolboxPosition_ !== Blockly.utils.toolbox.Position.LEFT
- ) {
- // This makes it so blocks cannot go under the flyout in RTL mode.
- return this.targetWorkspace.getMetricsManager().getViewMetrics().width;
- }
-
- return super.getX();
- }
-
- /**
- * Displays the given contents in the flyout.
- *
- * @param flyoutDef A string or JSON object specifying the contents of the
- * flyout.
- */
- override show(flyoutDef: Blockly.utils.toolbox.FlyoutDefinition | string) {
- super.show(flyoutDef);
- this.recordScrollPositions();
- this.getWorkspace().resizeContents();
- if (!this.getParentToolbox()?.getSelectedItem()) {
- this.selectCategoryByScrollPosition(0);
- }
- this.getRecyclableInflater().emptyRecycledBlocks();
- }
-
- /**
- * Sets the function used to determine whether a block is recyclable.
- *
- * @param func The function used to determine if a block is recyclable.
- */
- setBlockIsRecyclable(func: (block: Blockly.Block) => boolean) {
- this.getRecyclableInflater().recycleEligibilityChecker = func;
- }
-
- /**
- * Set whether the flyout can recycle blocks.
- *
- * @param isEnabled True to allow blocks to be recycled, false otherwise.
- */
- setRecyclingEnabled(isEnabled: boolean) {
- this.getRecyclableInflater().recyclingEnabled = isEnabled;
- }
-
- /**
- * Returns the recyclable block flyout inflater.
- *
- * @returns The recyclable inflater.
- */
- protected getRecyclableInflater(): RecyclableBlockFlyoutInflater {
- const inflater = this.getInflaterForType('block');
- if (!(inflater instanceof RecyclableBlockFlyoutInflater)) {
- throw new Error('The RecyclableBlockFlyoutInflater is not registered.');
- }
-
- return inflater;
- }
-}
diff --git a/plugins/continuous-toolbox/src/ContinuousFlyoutMetrics.ts b/plugins/continuous-toolbox/src/ContinuousFlyoutMetrics.ts
deleted file mode 100644
index bd5fea5cd..000000000
--- a/plugins/continuous-toolbox/src/ContinuousFlyoutMetrics.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import type {ContinuousFlyout} from './ContinuousFlyout';
-
-/** Adds additional padding to the bottom of the flyout if needed. */
-export class ContinuousFlyoutMetrics extends Blockly.FlyoutMetricsManager {
- /**
- * Returns the metrics for the scroll area of the continuous flyout's
- * workspace. Adds additional padding to the bottom of the flyout if needed in
- * order to make it possible to scroll to the top of the last category.
- *
- * @param getWorkspaceCoordinates True to get the scroll metrics in
- * workspace coordinates, false to get them in pixel coordinates.
- * @param cachedViewMetrics The view metrics if they have been previously
- * computed.
- * @param cachedContentMetrics The content metrics if they have been
- * previously computed.
- * @returns The metrics for the scroll container.
- */
- override getScrollMetrics(
- getWorkspaceCoordinates?: boolean,
- cachedViewMetrics?: Blockly.MetricsManager.ContainerRegion,
- cachedContentMetrics?: Blockly.MetricsManager.ContainerRegion,
- ) {
- const scrollMetrics = super.getScrollMetrics(
- getWorkspaceCoordinates,
- cachedViewMetrics,
- cachedContentMetrics,
- );
- const contentMetrics =
- cachedContentMetrics || this.getContentMetrics(getWorkspaceCoordinates);
- const viewMetrics =
- cachedViewMetrics || this.getViewMetrics(getWorkspaceCoordinates);
-
- if (scrollMetrics) {
- scrollMetrics.height += (
- this.flyout_ as ContinuousFlyout
- ).calculateBottomPadding(contentMetrics, viewMetrics);
- }
- return scrollMetrics;
- }
-}
diff --git a/plugins/continuous-toolbox/src/ContinuousMetrics.ts b/plugins/continuous-toolbox/src/ContinuousMetrics.ts
deleted file mode 100644
index 3355f40d0..000000000
--- a/plugins/continuous-toolbox/src/ContinuousMetrics.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Overrides metrics to exclude the flyout from the viewport.
- */
-
-import * as Blockly from 'blockly/core';
-
-/** Computes metrics for a toolbox with an always open flyout. */
-export class ContinuousMetrics extends Blockly.MetricsManager {
- /**
- * Computes the viewport size to not include the toolbox and the flyout.
- * The default viewport includes the flyout.
- *
- * @param getWorkspaceCoordinates True to get the view metrics in workspace
- * coordinates, false to get them in pixel coordinates.
- * @returns The width, height, top and left of the viewport in either
- * workspace coordinates or pixel coordinates.
- */
- override getViewMetrics(
- getWorkspaceCoordinates = false,
- ): Blockly.MetricsManager.ContainerRegion {
- const scale = getWorkspaceCoordinates ? this.workspace_.scale : 1;
- const svgMetrics = this.getSvgMetrics();
- const toolboxMetrics = this.getToolboxMetrics();
- const flyoutMetrics = this.getFlyoutMetrics(false);
- const toolboxPosition = toolboxMetrics.position;
-
- if (this.workspace_.getToolbox()) {
- // Note: Not actually supported at this time due to ContinuousToolbox
- // only supporting a vertical flyout. But included for completeness.
- if (
- toolboxPosition == Blockly.TOOLBOX_AT_TOP ||
- toolboxPosition == Blockly.TOOLBOX_AT_BOTTOM
- ) {
- svgMetrics.height -= toolboxMetrics.height + flyoutMetrics.height;
- } else if (
- toolboxPosition == Blockly.TOOLBOX_AT_LEFT ||
- toolboxPosition == Blockly.TOOLBOX_AT_RIGHT
- ) {
- svgMetrics.width -= toolboxMetrics.width + flyoutMetrics.width;
- }
- }
- return {
- height: svgMetrics.height / scale,
- width: svgMetrics.width / scale,
- top: -this.workspace_.scrollY / scale,
- left: -this.workspace_.scrollX / scale,
- };
- }
-
- /**
- * Gets the absolute left and absolute top in pixel coordinates.
- * This is where the visible workspace starts in relation to the SVG
- * container, adjusted to not include the area behind the flyout.
- *
- * @returns The absolute metrics for the workspace.
- */
- override getAbsoluteMetrics(): Blockly.MetricsManager.AbsoluteMetrics {
- const toolboxMetrics = this.getToolboxMetrics();
- const flyoutMetrics = this.getFlyoutMetrics(false);
- const toolboxPosition = toolboxMetrics.position;
- let absoluteLeft = 0;
-
- if (
- this.workspace_.getToolbox() &&
- toolboxPosition == Blockly.TOOLBOX_AT_LEFT
- ) {
- absoluteLeft = toolboxMetrics.width + flyoutMetrics.width;
- }
- let absoluteTop = 0;
- if (
- this.workspace_.getToolbox() &&
- toolboxPosition == Blockly.TOOLBOX_AT_TOP
- ) {
- absoluteTop = toolboxMetrics.height + flyoutMetrics.height;
- }
- return {
- top: absoluteTop,
- left: absoluteLeft,
- };
- }
-}
diff --git a/plugins/continuous-toolbox/src/ContinuousToolbox.ts b/plugins/continuous-toolbox/src/ContinuousToolbox.ts
deleted file mode 100644
index 1bf4dc759..000000000
--- a/plugins/continuous-toolbox/src/ContinuousToolbox.ts
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Toolbox that uses a continuous scrolling flyout.
- */
-
-import * as Blockly from 'blockly/core';
-import {ContinuousFlyout} from './ContinuousFlyout';
-import {ContinuousToolboxNavigator} from './ContinuousToolboxNavigator';
-
-/**
- * Class for continuous toolbox.
- */
-export class ContinuousToolbox extends Blockly.Toolbox {
- /**
- * Timeout ID used to prevent refreshing the flyout during extensive block
- * changes.
- */
- private refreshDebouncer?: ReturnType;
-
- /**
- * Navigator object responsible for handling keyboard navigation within this
- * toolbox.
- */
- private continuousToolboxNavigator = new ContinuousToolboxNavigator(this);
-
- /**
- * Initializes the continuous toolbox.
- */
- override init() {
- super.init();
-
- // Populate the flyout with all blocks and show it immediately.
- const flyout = this.getFlyout();
- flyout.show(this.getInitialFlyoutContents());
-
- this.getWorkspace().addChangeListener((e: Blockly.Events.Abstract) => {
- if (
- e.type === Blockly.Events.BLOCK_CREATE ||
- e.type === Blockly.Events.BLOCK_DELETE ||
- e.type === Blockly.Events.BLOCK_CHANGE
- ) {
- this.refreshSelection();
- }
- });
- }
-
- /**
- * Returns the continuous toolbox's flyout.
- *
- * @returns The toolbox's flyout.
- */
- override getFlyout(): ContinuousFlyout {
- return super.getFlyout() as ContinuousFlyout;
- }
-
- /**
- * Gets the contents that should be shown in the flyout immediately.
- * This includes all blocks and labels for each category of block.
- *
- * @returns Flyout contents.
- */
- private getInitialFlyoutContents(): Blockly.utils.toolbox.FlyoutItemInfoArray {
- return this.getToolboxItems().flatMap(this.convertToolboxItemToFlyoutItems);
- }
-
- /**
- * Converts a given toolbox item to an array of flyout items, generally a
- * label followed by the category's blocks.
- *
- * @param toolboxItem The toolbox item/category to convert.
- * @returns An array of flyout items contained in the given toolbox item.
- */
- protected convertToolboxItemToFlyoutItems(
- toolboxItem: Blockly.IToolboxItem,
- ): Blockly.utils.toolbox.FlyoutItemInfoArray {
- let contents: Blockly.utils.toolbox.FlyoutItemInfoArray = [];
- if (toolboxItem instanceof Blockly.ToolboxCategory) {
- // Create a label node to go at the top of the category
- contents.push({kind: 'LABEL', text: toolboxItem.getName()});
- let itemContents = toolboxItem.getContents();
-
- // Handle custom categories (e.g. variables and functions)
- if (typeof itemContents === 'string') {
- itemContents = [{custom: itemContents, kind: 'CATEGORY'}];
- }
- contents = contents.concat(itemContents);
- }
- return contents;
- }
-
- /**
- * Updates the flyout's contents if it is visible.
- */
- override refreshSelection() {
- if (this.getFlyout().isVisible()) {
- if (this.refreshDebouncer) {
- clearTimeout(this.refreshDebouncer);
- }
- this.refreshDebouncer = setTimeout(() => {
- this.getFlyout().show(this.getInitialFlyoutContents());
- }, 100);
- }
- }
-
- /**
- * Scrolls the flyout to display the newly selected category's contents.
- *
- * @param oldItem The previously selected toolbox category.
- * @param newItem The newly selected toolbox category.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override updateFlyout_(
- oldItem: Blockly.ISelectableToolboxItem | null,
- newItem: Blockly.ISelectableToolboxItem | null,
- ) {
- if (newItem) {
- this.getFlyout().scrollToCategory(newItem);
- if (!this.getFlyout().isVisible()) {
- this.getFlyout().show(this.getInitialFlyoutContents());
- }
- } else if (this.getFlyout().autoClose) {
- this.getFlyout().hide();
- }
- }
-
- /**
- * Returns whether or not the toolbox should deselect the old category.
- *
- * @param oldItem The previously selected toolbox category.
- * @param newItem The newly selected toolbox category.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override shouldDeselectItem_(
- oldItem: Blockly.ISelectableToolboxItem | null,
- newItem: Blockly.ISelectableToolboxItem | null,
- ): boolean {
- // Should not deselect if the same category is clicked again.
- return !!(oldItem && oldItem !== newItem);
- }
-
- /**
- * Gets a category by name.
- *
- * @param name Name of category to get.
- * @returns Category, or null if not found.
- * @internal
- */
- getCategoryByName(name: string): Blockly.ISelectableToolboxItem | null {
- const category = this.getToolboxItems().find(
- (item) =>
- item instanceof Blockly.ToolboxCategory &&
- item.isSelectable() &&
- name === item.getName(),
- );
- if (!category) return null;
- return category as Blockly.ISelectableToolboxItem;
- }
-
- /**
- * Selects the category with the given name.
- * Similar to setSelectedItem, but importantly, does not call updateFlyout
- * because this is called while the flyout is being scrolled.
- *
- * @param name Name of category to select.
- * @internal
- */
- selectCategoryByName(name: string) {
- const newItem = this.getCategoryByName(name);
- if (!newItem) return;
-
- const oldItem = this.selectedItem_;
-
- if (oldItem && this.shouldDeselectItem_(oldItem, newItem)) {
- this.deselectItem_(oldItem);
- }
-
- if (this.shouldSelectItem_(oldItem, newItem)) {
- this.selectItem_(oldItem, newItem);
- }
- }
-
- /**
- * Returns the bounding rectangle of the drag target/deletion area in pixels
- * relative to the viewport.
- *
- * @returns The toolbox's bounding box. Null if drag target area should be
- * ignored.
- */
- override getClientRect(): Blockly.utils.Rect | null {
- // If the flyout never closes, it should be the deletable area.
- const flyout = this.getFlyout();
- if (flyout && !flyout.autoClose) {
- return flyout.getClientRect();
- }
- return super.getClientRect();
- }
-
- /**
- * Returns the Navigator object responsible for handling keyboard navigation
- * inside this toolbox.
- */
- override getNavigator(): Blockly.ToolboxNavigator {
- return this.continuousToolboxNavigator;
- }
-}
diff --git a/plugins/continuous-toolbox/src/ContinuousToolboxNavigator.ts b/plugins/continuous-toolbox/src/ContinuousToolboxNavigator.ts
deleted file mode 100644
index 717c7aa8c..000000000
--- a/plugins/continuous-toolbox/src/ContinuousToolboxNavigator.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * @license
- * Copyright 2026 Raspberry Pi Foundation
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {ContinuousToolbox} from './ContinuousToolbox';
-import {ContinuousCategory} from './ContinuousCategory';
-
-/**
- * A Navigator that handles keyboard navigation within a continuous toolbox.
- */
-export class ContinuousToolboxNavigator extends Blockly.ToolboxNavigator {
- constructor(protected toolbox: ContinuousToolbox) {
- super(toolbox);
- }
-
- /**
- * Returns the next node when navigating "in", in this case the first flyout
- * item in the toolbox's currently selected category.
- *
- * @param node The node to navigate relative to.
- * @returns The node "in" relative to the given node.
- */
- override getInNode(
- node = Blockly.getFocusManager().getFocusedNode(),
- ): Blockly.IFocusableNode | null {
- if (!(node instanceof ContinuousCategory)) return null;
- return this.toolbox.getFlyout().headerForCategory(node) ?? null;
- }
-}
diff --git a/plugins/continuous-toolbox/src/RecyclableBlockFlyoutInflater.ts b/plugins/continuous-toolbox/src/RecyclableBlockFlyoutInflater.ts
deleted file mode 100644
index 96b62bbf9..000000000
--- a/plugins/continuous-toolbox/src/RecyclableBlockFlyoutInflater.ts
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * A block inflater that caches and reuses blocks to improve performance.
- */
-export class RecyclableBlockFlyoutInflater extends Blockly.BlockFlyoutInflater {
- /**
- * Whether or not block recycling is enabled.
- */
- recyclingEnabled = false;
-
- /**
- * Map from block type to block instance.
- */
- private recycledBlocks = new Map();
-
- /**
- * Custom function to use for checking whether or not blocks can be recycled.
- */
- recycleEligibilityChecker?: (block: Blockly.Block) => boolean;
-
- /**
- * Creates a new block from the given block definition.
- *
- * @param blockDefinition The definition to create a block from.
- * @param workspace The workspace to create the block on.
- * @returns The newly created block.
- */
- override createBlock(
- blockDefinition: Blockly.utils.toolbox.BlockInfo,
- workspace: Blockly.WorkspaceSvg,
- ): Blockly.BlockSvg {
- const blockType = this.getTypeFromDefinition(blockDefinition);
- return (
- this.getRecycledBlock(blockType) ??
- super.createBlock(blockDefinition, workspace)
- );
- }
-
- /**
- * Returns the type of a block from an XML or JSON block definition.
- *
- * @param blockDefinition The block definition to parse.
- * @returns The block type.
- */
- private getTypeFromDefinition(
- blockDefinition: Blockly.utils.toolbox.BlockInfo,
- ): string {
- let type: string | null | undefined;
- if (blockDefinition['blockxml']) {
- const xml =
- typeof blockDefinition['blockxml'] === 'string'
- ? Blockly.utils.xml.textToDom(blockDefinition['blockxml'])
- : (blockDefinition['blockxml'] as Element);
- type = xml.getAttribute('type');
- } else {
- type = blockDefinition['type'];
- }
-
- if (!type) {
- throw new Error(
- `Block type is not specified in block definition: ${JSON.stringify(
- blockDefinition,
- )}`,
- );
- }
- return type;
- }
-
- /**
- * Puts a previously created block into the recycle bin and moves it to the
- * top of the workspace. Used during large workspace swaps to limit the number
- * of new DOM elements we need to create.
- *
- * @param block The block to recycle.
- */
- private recycleBlock(block: Blockly.BlockSvg) {
- const xy = block.getRelativeToSurfaceXY();
- block.moveBy(-xy.x, -xy.y);
- this.recycledBlocks.set(block.type, block);
- }
-
- /**
- * Returns a block from the cache of recycled blocks with the given type, or
- * undefined if one cannot be found.
- *
- * @param blockType The type of the block to try to recycle.
- * @returns The recycled block, or undefined if one could not be recycled.
- */
- private getRecycledBlock(blockType: string): Blockly.BlockSvg | undefined {
- const block = this.recycledBlocks.get(blockType);
- this.recycledBlocks.delete(blockType);
- return block;
- }
-
- /**
- * Returns whether the given block can be recycled or not.
- *
- * @param block The block to check for recyclability.
- * @returns True if the block can be recycled. False otherwise.
- */
- protected blockIsRecyclable(block: Blockly.Block): boolean {
- if (!this.recyclingEnabled) return false;
-
- if (this.recycleEligibilityChecker) {
- return this.recycleEligibilityChecker(block);
- }
-
- // If the block needs to parse mutations, never recycle.
- if (
- block.mutationToDom ||
- block.domToMutation ||
- block.saveExtraState ||
- block.loadExtraState
- ) {
- return false;
- }
-
- if (!block.isEnabled()) return false;
-
- for (const input of block.inputList) {
- for (const field of input.fieldRow) {
- // No variables.
- if (field.referencesVariables()) return false;
-
- if (field instanceof Blockly.FieldDropdown) {
- if (field.isOptionListDynamic()) return false;
- }
- }
- // Check children.
- if (input.connection) {
- const targetBlock = input.connection.targetBlock();
- if (targetBlock && !this.blockIsRecyclable(targetBlock)) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Disposes of the provided block.
- *
- * @param item The block to dispose of.
- */
- override disposeItem(item: Blockly.FlyoutItem) {
- const element = item.getElement();
- if (
- element instanceof Blockly.BlockSvg &&
- this.blockIsRecyclable(element)
- ) {
- this.removeListeners(element.id);
- this.recycleBlock(element);
- } else {
- super.disposeItem(item);
- }
- }
-
- /**
- * Clears the cache of recycled blocks.
- */
- emptyRecycledBlocks() {
- this.recycledBlocks.forEach((block) => block.dispose(false, false));
- this.recycledBlocks.clear();
- }
-}
diff --git a/plugins/continuous-toolbox/src/index.ts b/plugins/continuous-toolbox/src/index.ts
deleted file mode 100644
index 54280cba0..000000000
--- a/plugins/continuous-toolbox/src/index.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Continuous-scroll toolbox and flyout that is always open.
- */
-
-import * as Blockly from 'blockly/core';
-
-import {ContinuousCategory} from './ContinuousCategory';
-import {ContinuousFlyout} from './ContinuousFlyout';
-import type {LabelFlyoutItem} from './ContinuousFlyout';
-import {ContinuousMetrics} from './ContinuousMetrics';
-import {ContinuousToolbox} from './ContinuousToolbox';
-import {RecyclableBlockFlyoutInflater} from './RecyclableBlockFlyoutInflater';
-
-export {
- ContinuousCategory,
- ContinuousFlyout,
- ContinuousMetrics,
- ContinuousToolbox,
- LabelFlyoutItem,
- RecyclableBlockFlyoutInflater,
-};
-
-/**
- * Registers the components of the continuous toolbox, replacing Blockly's
- * built-in defaults.
- */
-export function registerContinuousToolbox() {
- Blockly.registry.register(
- Blockly.registry.Type.TOOLBOX_ITEM,
- Blockly.ToolboxCategory.registrationName,
- ContinuousCategory,
- true,
- );
-
- Blockly.registry.register(
- Blockly.registry.Type.METRICS_MANAGER,
- 'ContinuousMetrics',
- ContinuousMetrics,
- true,
- );
-
- Blockly.registry.register(
- Blockly.registry.Type.FLYOUTS_VERTICAL_TOOLBOX,
- 'ContinuousFlyout',
- ContinuousFlyout,
- true,
- );
-
- Blockly.registry.register(
- Blockly.registry.Type.TOOLBOX,
- 'ContinuousToolbox',
- ContinuousToolbox,
- true,
- );
-
- Blockly.registry.register(
- Blockly.registry.Type.FLYOUT_INFLATER,
- 'block',
- RecyclableBlockFlyoutInflater,
- true,
- );
-
- Blockly.Css.register(`
- .categoryBubble {
- margin: 0 auto 0.125rem;
- border-radius: 100%;
- border: 1px solid;
- width: 1.25rem;
- height: 1.25rem;
- }
- .blocklyToolboxCategory {
- height: initial;
- padding: 3px 0;
- }
- .blocklyTreeRowContentContainer {
- display: flex;
- flex-direction: column;
- }
- .blocklyToolboxCategoryLabel {
- margin: auto;
- }
- .blocklyToolboxCategoryLabel {
- text-align: center;
- }
- `);
-}
diff --git a/plugins/continuous-toolbox/test/index.html b/plugins/continuous-toolbox/test/index.html
deleted file mode 100644
index 1747f4463..000000000
--- a/plugins/continuous-toolbox/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Continuous Toolbox Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/continuous-toolbox/test/index.js b/plugins/continuous-toolbox/test/index.js
deleted file mode 100644
index f78f44a60..000000000
--- a/plugins/continuous-toolbox/test/index.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Continuous toolbox plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import {registerContinuousToolbox} from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- return Blockly.inject(blocklyDiv, options);
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- registerContinuousToolbox();
- createPlayground(document.getElementById('root'), createWorkspace, {
- plugins: {
- flyoutsVerticalToolbox: 'ContinuousFlyout',
- metricsManager: 'ContinuousMetrics',
- toolbox: 'ContinuousToolbox',
- },
- });
-});
diff --git a/plugins/continuous-toolbox/tsconfig.json b/plugins/continuous-toolbox/tsconfig.json
deleted file mode 100644
index 1a913743b..000000000
--- a/plugins/continuous-toolbox/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "ES2020",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/cross-tab-copy-paste/CHANGELOG.md b/plugins/cross-tab-copy-paste/CHANGELOG.md
deleted file mode 100644
index 3f9455816..000000000
--- a/plugins/cross-tab-copy-paste/CHANGELOG.md
+++ /dev/null
@@ -1,720 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [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)
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [8.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.7...@blockly/plugin-cross-tab-copy-paste@8.0.8) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.6...@blockly/plugin-cross-tab-copy-paste@8.0.7) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.6](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.5...@blockly/plugin-cross-tab-copy-paste@8.0.6) (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))
-
-
-
-## [8.0.5](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.4...@blockly/plugin-cross-tab-copy-paste@8.0.5) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.4](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.3...@blockly/plugin-cross-tab-copy-paste@8.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.3](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.2...@blockly/plugin-cross-tab-copy-paste@8.0.3) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.2](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.1...@blockly/plugin-cross-tab-copy-paste@8.0.2) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@8.0.0...@blockly/plugin-cross-tab-copy-paste@8.0.1) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [8.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@7.0.1...@blockly/plugin-cross-tab-copy-paste@8.0.0) (2025-07-03)
-
-
-### ⚠ BREAKING CHANGES
-
-* cross-tab-copy-paste can copy more than just blocks (#2571)
-
-### Features
-
-* cross-tab-copy-paste can copy more than just blocks ([#2571](https://github.com/google/blockly-samples/issues/2571)) ([3fda886](https://github.com/google/blockly-samples/commit/3fda886d1bd39fa63f4c8fdf5ac3196b9bdcaf05))
-
-
-
-## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@7.0.0...@blockly/plugin-cross-tab-copy-paste@7.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.16...@blockly/plugin-cross-tab-copy-paste@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.16](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.15...@blockly/plugin-cross-tab-copy-paste@6.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.15](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.14...@blockly/plugin-cross-tab-copy-paste@6.0.15) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.14](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.13...@blockly/plugin-cross-tab-copy-paste@6.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.13](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.12...@blockly/plugin-cross-tab-copy-paste@6.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.12](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.11...@blockly/plugin-cross-tab-copy-paste@6.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.11](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.10...@blockly/plugin-cross-tab-copy-paste@6.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.10](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.9...@blockly/plugin-cross-tab-copy-paste@6.0.10) (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.9](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.8...@blockly/plugin-cross-tab-copy-paste@6.0.9) (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.8](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.7...@blockly/plugin-cross-tab-copy-paste@6.0.8) (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.7](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.6...@blockly/plugin-cross-tab-copy-paste@6.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.5...@blockly/plugin-cross-tab-copy-paste@6.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.4...@blockly/plugin-cross-tab-copy-paste@6.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.3...@blockly/plugin-cross-tab-copy-paste@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/plugin-cross-tab-copy-paste@6.0.2...@blockly/plugin-cross-tab-copy-paste@6.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.1...@blockly/plugin-cross-tab-copy-paste@6.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@6.0.0...@blockly/plugin-cross-tab-copy-paste@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/plugin-cross-tab-copy-paste@5.0.11...@blockly/plugin-cross-tab-copy-paste@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.0.11](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.10...@blockly/plugin-cross-tab-copy-paste@5.0.11) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.9...@blockly/plugin-cross-tab-copy-paste@5.0.10) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.8...@blockly/plugin-cross-tab-copy-paste@5.0.9) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.7...@blockly/plugin-cross-tab-copy-paste@5.0.8) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.6...@blockly/plugin-cross-tab-copy-paste@5.0.7) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.5...@blockly/plugin-cross-tab-copy-paste@5.0.6) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.4...@blockly/plugin-cross-tab-copy-paste@5.0.5) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.3...@blockly/plugin-cross-tab-copy-paste@5.0.4) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.2...@blockly/plugin-cross-tab-copy-paste@5.0.3) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.1...@blockly/plugin-cross-tab-copy-paste@5.0.2) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@5.0.0...@blockly/plugin-cross-tab-copy-paste@5.0.1) (2023-10-30)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@4.0.4...@blockly/plugin-cross-tab-copy-paste@5.0.0) (2023-09-28)
-
-
-### ⚠ BREAKING CHANGES
-
-* changes for v10.2.0 (#1989)
-
-### release
-
-* changes for v10.2.0 ([#1989](https://github.com/google/blockly-samples/issues/1989)) ([4d81ea7](https://github.com/google/blockly-samples/commit/4d81ea7254412ef199a270fc740c2f45755a2725)), closes [#1844](https://github.com/google/blockly-samples/issues/1844) [#1845](https://github.com/google/blockly-samples/issues/1845) [#1863](https://github.com/google/blockly-samples/issues/1863) [#1880](https://github.com/google/blockly-samples/issues/1880) [#1885](https://github.com/google/blockly-samples/issues/1885) [#1886](https://github.com/google/blockly-samples/issues/1886) [#1887](https://github.com/google/blockly-samples/issues/1887) [#1888](https://github.com/google/blockly-samples/issues/1888) [#1919](https://github.com/google/blockly-samples/issues/1919) [#1920](https://github.com/google/blockly-samples/issues/1920) [#1983](https://github.com/google/blockly-samples/issues/1983) [#1984](https://github.com/google/blockly-samples/issues/1984) [#1985](https://github.com/google/blockly-samples/issues/1985) [#1991](https://github.com/google/blockly-samples/issues/1991)
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@4.0.3...@blockly/plugin-cross-tab-copy-paste@4.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@4.0.2...@blockly/plugin-cross-tab-copy-paste@4.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@4.0.1...@blockly/plugin-cross-tab-copy-paste@4.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@4.0.0...@blockly/plugin-cross-tab-copy-paste@4.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@3.0.1...@blockly/plugin-cross-tab-copy-paste@4.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@3.0.0...@blockly/plugin-cross-tab-copy-paste@3.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.21...@blockly/plugin-cross-tab-copy-paste@3.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))
-
-
-
-## [2.0.21](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.20...@blockly/plugin-cross-tab-copy-paste@2.0.21) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.20](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.19...@blockly/plugin-cross-tab-copy-paste@2.0.20) (2023-05-25)
-
-
-### Bug Fixes
-
-* Fix typo in cross tab copy paste plugin. ([#1703](https://github.com/google/blockly-samples/issues/1703)) ([4fbf3cf](https://github.com/google/blockly-samples/commit/4fbf3cf8a14e1a70d1368bb17da5ed0784b2d1fc))
-
-
-
-## [2.0.19](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.18...@blockly/plugin-cross-tab-copy-paste@2.0.19) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.18](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.17...@blockly/plugin-cross-tab-copy-paste@2.0.18) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.17](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.16...@blockly/plugin-cross-tab-copy-paste@2.0.17) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.16](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.15...@blockly/plugin-cross-tab-copy-paste@2.0.16) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.15](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.14...@blockly/plugin-cross-tab-copy-paste@2.0.15) (2023-04-13)
-
-
-### Bug Fixes
-
-* replace Blockly.selected to Blockly.getSelected() ([#1661](https://github.com/google/blockly-samples/issues/1661)) ([38c4504](https://github.com/google/blockly-samples/commit/38c450406e1541cd1c9c3076ae77927316c0b4cd))
-
-
-
-## [2.0.14](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.13...@blockly/plugin-cross-tab-copy-paste@2.0.14) (2023-03-29)
-
-
-### Bug Fixes
-
-* Change from Blockly.selected to Blockly.getSelected ([#1641](https://github.com/google/blockly-samples/issues/1641)) ([2e49902](https://github.com/google/blockly-samples/commit/2e49902bf528576f05f1b1eec205778086d427b2))
-
-
-
-## [2.0.13](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.12...@blockly/plugin-cross-tab-copy-paste@2.0.13) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.12](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.11...@blockly/plugin-cross-tab-copy-paste@2.0.12) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.11](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.10...@blockly/plugin-cross-tab-copy-paste@2.0.11) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.10](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.9...@blockly/plugin-cross-tab-copy-paste@2.0.10) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.9](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.8...@blockly/plugin-cross-tab-copy-paste@2.0.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.8](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.7...@blockly/plugin-cross-tab-copy-paste@2.0.8) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.7](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.6...@blockly/plugin-cross-tab-copy-paste@2.0.7) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.6](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.5...@blockly/plugin-cross-tab-copy-paste@2.0.6) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.4...@blockly/plugin-cross-tab-copy-paste@2.0.5) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.3...@blockly/plugin-cross-tab-copy-paste@2.0.4) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.2...@blockly/plugin-cross-tab-copy-paste@2.0.3) (2022-11-17)
-
-
-### Bug Fixes
-
-* disable copy for immovable and undeletable blocks ([#1371](https://github.com/google/blockly-samples/issues/1371)) ([5afc679](https://github.com/google/blockly-samples/commit/5afc67950643a40e913d518921c65572ba9fdeab))
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.1...@blockly/plugin-cross-tab-copy-paste@2.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@2.0.0...@blockly/plugin-cross-tab-copy-paste@2.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/plugin-cross-tab-copy-paste@1.0.14...@blockly/plugin-cross-tab-copy-paste@2.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Features
-
-* add error callback to cross-tab copy-paste ([#1291](https://github.com/google/blockly-samples/issues/1291)) ([a4d6841](https://github.com/google/blockly-samples/commit/a4d68412aa3553c802f28c5e909cf58ebdbfa54d)), closes [#1218](https://github.com/google/blockly-samples/issues/1218)
-
-
-### Bug Fixes
-
-* avoid copy from inside context menus ([#1304](https://github.com/google/blockly-samples/issues/1304)) ([3d4ef16](https://github.com/google/blockly-samples/commit/3d4ef169426474ffd42b39f913e0484d524d0773)), closes [#1169](https://github.com/google/blockly-samples/issues/1169)
-* 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))
-
-
-
-## 1.0.14 (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.0.13 (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.0.11 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## 1.0.10 (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.0.9 (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.0.8 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/plugin-cross-tab-copy-paste
-
-
-
-
-
-## 1.0.7 (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.0.6 (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/plugins/cross-tab-copy-paste/GETSTARTED.md b/plugins/cross-tab-copy-paste/GETSTARTED.md
deleted file mode 100644
index 99e93c7e9..000000000
--- a/plugins/cross-tab-copy-paste/GETSTARTED.md
+++ /dev/null
@@ -1,24 +0,0 @@
-This package was bootstrapped with [@blockly/create-package](https://www.npmjs.com/package/@blockly/create-package).
-
-## Available Scripts
-
-In this directory, you can run:
-
-### `npm 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.
-
-### `npm run build`
-
-Builds the package into the `dist` directory.
-
-### `npm run lint`
-
-Runs eslint on the `src` and `test` directories.
-
-### `npm run clean`
-
-Deletes the `dist` and `build` directories if they exist.
diff --git a/plugins/cross-tab-copy-paste/README.md b/plugins/cross-tab-copy-paste/README.md
deleted file mode 100644
index 921f92625..000000000
--- a/plugins/cross-tab-copy-paste/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# @blockly/plugin-cross-tab-copy-paste [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that adds context menu items and keyboard shortcuts to allow users to copy and paste a block between tabs.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin-cross-tab-copy-paste
-```
-
-### npm
-
-```
-npm install @blockly/plugin-cross-tab-copy-paste --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import {CrossTabCopyPaste} from '@blockly/plugin-cross-tab-copy-paste';
-
-// Inject Blockly.
-const workspace = Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
-});
-
-const options = {
- contextMenu: true,
- shortcut: true,
-};
-
-// Initialize plugin.
-const plugin = new CrossTabCopyPaste();
-plugin.init(options, () => {
- console.log('Use this error callback to handle TypeError while pasting');
-});
-
-// optional: Remove the duplication command from Blockly's context menu.
-Blockly.ContextMenuRegistry.registry.unregister('blockDuplicate');
-
-// optional: You can change the position of the menu added to the context menu.
-Blockly.ContextMenuRegistry.registry.getItem('blockCopyToStorage').weight = 2;
-Blockly.ContextMenuRegistry.registry.getItem('blockPasteFromStorage').weight =
- 3;
-```
-
-## Options
-
-- `contextMenu` `{boolean}`: Register copy, cut, and paste commands in the Blockly context menu.
-- `shortcut` `{boolean}`: Register cut (ctr + x), copy (ctr + c) and paste (ctr + v) in the keybord shortcut.
-
-## Error Callback
-
-- `typeErrorCallback` `{Function}`: is an extra parameter to the init method, one can pass a callback to the cross-tab-copy-paste plugin that is called when the plugin triggers a TypeError error when pasting.
-
-## Localization
-
-You can change the displayed words.
-
-### English
-
-```js
-Blockly.Msg['CROSS_TAB_COPY'] = 'Copy';
-Blockly.Msg['CROSS_TAB_PASTE'] = 'Paste';
-```
-
-### Japanese
-
-```js
-Blockly.Msg['CROSS_TAB_COPY'] = 'コピー';
-Blockly.Msg['CROSS_TAB_PASTE'] = '貼り付け';
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/cross-tab-copy-paste/package.json b/plugins/cross-tab-copy-paste/package.json
deleted file mode 100644
index fc2a738d4..000000000
--- a/plugins/cross-tab-copy-paste/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "name": "@blockly/plugin-cross-tab-copy-paste",
- "version": "13.2.0",
- "description": "Allows copying blocks between multiple tabs with Blockly editors.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "",
- "keywords": [
- "blockly",
- "blockly-plugin"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/cross-tab-copy-paste#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/cross-tab-copy-paste"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/cross-tab-copy-paste/src/index.ts b/plugins/cross-tab-copy-paste/src/index.ts
deleted file mode 100644
index 466712414..000000000
--- a/plugins/cross-tab-copy-paste/src/index.ts
+++ /dev/null
@@ -1,497 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-type TypeErrorCallback = () => void;
-
-/**
- * Checks if the copy data represents that for a block.
- *
- * @param obj any ICopyData.
- * @returns if the ICopyData is a BlockCopyData.
- */
-function isBlockCopyData(
- obj: Blockly.ICopyData,
-): obj is Blockly.clipboard.BlockCopyData {
- return 'typeCounts' in obj;
-}
-
-/**
- * Determine if a focusable node can be copied.
- *
- * This will use the isCopyable method if the node implements it, otherwise
- * it will fall back to checking if the node is deletable and draggable not
- * considering the workspace's edit state.
- *
- * n.b. copied (with minor changes) from blockly/core/shortcut_items.
- *
- * @param focused The focused object.
- */
-function isCopyable(focused: Blockly.IFocusableNode): boolean {
- if (
- !Blockly.isCopyable(focused) ||
- !Blockly.isDeletable(focused) ||
- !Blockly.isDraggable(focused)
- )
- return false;
- // The cast is necessary while the minimum version of Blockly required is < 12.2.0
- // because that version is when `isCopyable` was introduced on the `ICopyable` interface.
- /* eslint-disable @typescript-eslint/no-explicit-any */
- if ((focused as any).isCopyable) {
- return (focused as any).isCopyable();
- /* eslint-enable @typescript-eslint/no-explicit-any */
- } else if (
- focused instanceof Blockly.BlockSvg ||
- focused instanceof Blockly.comments.RenderedWorkspaceComment
- ) {
- return focused.isOwnDeletable() && focused.isOwnMovable();
- }
- // This isn't a class Blockly knows about, so fall back to the stricter
- // checks for deletable and movable.
- return focused.isDeletable() && focused.isMovable();
-}
-
-/**
- * Determine if a focusable node can be cut.
- *
- * This will check if the node can be both copied and deleted in its current
- * workspace.
- *
- * n.b. copied from blockly/core/shortcut_items.
- *
- * @param focused The focused object.
- */
-function isCuttable(focused: Blockly.IFocusableNode): boolean {
- return (
- isCopyable(focused) && Blockly.isDeletable(focused) && focused.isDeletable()
- );
-}
-
-/**
- * Return value for a context menu item's precondition.
- */
-enum ContextMenuState {
- ENABLED = 'enabled',
- DISABLED = 'disabled',
- HIDDEN = 'hidden',
-}
-
-/**
- * A Blockly plugin that adds context menu items and keyboard shortcuts
- * to allow users to copy and paste copyable objects between tabs.
- */
-export class CrossTabCopyPaste {
- /** Key in which store copy data in the browser's local storage. */
- localStorageKey = 'blocklyStash';
-
- /**
- * Initializes the cross tab copy paste plugin. If no options are selected
- * then both context menu items and keyboard shortcuts are added.
- *
- * @param options
- * @param options.shortcut Register cut (ctr + x), copy (ctr + c) and paste (ctr + v)
- * in the shortcut.
- * @param options.contextMenu Register copy and paste in the context menu.
- * @param typeErrorCallback callback function to handle type errors
- * @param localStorageKey custom key for local storage
- */
- init(
- {contextMenu = true, shortcut = true} = {
- contextMenu: true,
- shortcut: true,
- },
- typeErrorCallback?: TypeErrorCallback,
- localStorageKey?: string,
- ) {
- if (localStorageKey) this.localStorageKey = localStorageKey;
- if (contextMenu) {
- // Register the menus
- this.blockCopyToStorageContextMenu();
- this.blockPasteFromStorageContextMenu(typeErrorCallback);
- }
-
- if (shortcut) {
- // Unregister the default KeyboardShortcuts
- Blockly.ShortcutRegistry.registry.unregister(
- Blockly.ShortcutItems.names.COPY,
- );
- Blockly.ShortcutRegistry.registry.unregister(
- Blockly.ShortcutItems.names.CUT,
- );
- Blockly.ShortcutRegistry.registry.unregister(
- Blockly.ShortcutItems.names.PASTE,
- );
- // Register the KeyboardShortcuts
- this.blockCopyToStorageShortcut();
- this.blockCutToStorageShortcut();
- this.blockPasteFromStorageShortcut(typeErrorCallback);
- }
- }
-
- /**
- * Parses copy data from JSON in local storage, if it exists.
- *
- * @returns copy data parsed from local storage, or undefined
- */
- getCopyData(): Blockly.ICopyData | undefined {
- const stored = localStorage.getItem(this.localStorageKey);
- if (!stored) return undefined;
- return JSON.parse(stored);
- }
-
- /**
- * Copy precondition called by both keyboard shortcut and context menu item.
- * Allows copying out of the flyout, as long as they could be pasted
- * into the main workspace.
- *
- * @param scope scope for copy action.
- * @param workspace explicit workspace for keyboard shortcuts,
- * undefined to get the workspace from the focused node.
- * @returns whether the option should be shown/hidden/disabled.
- */
- copyPrecondition(
- scope: Blockly.ContextMenuRegistry.Scope,
- workspace?: Blockly.Workspace,
- ): ContextMenuState {
- const focused = scope.focusedNode;
- if (!focused) return ContextMenuState.HIDDEN;
- if (!Blockly.isCopyable(focused)) return ContextMenuState.HIDDEN;
-
- if (!workspace) workspace = focused.workspace;
- if (!(workspace instanceof Blockly.WorkspaceSvg))
- return ContextMenuState.HIDDEN;
- const targetWorkspace = workspace.isFlyout
- ? workspace.targetWorkspace
- : workspace;
- if (
- !!focused &&
- !!targetWorkspace &&
- !targetWorkspace.isDragging() &&
- !Blockly.getFocusManager().ephemeralFocusTaken() &&
- isCopyable(focused)
- )
- return ContextMenuState.ENABLED;
- return ContextMenuState.DISABLED;
- }
-
- /**
- * Copy callback called by both keyboard shortcut and context menu item.
- * Copies the copy data to local storage.
- *
- * @param scope scope for copy action.
- * @param workspace workspace where shortcut or context menu was activated.
- * @returns true if copy happened, false otherwise.
- */
- copyCallback(
- scope: Blockly.ContextMenuRegistry.Scope,
- workspace: Blockly.Workspace,
- ): boolean {
- const focused = scope.focusedNode;
- if (!focused || !Blockly.isCopyable(focused) || !isCopyable(focused))
- return false;
-
- if (!(workspace instanceof Blockly.WorkspaceSvg)) return false;
-
- const targetWorkspace = workspace.isFlyout
- ? workspace.targetWorkspace
- : workspace;
- if (!targetWorkspace) return false;
-
- if (!focused.workspace.isFlyout) {
- targetWorkspace.hideChaff();
- }
- const copyData = focused.toCopyData();
- if (!copyData) return false;
- localStorage.setItem(this.localStorageKey, JSON.stringify(copyData));
- return true;
- }
-
- /**
- * Paste precondition called by both keyboard shortcut and context menu item.
- *
- * @param workspace workspace to paste in. should not be a flyout workspace.
- * @returns true if paste happened, false otherwise.
- */
- pastePrecondition(workspace: Blockly.WorkspaceSvg): ContextMenuState {
- const copyData = this.getCopyData();
- if (!copyData) return ContextMenuState.DISABLED;
- // If this is a block, make sure there's room for that type of block
- if (
- isBlockCopyData(copyData) &&
- !workspace?.isCapacityAvailable(copyData.typeCounts)
- )
- return ContextMenuState.DISABLED;
-
- if (
- !!workspace &&
- !workspace.isReadOnly() &&
- !workspace.isDragging() &&
- !Blockly.getFocusManager().ephemeralFocusTaken()
- )
- return ContextMenuState.ENABLED;
- return ContextMenuState.DISABLED;
- }
-
- /**
- * v12.0.0 of Blockly included the keyboard shortcut in Msg string, but
- * it was removed in v12.2.0. This function can be removed when this plugin's
- * minimum version of Blockly is >=12.2.0.
- *
- * @param labelText Blockly.Msg for the shortcut
- * @returns trimmed label for the context menu item.
- */
- getContextMenuText(labelText: string): string {
- // TODO: Once core is updated to remove the shortcut placeholders from the
- // keyboard shortcut messages, remove this.
- if (labelText.indexOf(')') === labelText.length - 1) {
- labelText = labelText.split(' (')[0];
- }
- return labelText;
- }
-
- /**
- * Adds a copy command to the context menu for copyable items.
- */
- blockCopyToStorageContextMenu() {
- const copyToStorageOption: Blockly.ContextMenuRegistry.RegistryItem = {
- displayText: () => {
- if (Blockly.Msg['CROSS_TAB_COPY']) {
- return Blockly.Msg['CROSS_TAB_COPY'];
- }
- return this.getContextMenuText(Blockly.Msg['COPY_SHORTCUT']);
- },
- preconditionFn: (scope: Blockly.ContextMenuRegistry.Scope) => {
- return this.copyPrecondition(scope);
- },
- callback: (scope: Blockly.ContextMenuRegistry.Scope) => {
- const focused = scope.focusedNode;
- // Check Blockly.isCopyable to make sure focused.workspace exists
- if (!focused || !Blockly.isCopyable(focused)) return false;
-
- const workspace = focused.workspace;
- return this.copyCallback(scope, workspace);
- },
- id: 'blockCopyToStorage',
- weight: 0,
- };
- Blockly.ContextMenuRegistry.registry.register(copyToStorageOption);
- }
-
- /**
- * Adds a paste command to the context menu for copyable items.
- *
- * @param typeErrorCallback callback function to handle type errors
- */
- blockPasteFromStorageContextMenu(typeErrorCallback?: TypeErrorCallback) {
- const pasteFromStorageOption: Blockly.ContextMenuRegistry.RegistryItem = {
- displayText: () => {
- if (Blockly.Msg['CROSS_TAB_PASTE']) {
- return Blockly.Msg['CROSS_TAB_PASTE'];
- }
- return this.getContextMenuText(Blockly.Msg['PASTE_SHORTCUT']);
- },
- preconditionFn: (scope) => {
- // Only show paste option if menu was opened on a non-flyout workspace
- if (
- !(scope.focusedNode instanceof Blockly.WorkspaceSvg) ||
- scope.focusedNode.isFlyout
- )
- return ContextMenuState.HIDDEN;
- const workspace = scope.focusedNode;
- return this.pastePrecondition(workspace);
- },
- callback: (scope, menuOpenEvent, menuSelectEvent, location) => {
- const copyData = this.getCopyData();
- if (!copyData) return false;
- const workspace = scope.focusedNode;
- // Paste option only available if menu was opened on a workspace
- if (!(workspace instanceof Blockly.WorkspaceSvg)) return false;
-
- const pasteLocation = Blockly.utils.svgMath.screenToWsCoordinates(
- workspace,
- location,
- );
- try {
- return !!Blockly.clipboard.paste(copyData, workspace, pasteLocation);
- } catch (e) {
- if (e instanceof TypeError && typeErrorCallback) {
- typeErrorCallback();
- } else {
- throw e;
- }
- }
- },
- id: 'blockPasteFromStorage',
- weight: 0,
- };
- Blockly.ContextMenuRegistry.registry.register(pasteFromStorageOption);
- }
-
- /**
- * Adds a keyboard shortcut that will store copy information for a copyable
- * in localStorage.
- */
- blockCopyToStorageShortcut() {
- const ctrlC = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.C,
- [Blockly.utils.KeyCodes.CTRL],
- );
- const metaC = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.C,
- [Blockly.utils.KeyCodes.META],
- );
- const copyShortcut: Blockly.ShortcutRegistry.KeyboardShortcut = {
- name: Blockly.ShortcutItems.names.COPY,
- keyCodes: [ctrlC, metaC],
- preconditionFn: (workspace, scope) => {
- const status = this.copyPrecondition(scope, workspace);
- return status === ContextMenuState.ENABLED;
- },
- callback: (workspace, e, shortcut, scope) => {
- // Prevent the default copy behavior,
- // which may beep or otherwise indicate
- // an error due to the lack of a selection.
- e.preventDefault();
- return this.copyCallback(scope, workspace);
- },
- };
- Blockly.ShortcutRegistry.registry.register(copyShortcut);
- }
-
- /**
- * Adds a keyboard shortcut that will store copy information for copyable
- * items in local storage and delete the item.
- */
- blockCutToStorageShortcut() {
- const ctrlX = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.X,
- [Blockly.utils.KeyCodes.CTRL],
- );
- const metaX = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.X,
- [Blockly.utils.KeyCodes.META],
- );
-
- const cutShortcut: Blockly.ShortcutRegistry.KeyboardShortcut = {
- name: Blockly.ShortcutItems.names.CUT,
- keyCodes: [ctrlX, metaX],
- preconditionFn: (workspace, scope) => {
- const focused = scope.focusedNode;
- return (
- !!focused &&
- !workspace.isReadOnly() &&
- !workspace.isDragging() &&
- !Blockly.getFocusManager().ephemeralFocusTaken() &&
- isCuttable(focused)
- );
- },
- callback: (workspace, e, shortcut, scope) => {
- // Prevent the default cut behavior,
- // which may beep or otherwise indicate
- // an error due to the lack of a selection.
- e.preventDefault();
-
- const focused = scope.focusedNode;
- if (!focused || !isCuttable(focused) || !Blockly.isCopyable(focused)) {
- return false;
- }
- const copyData = focused.toCopyData();
- if (!copyData) return false;
-
- if (focused instanceof Blockly.BlockSvg) {
- focused.checkAndDelete();
- } else if (Blockly.isDeletable(focused)) {
- // Manually handle event grouping since only blocks handle that
- // automatically.
- const oldGroup = Blockly.Events.getGroup();
- Blockly.Events.setGroup(true);
- focused.dispose();
- Blockly.Events.setGroup(oldGroup);
- }
-
- localStorage.setItem(this.localStorageKey, JSON.stringify(copyData));
- return true;
- },
- };
- Blockly.ShortcutRegistry.registry.register(cutShortcut);
- }
-
- /**
- * Adds a keyboard shortcut that will paste the copyable stored in localStorage.
- *
- * @param typeErrorCallback
- * callback function to handle type errors
- */
- blockPasteFromStorageShortcut(typeErrorCallback?: TypeErrorCallback) {
- const ctrlV = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.V,
- [Blockly.utils.KeyCodes.CTRL],
- );
- const metaV = Blockly.ShortcutRegistry.registry.createSerializedKey(
- Blockly.utils.KeyCodes.V,
- [Blockly.utils.KeyCodes.META],
- );
-
- const pasteShortcut: Blockly.ShortcutRegistry.KeyboardShortcut = {
- name: Blockly.ShortcutItems.names.PASTE,
- keyCodes: [ctrlV, metaV],
- preconditionFn: (workspace) => {
- const targetWorkspace = workspace.isFlyout
- ? workspace.targetWorkspace
- : workspace;
-
- if (!targetWorkspace) return false;
- const status = this.pastePrecondition(targetWorkspace);
- return status === ContextMenuState.ENABLED;
- },
- callback: (workspace, e) => {
- // Prevent the default copy behavior,
- // which may beep or otherwise indicate
- // an error due to the lack of a selection.
- e.preventDefault();
- const copyData = this.getCopyData();
- if (!copyData) return false;
-
- // If paste shortcut is called while flyout is open, paste in the
- // main workspace instead.
- const targetWorkspace = workspace.isFlyout
- ? workspace.targetWorkspace
- : workspace;
- if (!targetWorkspace) return false;
- try {
- if (e instanceof PointerEvent) {
- // The event that triggers a shortcut would conventionally be a KeyboardEvent.
- // However, it may be a PointerEvent if a context menu item was used as a
- // wrapper for this callback, in which case the new block(s) should be pasted
- // at the mouse coordinates where the menu was opened, and this PointerEvent
- // is where the menu was opened.
- const mouseCoords = Blockly.utils.svgMath.screenToWsCoordinates(
- targetWorkspace,
- new Blockly.utils.Coordinate(e.clientX, e.clientY),
- );
- return !!Blockly.clipboard.paste(
- copyData,
- targetWorkspace,
- mouseCoords,
- );
- }
- // If we don't have location data about the original copyable, let the
- // paster determine position.
- return !!Blockly.clipboard.paste(copyData, targetWorkspace);
- } catch (e) {
- if (e instanceof TypeError && typeErrorCallback) {
- typeErrorCallback();
- } else {
- throw e;
- }
- }
- return true;
- },
- };
- Blockly.ShortcutRegistry.registry.register(pasteShortcut);
- }
-}
diff --git a/plugins/cross-tab-copy-paste/test/index.html b/plugins/cross-tab-copy-paste/test/index.html
deleted file mode 100644
index 4eeec89c6..000000000
--- a/plugins/cross-tab-copy-paste/test/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
- Blockly Plugin Test
-
-
-
-
-
- This plugin can be tested by opening up multiple tabs of this page and
- copy/pasting the block from one tab to another. You can only paste into a
- workspace that also has this plugin enabled.
-
-
-
-
-
diff --git a/plugins/cross-tab-copy-paste/test/index.ts b/plugins/cross-tab-copy-paste/test/index.ts
deleted file mode 100644
index 420838414..000000000
--- a/plugins/cross-tab-copy-paste/test/index.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import {CrossTabCopyPaste} from '../src/index';
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- };
- const rootElement = document.getElementById('root');
- if (!rootElement) {
- return;
- }
- createPlayground(rootElement, createWorkspace, defaultOptions);
- // Add workspace comments so we can test copying them
- Blockly.ContextMenuItems.registerCommentOptions();
- const copyPastePlugin = new CrossTabCopyPaste();
- copyPastePlugin.init();
-});
diff --git a/plugins/cross-tab-copy-paste/tsconfig.json b/plugins/cross-tab-copy-paste/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/cross-tab-copy-paste/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/dev-create/.gitignore b/plugins/dev-create/.gitignore
deleted file mode 100644
index 15ce8c38b..000000000
--- a/plugins/dev-create/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Don't commit the copy of sample-app to Git
-templates/sample-app
-templates/sample-app-ts
diff --git a/plugins/dev-create/CHANGELOG.md b/plugins/dev-create/CHANGELOG.md
deleted file mode 100644
index b5f8a933e..000000000
--- a/plugins/dev-create/CHANGELOG.md
+++ /dev/null
@@ -1,333 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [3.0.5](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/create-package@3.0.4...@blockly/create-package@3.0.5) (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))
-
-
-
-## [3.0.4](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/create-package@3.0.3...@blockly/create-package@3.0.4) (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))
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/create-package@3.0.2...@blockly/create-package@3.0.3) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/create-package@3.0.1...@blockly/create-package@3.0.2) (2024-06-20)
-
-
-### Bug Fixes
-
-* check that root element exists in ts plugin template ([#2385](https://github.com/google/blockly-samples/issues/2385)) ([1644abb](https://github.com/google/blockly-samples/commit/1644abbc6da317b930b00010b653a42cc99c4f80))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/create-package@3.0.0...@blockly/create-package@3.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))
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.5...@blockly/create-package@3.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))
-
-
-### Bug Fixes
-
-* build for the v11 branch ([#2268](https://github.com/google/blockly-samples/issues/2268)) ([c7a4fc5](https://github.com/google/blockly-samples/commit/c7a4fc5e72c5e8d9e9bc926bbbbadd1eb31792fc))
-* 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)
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.4...@blockly/create-package@2.0.5) (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))
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.3...@blockly/create-package@2.0.4) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.2...@blockly/create-package@2.0.3) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.1...@blockly/create-package@2.0.2) (2023-10-30)
-
-
-### Bug Fixes
-
-* include ts files in sample app create ([#2038](https://github.com/google/blockly-samples/issues/2038)) ([d3ea99a](https://github.com/google/blockly-samples/commit/d3ea99ad9da09c84018ba785ca7ed6ae38ce042f))
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/create-package@2.0.0...@blockly/create-package@2.0.1) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.4.1...@blockly/create-package@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))
-
-
-
-## [1.4.1](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.4.0...@blockly/create-package@1.4.1) (2023-06-08)
-
-
-### Bug Fixes
-
-* remove types from ts templates for lint ([#1708](https://github.com/google/blockly-samples/issues/1708)) ([4029e7c](https://github.com/google/blockly-samples/commit/4029e7ced7c916ea0df335c9c930f3dbbbd2db76))
-
-
-
-## [1.4.0](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.3.4...@blockly/create-package@1.4.0) (2023-04-13)
-
-
-### Features
-
-* updated `create-package` plugin to handle generate a TS app ([#1659](https://github.com/google/blockly-samples/issues/1659)) ([c719f24](https://github.com/google/blockly-samples/commit/c719f24bc142c7a6825b81d67b1d3d59ec004374))
-
-
-
-## [1.3.4](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.3.3...@blockly/create-package@1.3.4) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [1.3.3](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.3.2...@blockly/create-package@1.3.3) (2023-03-02)
-
-
-### Bug Fixes
-
-* do not include dist script in template ([#1580](https://github.com/google/blockly-samples/issues/1580)) ([4862db5](https://github.com/google/blockly-samples/commit/4862db56e55e084f16fa52319a58ad73f47737b0))
-
-
-
-## [1.3.2](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.3.1...@blockly/create-package@1.3.2) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [1.3.1](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.3.0...@blockly/create-package@1.3.1) (2023-02-23)
-
-
-### Bug Fixes
-
-* Copy the sample-app files before publishing ([#1578](https://github.com/google/blockly-samples/issues/1578)) ([a7fd02e](https://github.com/google/blockly-samples/commit/a7fd02e1b1eea4e37cd61edab9207ae9f03d091b))
-
-
-
-## [1.3.0](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.2.1...@blockly/create-package@1.3.0) (2023-02-23)
-
-
-### Features
-
-* Add ability to create sample app ([#1553](https://github.com/google/blockly-samples/issues/1553)) ([b7aa6f4](https://github.com/google/blockly-samples/commit/b7aa6f46557ccb0e4da691b8b20f7bb2e47a1044))
-
-
-
-## [1.2.1](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.2.0...@blockly/create-package@1.2.1) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [1.2.0](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.1.23...@blockly/create-package@1.2.0) (2023-02-09)
-
-
-### Features
-
-* add option to create first party plugins, improve names ([#1547](https://github.com/google/blockly-samples/issues/1547)) ([ba1e545](https://github.com/google/blockly-samples/commit/ba1e5450923ad24f3ba886d0be901440e55cab6a))
-
-
-
-## [1.1.23](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.1.22...@blockly/create-package@1.1.23) (2023-02-02)
-
-
-### Bug Fixes
-
-* update templates to use JSON ([#1532](https://github.com/google/blockly-samples/issues/1532)) ([d4f6bbf](https://github.com/google/blockly-samples/commit/d4f6bbf38376f1ad39c9440aac7522a447c1a924))
-
-
-
-## [1.1.22](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.1.21...@blockly/create-package@1.1.22) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [1.1.21](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.1.20...@blockly/create-package@1.1.21) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## [1.1.20](https://github.com/google/blockly-samples/compare/@blockly/create-package@1.1.19...@blockly/create-package@1.1.20) (2022-10-05)
-
-
-### Bug Fixes
-
-* generator imports for use with blockly v9 ([#1305](https://github.com/google/blockly-samples/issues/1305)) ([51d59e9](https://github.com/google/blockly-samples/commit/51d59e98d172400e45fc74755f577e068df9996b))
-
-
-
-## 1.1.19 (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.1.18 (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.1.17 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## 1.1.16 (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.1.15 (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.1.14 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/create-package
-
-
-
-
-
-## 1.1.13 (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.1.12 (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/plugins/dev-create/README.md b/plugins/dev-create/README.md
deleted file mode 100644
index 55107d051..000000000
--- a/plugins/dev-create/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# @blockly/create-package [](https://github.com/google/blockly)
-
-A tool for creating a Blockly plugin or application based on a pre-existing template.
-
-## Creating a plugin
-
-A plugin is a library designed to add functionality to Blockly. It is reusable
-and can be added to an application that uses Blockly. For more information about
-creating plugins in Blockly, see
-[the developer documentation](https://developers.google.com/blockly/guides/contribute/samples/add_a_plugin).
-
-This script can be used to create a new Blockly plugin based on a template.
-
-### Usage
-
-```
-npx @blockly/create-package plugin my-plugin --type plugin
-cd my-plugin
-npm start
-```
-
-### Available templates
-
-`--type field`: A field template.
-
-`--type block`: A block template.
-
-`--type theme`: A theme template.
-
-`--type plugin`: A generic plugin template. (Default)
-
-### Options
-
-Run `npx @blockly/create-package plugin --help` to see the available options.
-
-### Adding TypeScript
-
-```
-npx @blockly/create-package plugin my-plugin --type plugin --typescript
-```
-
-## Creating a new application
-
-An application that uses Blockly is a standalone program, unlike a plugin. If
-you're just getting started with Blockly, you can create a new application based
-on our sample using this script. The app that will be generated contains basic
-infrastructure for running, building, testing, etc. that you can use even if you
-don't understand how to configure the related tool yet. When your needs outgrow
-the functionality provided by it, you can replace the provided configuration or
-tool with your own.
-
-### Usage
-
-```
-npx @blockly/create-package app hello-world
-cd hello-world
-npm start
-```
-
-See the generated `README.md` file after creation for more information.
-
-### Options
-
-Run `npx @blockly/create-package app --help` to see the available options.
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/bin/app.js b/plugins/dev-create/bin/app.js
deleted file mode 100644
index a6b621a0a..000000000
--- a/plugins/dev-create/bin/app.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const chalk = require('chalk');
-const fs = require('fs-extra');
-const path = require('path');
-const execSync = require('child_process').execSync;
-const {checkAndCreateDir} = require('./common');
-
-exports.createApp = function (name, options) {
- const root = process.cwd();
- const dir = options.dir ?? name;
- const appPath = path.join(root, dir);
-
- // Create the new directory for the app if needed.
- checkAndCreateDir(appPath);
- console.log(
- `Creating a new Blockly application called ${name} in ${appPath}`,
- );
-
- // Copy over files from sample-app directory.
- const sampleDir = options.typescript
- ? '../templates/sample-app-ts'
- : '../templates/sample-app';
- const excludes = [
- 'node_modules',
- 'dist',
- 'package-lock.json',
- 'package.json',
- ].map((file) => {
- return path.resolve(__dirname, sampleDir, file);
- });
- fs.copySync(path.resolve(__dirname, sampleDir), appPath, {
- filter(src) {
- return !excludes.includes(src);
- },
- });
-
- // Create package.json file for app.
- const templateJson = require(path.join(sampleDir, 'package.json'));
- const packageJson = {
- ...templateJson,
- name: name,
- author: options.author || '',
- };
-
- // Write the package.json to the new package.
- fs.writeFileSync(
- path.join(appPath, 'package.json'),
- JSON.stringify(packageJson, null, 2),
- );
-
- // Run `npm install` to get things ready for user.
- if (!options.skipInstall) {
- console.log('Installing packages. This might take a couple of minutes.');
- execSync(`cd ${dir} && npm install`, {stdio: 'inherit'});
- }
-
- // Print helpful instructions.
- console.log(chalk.green('Success!'));
-
- console.log('You can start the development server now by typing:');
- console.log(chalk.blue(` cd ${dir}`));
- if (options.skipInstall) {
- console.log(chalk.blue(' npm install'));
- }
- console.log(chalk.blue(' npm start'));
- console.log('See README.md for more commands and information.');
-};
diff --git a/plugins/dev-create/bin/common.js b/plugins/dev-create/bin/common.js
deleted file mode 100644
index 1dac2bf07..000000000
--- a/plugins/dev-create/bin/common.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const fs = require('fs-extra');
-
-/**
- * Create package directory if it doesn't exist yet.
- * Throws if the directory exists and isn't the current directory.
- * @param {string} path Path at which to create directory.
- */
-exports.checkAndCreateDir = function (path) {
- const root = process.cwd();
- // If we're already in the desired directory, don't need to create it.
- if (path == root) {
- return;
- }
- if (fs.existsSync(path)) {
- console.error(
- `Package directory ${path} already exists. Delete it and try again.`,
- );
- process.exit(1);
- } else {
- // Create the directory.
- fs.mkdirSync(path);
- }
-};
diff --git a/plugins/dev-create/bin/create.js b/plugins/dev-create/bin/create.js
deleted file mode 100755
index 367f180bc..000000000
--- a/plugins/dev-create/bin/create.js
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env node
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A script for creating Blockly packages based on pre-existing
- * templates.
- */
-
-'use strict';
-
-const commander = require('commander');
-const scriptPackageJson = require('../package.json');
-const {createApp} = require('./app');
-const {createPlugin} = require('./plugin');
-
-const pluginTypes = ['plugin', 'field', 'block', 'theme'];
-const scriptName = scriptPackageJson.name;
-
-const program = new commander.Command(scriptName);
-
-program
- .command('plugin', {isDefault: true})
- .description('Create a new plugin for Blockly.')
- .version(scriptPackageJson.version)
- .argument('', 'Name of your plugin.')
- .option(
- '-d, --dir ',
- 'specify the directory name to use; defaults to name of plugin',
- )
- .option(
- '-t, --type ',
- `specify the type of the plugin. One of ${pluginTypes.join(', ')}`,
- )
- .option('--typescript', 'use typescript')
- .option('--author ', 'author, eg: Blockly Team')
- .option('--first-party', 'create a first-party plugin')
- .option('--skip-install', 'skip running `npm install` after creation')
- .action((name, options) => {
- createPlugin(name, options);
- });
-
-program
- .command('application')
- .alias('app')
- .description('Create a new application that uses Blockly.')
- .version(scriptPackageJson.version)
- .argument('', 'Name of your application. You can change this later.')
- .option(
- '-d, --dir ',
- 'specify the directory name to use; defaults to name of application',
- )
- .option('--typescript', 'use typescript')
- .option('--author ', 'author, eg: Blockly Team')
- .option('--skip-install', 'skip running `npm install` after creation')
- .action((name, options) => {
- createApp(name, options);
- });
-
-program.parse(process.argv);
diff --git a/plugins/dev-create/bin/plugin.js b/plugins/dev-create/bin/plugin.js
deleted file mode 100644
index c37edc47d..000000000
--- a/plugins/dev-create/bin/plugin.js
+++ /dev/null
@@ -1,215 +0,0 @@
-#!/usr/bin/env node
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A script for creating Blockly plugins based on pre-existing
- * templates.
- */
-
-'use strict';
-
-const chalk = require('chalk');
-const fs = require('fs-extra');
-const path = require('path');
-const execSync = require('child_process').execSync;
-const {checkAndCreateDir} = require('./common');
-
-const pluginTypes = ['plugin', 'field', 'block', 'theme'];
-
-const root = process.cwd();
-
-exports.createPlugin = function (pluginName, options) {
- let gitRoot = '';
- let gitURL = '';
- try {
- gitRoot = execSync(`git rev-parse --show-toplevel`).toString().trim();
- gitURL = execSync(`git config --get remote.origin.url`)
- .toString()
- .trim()
- .replace(/\.git$/, '');
- } catch {
- // NOP
- }
-
- const isGit = !!gitURL;
- const isFirstParty =
- options.firstParty ||
- gitURL == 'https://github.com/RaspberryPiFoundation/blockly-samples';
-
- /**
- * Gets the name of the plugin prefixed with the type.
- * Default to the plugin name if the type=plugin, otherwise use [type]-[name].
- * @param {string} name Plugin name.
- * @param {string} type Plugin type.
- * @returns {string} Plugin name prefixed with type.
- */
- const getPrefixedName = function (name, type) {
- // Don't add 'plugin' prefix for default type
- if (type == 'plugin') return name;
- // If the name is already prefixed, just return the name.
- if (name.startsWith(`${type}-`)) return name;
- // Add the prefix if not already present.
- return `${type}-${name}`;
- };
-
- // Default to type=plugin.
- const pluginType = options.type || 'plugin';
- const prefixedName = getPrefixedName(pluginName, pluginType);
- const pluginDir = options.dir || prefixedName;
- const pluginPath = path.join(root, pluginDir);
- const pluginAuthor = options.author || (isFirstParty ? 'Blockly Team' : '');
-
- const isTypescript = options.typescript;
- const skipInstall = options.skipInstall;
-
- // Check plugin type.
- if (!pluginTypes.includes(pluginType)) {
- console.error(`Unknown plugin type: ${chalk.red(pluginType)}`);
- console.log(`Available types: ${chalk.green(pluginTypes.join(', '))}`);
- process.exit(1);
- }
-
- // Create the new directory if needed.
- checkAndCreateDir(pluginPath);
-
- console.log(
- `Creating a new Blockly ${chalk.green(pluginType)} with name ` +
- `${chalk.green(pluginName)} in ${chalk.green(pluginPath)}.\n`,
- );
-
- const templatesDir = `../templates`;
- const templateDir = `${templatesDir}/${
- isTypescript ? 'typescript-' : ''
- }${pluginType}/`;
-
- // Only use the @blockly scope for first party plugins.
- const pluginScope = isFirstParty ? '@blockly/' : 'blockly-';
- const pluginPackageName = `${pluginScope}${prefixedName}`;
-
- const gitPluginPath = path.join(path.relative(gitRoot, root), pluginDir);
-
- const latestBlocklyVersion = execSync('npm show blockly version')
- .toString()
- .trim();
-
- const packageJson = {
- name: pluginPackageName,
- version: `0.0.0`,
- description: `A Blockly ${pluginType}.`,
- scripts: {
- 'audit:fix': 'blockly-scripts auditFix',
- 'build': 'blockly-scripts build',
- 'clean': 'blockly-scripts clean',
- 'predeploy': 'blockly-scripts predeploy',
- 'start': 'blockly-scripts start',
- 'test': 'blockly-scripts test',
- },
- main: './dist/index.js',
- module: './src/index.js',
- unpkg: './dist/index.js',
- author: pluginAuthor,
- keywords: [
- 'blockly',
- 'blockly-plugin',
- pluginType != 'plugin' && `blockly-${pluginType}`,
- pluginName,
- ].filter(Boolean),
- homepage: isGit ? `${gitURL}/tree/master/${gitPluginPath}#readme` : '',
- bugs: isGit
- ? {
- url: `${gitURL}/issues`,
- }
- : {},
- repository: isGit
- ? {
- type: 'git',
- url: `${gitURL}.git`,
- directory: gitPluginPath,
- }
- : {},
- license: 'Apache-2.0',
- directories: {
- dist: 'dist',
- src: 'src',
- },
- files: ['dist', 'src'],
- devDependencies: {},
- peerDependencies: {
- blockly: `^${latestBlocklyVersion}`,
- },
- publishConfig: isFirstParty
- ? {
- access: 'public',
- }
- : {},
- };
-
- // Add dev dependencies.
- const devDependencies = [
- 'blockly',
- '@blockly/dev-scripts',
- '@blockly/dev-tools',
- ];
- if (isTypescript) {
- devDependencies.push('typescript');
- }
- devDependencies.forEach((dep) => {
- const latestVersion = execSync(`npm show ${dep} version`).toString().trim();
- packageJson.devDependencies[dep] = `^${latestVersion}`;
- });
-
- // Write the README.md to the new package.
- let readme = fs.readFileSync(
- path.resolve(__dirname, templateDir, 'README.md'),
- 'utf-8',
- );
- readme = readme.replace(/@blockly\/plugin/gim, `${pluginPackageName}`);
- fs.writeFileSync(path.join(pluginPath, 'README.md'), readme, 'utf-8');
-
- // Copy the rest of the template folder into the new package.
- fs.copySync(path.resolve(__dirname, templateDir, 'template'), pluginPath);
-
- // Copy third party plugin files to the new package if third-party.
- if (!isFirstParty) {
- fs.copySync(
- path.resolve(__dirname, templatesDir, 'third_party'),
- pluginPath,
- );
- }
-
- // Write the package.json to the new package.
- fs.writeFileSync(
- path.join(pluginPath, 'package.json'),
- JSON.stringify(packageJson, null, 2),
- );
-
- // Run npm install.
- if (!skipInstall) {
- console.log('Installing packages. This might take a couple of minutes.');
- execSync(`cd ${pluginDir} && npm install`, {stdio: 'inherit'});
- }
-
- console.log(
- `Success! Created ${pluginType} '${pluginName}' at ${pluginPath}`,
- );
- console.log(`\n ${chalk.blue(` npm start`)}`);
- console.log(` Starts the development server.\n`);
- console.log(` ${chalk.blue(` npm run build`)}`);
- console.log(` Builds a production build of the plugin.\n`);
- console.log(` ${chalk.blue(` npm test`)}`);
- console.log(` Runs mocha tests.\n\n`);
-
- console.log(`You can begin by typing:`);
- console.log(chalk.blue(` cd ${pluginDir}`));
- if (skipInstall) {
- console.log(chalk.blue(` npm install`));
- }
- console.log(chalk.blue(` npm start`));
- console.log(`Search ${chalk.red(`'TODO'`)} to see remaining tasks.`);
-
- process.exit(1);
-};
diff --git a/plugins/dev-create/package.json b/plugins/dev-create/package.json
deleted file mode 100644
index c26c7a3f5..000000000
--- a/plugins/dev-create/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "name": "@blockly/create-package",
- "version": "13.2.0",
- "description": "A tool for creating a Blockly plugin based on a template.",
- "bin": "./bin/create.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "dev",
- "create",
- "package",
- "plugin",
- "template"
- ],
- "files": [
- "*",
- "templates/sample-app/*",
- "templates/sample-app-ts/*"
- ],
- "scripts": {
- "prepack": "cp -r ../../examples/sample-app ./templates && cp -r ../../examples/sample-app-ts ./templates"
- },
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/dev-create#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/dev-create"
- },
- "license": "Apache-2.0",
- "dependencies": {
- "chalk": "^4.1.2",
- "commander": "^15.0.0",
- "fs-extra": "^11.3.5",
- "install": "^0.13.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/dev-create/templates/block/README.md b/plugins/dev-create/templates/block/README.md
deleted file mode 100644
index cddfaaab7..000000000
--- a/plugins/dev-create/templates/block/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) block that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-### Import
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/plugin';
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/block/template/src/index.js b/plugins/dev-create/templates/block/template/src/index.js
deleted file mode 100644
index 2d2a5c99c..000000000
--- a/plugins/dev-create/templates/block/template/src/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit block overview.
-/**
- * @fileoverview Block overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Update block definition.
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'block_template',
- message0: 'block template',
- style: 'math_blocks',
- },
-]);
diff --git a/plugins/dev-create/templates/block/template/test/block_test.mocha.js b/plugins/dev-create/templates/block/template/test/block_test.mocha.js
deleted file mode 100644
index 9115752ce..000000000
--- a/plugins/dev-create/templates/block/template/test/block_test.mocha.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const Blockly = require('blockly/core');
-const {testHelpers} = require('@blockly/dev-tools');
-const {dartGenerator} = require('blockly/dart');
-const {javascriptGenerator} = require('blockly/javascript');
-const {luaGenerator} = require('blockly/lua');
-const {phpGenerator} = require('blockly/php');
-const {pythonGenerator} = require('blockly/python');
-
-require('../src/index');
-
-const assert = chai.assert;
-
-const {
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = testHelpers;
-
-suite('BlockTemplate', function () {
- /**
- * Asserts that the block has the expected inputs and fields.
- * @param {!Blockly.Block} block The block to check.
- */
- function assertBlockStructure(block) {
- // TODO replace with meaningful assertions.
- assert.exists(block);
- }
-
- setup(function () {
- this.workspace = new Blockly.Workspace();
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- suite('Creation', function () {
- // TODO Add basic test for creation of block using newBlock call.
- const block = this.workspace.newBlock('block_type');
- assertBlockStructure(block);
- });
-
- suite('Code generation', function () {
- const trivialCreateBlock = (workspace) => {
- // TODO implement.
- // return workspace.newBlock('block_type');
- };
-
- /**
- * Test suites for code generation tests.
- * @type {Array}
- */
- const testSuites = [
- // TODO Remove unsupported languages.
- // TODO Update expectedCode for all test cases.
- // TODO Add additional useful testCases.
- {
- title: 'Dart',
- generator: dartGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'TODO',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'JavaScript',
- generator: javascriptGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'TODO',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Lua',
- generator: luaGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'TODO',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'PHP',
- generator: phpGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'TODO',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- {
- title: 'Python',
- generator: pythonGenerator,
- testCases: [
- {
- title: 'Trivial',
- expectedCode: 'TODO',
- createBlock: trivialCreateBlock,
- },
- ],
- },
- ];
- runCodeGenerationTestSuites(testSuites);
- });
-
- /**
- * Test cases for serialization tests.
- * @type {Array}
- */
- const testCases = [
- // TODO update xml and expectedXml.
- {
- title: 'Empty XML',
- xml: ' ',
- expectedXml:
- ' ',
- assertBlockStructure: (block) => {
- // TODO implement.
- // assertBlockStructure(block);
- },
- },
- // TODO add additional test cases.
- ];
- runSerializationTestSuite(testCases, Blockly);
-
- // TODO add any other relevant tests
-});
diff --git a/plugins/dev-create/templates/block/template/test/index.html b/plugins/dev-create/templates/block/template/test/index.html
deleted file mode 100644
index 1b2d48576..000000000
--- a/plugins/dev-create/templates/block/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Block Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/block/template/test/index.js b/plugins/dev-create/templates/block/template/test/index.js
deleted file mode 100644
index 35fbb31e2..000000000
--- a/plugins/dev-create/templates/block/template/test/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Block test.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-// TODO: Edit list of blocks.
-const allBlocks = ['block_template'];
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: {
- kind: 'flyoutToolbox',
- contents: allBlocks.map((b) => {
- return {
- kind: 'block',
- type: b,
- };
- }),
- },
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/field/README.md b/plugins/dev-create/templates/field/README.md
deleted file mode 100644
index eb116453f..000000000
--- a/plugins/dev-create/templates/field/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) ... field.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldTemplate} from '@blockly/plugin';
-Blockly.Blocks["test_field_template"] = {
- init: function () {
- this.appendDummyInput()
- .appendField("template: ")
- .appendField(new FieldTemplate(...), "FIELDNAME");
- }
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/plugin';
-Blockly.defineBlocksWithJsonArray([
- {
- "type": "test_field_template",
- "message0": "template: %1",
- "args0": [
- {
- "type": "field_template",
- "name": "FIELDNAME",
- "value": ...
- }
- ]
- }]);
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/field/template/src/index.js b/plugins/dev-create/templates/field/template/src/index.js
deleted file mode 100644
index 1d10505b5..000000000
--- a/plugins/dev-create/templates/field/template/src/index.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit field overview.
-/**
- * @fileoverview Field overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Rename field and update description.
-/**
- * Field description.
- */
-export class FieldTemplate extends Blockly.Field {
- /**
- * Constructs a FieldTemplate from a JSON arg object.
- * @param {!Object} options A JSON object with options.
- * @returns {!FieldTemplate} The new field instance.
- * @package
- * @nocollapse
- */
- static fromJson(options) {
- // `this` might be a subclass of FieldTemplate if that class doesn't
- // override the static fromJson method.
- return new this(options['value']);
- }
-}
-
-// TODO: Edit field registration key.
-Blockly.fieldRegistry.register('field_template', FieldTemplate);
diff --git a/plugins/dev-create/templates/field/template/test/field_test.mocha.js b/plugins/dev-create/templates/field/template/test/field_test.mocha.js
deleted file mode 100644
index 02cff48f8..000000000
--- a/plugins/dev-create/templates/field/template/test/field_test.mocha.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {FieldTemplate} = require('../src/index');
-
-const {
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldTemplate', function () {
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- // TODO
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- // TODO
- ];
- /**
- * The expected default value for the field being tested.
- * @type {*}
- */
- const defaultFieldValue = 0; // TODO update with default value
- /**
- * Asserts that the field property values are set to default.
- * @param {FieldTemplate} field The field to check.
- */
- const assertFieldDefault = function (field) {
- // TODO Recommend use of assertFieldValue from testHelpers
- };
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldTemplate} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- // TODO
- };
-
- runConstructorSuiteTests(
- FieldTemplate,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldTemplate,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- suite('setValue', function () {
- suite('Empty -> New Value', function () {
- setup(function () {
- this.field = new FieldTemplate();
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- defaultFieldValue,
- );
- });
- suite('Value -> New Value', function () {
- const initialValue = 1; // TODO update with initial value for test.
- setup(function () {
- this.field = new FieldTemplate(initialValue);
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- initialValue,
- );
- });
- });
-
- suite('Validators', function () {
- // TODO
- });
-
- // TODO add any other relevant tests
-});
diff --git a/plugins/dev-create/templates/field/template/test/index.html b/plugins/dev-create/templates/field/template/test/index.html
deleted file mode 100644
index 10cd0a0c1..000000000
--- a/plugins/dev-create/templates/field/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/field/template/test/index.js b/plugins/dev-create/templates/field/template/test/index.js
deleted file mode 100644
index 884fc568e..000000000
--- a/plugins/dev-create/templates/field/template/test/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Field test.
- */
-
-import * as Blockly from 'blockly';
-import {generateFieldTestBlocks, createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-const toolbox = generateFieldTestBlocks('field_template', [
- {
- args: {
- value: 0, // TODO: change default value
- },
- },
-]);
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/plugin/README.md b/plugins/dev-create/templates/plugin/README.md
deleted file mode 100644
index b40da8867..000000000
--- a/plugins/dev-create/templates/plugin/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-
-
-```js
-import * as Blockly from 'blockly';
-import {Plugin} from '@blockly/plugin';
-
-// Inject Blockly.
-const workspace = Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
-});
-
-// Initialize plugin.
-const plugin = new Plugin(workspace);
-plugin.init();
-```
-
-## API
-
-
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/plugin/template/src/index.js b/plugins/dev-create/templates/plugin/template/src/index.js
deleted file mode 100644
index c5ada33d1..000000000
--- a/plugins/dev-create/templates/plugin/template/src/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit plugin overview.
-/**
- * @fileoverview Plugin overview.
- */
-
-// TODO: Rename plugin and edit plugin description.
-/**
- * Plugin description.
- */
-export class Plugin {
- /**
- * Constructor for ...
- * @param {!Blockly.WorkspaceSvg} workspace The workspace that the plugin will
- * be added to.
- */
- constructor(workspace) {
- /**
- * The workspace.
- * @type {!Blockly.WorkspaceSvg}
- * @protected
- */
- this.workspace = workspace;
- }
-
- /**
- * Initialize.
- */
- init() {}
-}
diff --git a/plugins/dev-create/templates/plugin/template/test/index.html b/plugins/dev-create/templates/plugin/template/test/index.html
deleted file mode 100644
index dc96c578f..000000000
--- a/plugins/dev-create/templates/plugin/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/plugin/template/test/index.js b/plugins/dev-create/templates/plugin/template/test/index.js
deleted file mode 100644
index 728651012..000000000
--- a/plugins/dev-create/templates/plugin/template/test/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import {Plugin} from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
-
- // TODO: Initialize your plugin here.
- const plugin = new Plugin(workspace);
- plugin.init();
-
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/theme/README.md b/plugins/dev-create/templates/theme/README.md
deleted file mode 100644
index bf69f7196..000000000
--- a/plugins/dev-create/templates/theme/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) theme that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import Theme from '@blockly/plugin';
-
-Blockly.inject('blocklyDiv', {
- theme: Theme,
-});
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/theme/template/src/index.js b/plugins/dev-create/templates/theme/template/src/index.js
deleted file mode 100644
index a03b6b994..000000000
--- a/plugins/dev-create/templates/theme/template/src/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit theme overview.
-/**
- * @fileoverview Theme overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Edit theme name.
-export default Blockly.Theme.defineTheme('THEME_NAME', {
- base: Blockly.Themes.Classic,
- blockStyles: {},
- categoryStyles: {},
- componentStyles: {},
- fontStyle: {},
- startHats: null,
-});
diff --git a/plugins/dev-create/templates/theme/template/test/index.html b/plugins/dev-create/templates/theme/template/test/index.html
deleted file mode 100644
index 2730c18ef..000000000
--- a/plugins/dev-create/templates/theme/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Theme Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/theme/template/test/index.js b/plugins/dev-create/templates/theme/template/test/index.js
deleted file mode 100644
index de643e272..000000000
--- a/plugins/dev-create/templates/theme/template/test/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Theme test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import Theme from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- theme: Theme,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/third_party/.gitignore b/plugins/dev-create/templates/third_party/.gitignore
deleted file mode 100644
index 800f3a80c..000000000
--- a/plugins/dev-create/templates/third_party/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-/dist
-
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
diff --git a/plugins/dev-create/templates/third_party/GETSTARTED.md b/plugins/dev-create/templates/third_party/GETSTARTED.md
deleted file mode 100644
index 99e93c7e9..000000000
--- a/plugins/dev-create/templates/third_party/GETSTARTED.md
+++ /dev/null
@@ -1,24 +0,0 @@
-This package was bootstrapped with [@blockly/create-package](https://www.npmjs.com/package/@blockly/create-package).
-
-## Available Scripts
-
-In this directory, you can run:
-
-### `npm 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.
-
-### `npm run build`
-
-Builds the package into the `dist` directory.
-
-### `npm run lint`
-
-Runs eslint on the `src` and `test` directories.
-
-### `npm run clean`
-
-Deletes the `dist` and `build` directories if they exist.
diff --git a/plugins/dev-create/templates/typescript-block/README.md b/plugins/dev-create/templates/typescript-block/README.md
deleted file mode 100644
index cddfaaab7..000000000
--- a/plugins/dev-create/templates/typescript-block/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) block that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-### Import
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/plugin';
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/typescript-block/template/src/index.ts b/plugins/dev-create/templates/typescript-block/template/src/index.ts
deleted file mode 100644
index 2d2a5c99c..000000000
--- a/plugins/dev-create/templates/typescript-block/template/src/index.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit block overview.
-/**
- * @fileoverview Block overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Update block definition.
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'block_template',
- message0: 'block template',
- style: 'math_blocks',
- },
-]);
diff --git a/plugins/dev-create/templates/typescript-block/template/test/index.html b/plugins/dev-create/templates/typescript-block/template/test/index.html
deleted file mode 100644
index 1b2d48576..000000000
--- a/plugins/dev-create/templates/typescript-block/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Block Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/typescript-block/template/test/index.ts b/plugins/dev-create/templates/typescript-block/template/test/index.ts
deleted file mode 100644
index 7872103b2..000000000
--- a/plugins/dev-create/templates/typescript-block/template/test/index.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Block test.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-// TODO: Edit list of blocks.
-const allBlocks = ['block_template'];
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: {
- kind: 'flyoutToolbox',
- contents: allBlocks.map((b) => {
- return {
- kind: 'block',
- type: b,
- };
- }),
- },
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/typescript-block/template/tsconfig.json b/plugins/dev-create/templates/typescript-block/template/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/dev-create/templates/typescript-block/template/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/dev-create/templates/typescript-field/README.md b/plugins/dev-create/templates/typescript-field/README.md
deleted file mode 100644
index eb116453f..000000000
--- a/plugins/dev-create/templates/typescript-field/README.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) ... field.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldTemplate} from '@blockly/plugin';
-Blockly.Blocks["test_field_template"] = {
- init: function () {
- this.appendDummyInput()
- .appendField("template: ")
- .appendField(new FieldTemplate(...), "FIELDNAME");
- }
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/plugin';
-Blockly.defineBlocksWithJsonArray([
- {
- "type": "test_field_template",
- "message0": "template: %1",
- "args0": [
- {
- "type": "field_template",
- "name": "FIELDNAME",
- "value": ...
- }
- ]
- }]);
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/typescript-field/template/src/index.ts b/plugins/dev-create/templates/typescript-field/template/src/index.ts
deleted file mode 100644
index 389cd6f79..000000000
--- a/plugins/dev-create/templates/typescript-field/template/src/index.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit field overview.
-/**
- * @fileoverview Field overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Rename field and update description.
-/**
- * Field description.
- */
-export class FieldTemplate extends Blockly.Field {
- /**
- * Constructs a FieldTemplate from a JSON arg object.
- *
- * @param options A JSON object with options.
- * @returns The new field instance.
- * @package
- * @nocollapse
- */
- static fromJson(options): Blockly.Field {
- // `this` might be a subclass of FieldTemplate if that class doesn't
- // override the static fromJson method.
- return new this(options['value']);
- }
-}
-
-// TODO: Edit field registration key.
-Blockly.fieldRegistry.register('field_template', FieldTemplate);
diff --git a/plugins/dev-create/templates/typescript-field/template/test/index.html b/plugins/dev-create/templates/typescript-field/template/test/index.html
deleted file mode 100644
index 10cd0a0c1..000000000
--- a/plugins/dev-create/templates/typescript-field/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/typescript-field/template/test/index.ts b/plugins/dev-create/templates/typescript-field/template/test/index.ts
deleted file mode 100644
index e86fe1e3d..000000000
--- a/plugins/dev-create/templates/typescript-field/template/test/index.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Field test.
- */
-
-import * as Blockly from 'blockly';
-import {generateFieldTestBlocks, createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-const toolbox = generateFieldTestBlocks('field_template', [
- {
- args: {
- value: 0, // TODO: change default value
- },
- },
-]);
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/typescript-field/template/tsconfig.json b/plugins/dev-create/templates/typescript-field/template/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/dev-create/templates/typescript-field/template/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/dev-create/templates/typescript-plugin/README.md b/plugins/dev-create/templates/typescript-plugin/README.md
deleted file mode 100644
index b40da8867..000000000
--- a/plugins/dev-create/templates/typescript-plugin/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-
-
-```js
-import * as Blockly from 'blockly';
-import {Plugin} from '@blockly/plugin';
-
-// Inject Blockly.
-const workspace = Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
-});
-
-// Initialize plugin.
-const plugin = new Plugin(workspace);
-plugin.init();
-```
-
-## API
-
-
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/typescript-plugin/template/src/index.ts b/plugins/dev-create/templates/typescript-plugin/template/src/index.ts
deleted file mode 100644
index fadc340a2..000000000
--- a/plugins/dev-create/templates/typescript-plugin/template/src/index.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit plugin overview.
-/**
- * @fileoverview Plugin overview.
- */
-import * as Blockly from 'blockly/core';
-
-// TODO: Rename plugin and edit plugin description.
-/**
- * Plugin description.
- */
-export class Plugin {
- /** The workspace. */
- protected workspace: Blockly.WorkspaceSvg;
- /**
- * Constructor for ...
- *
- * @param workspace The workspace that the plugin will
- * be added to.
- */
- constructor(workspace: Blockly.WorkspaceSvg) {
- this.workspace = workspace;
- }
-
- /**
- * Initialize.
- */
- init(): void {
- // TODO: Add initialization code.
- }
-}
diff --git a/plugins/dev-create/templates/typescript-plugin/template/test/index.html b/plugins/dev-create/templates/typescript-plugin/template/test/index.html
deleted file mode 100644
index dc96c578f..000000000
--- a/plugins/dev-create/templates/typescript-plugin/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/typescript-plugin/template/test/index.ts b/plugins/dev-create/templates/typescript-plugin/template/test/index.ts
deleted file mode 100644
index fe68e35be..000000000
--- a/plugins/dev-create/templates/typescript-plugin/template/test/index.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import {Plugin} from '../src/index';
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
-
- // TODO: Initialize your plugin here.
- const plugin = new Plugin(workspace);
- plugin.init();
-
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- };
- const rootElement = document.getElementById('root');
- if (!rootElement) {
- throw new Error(`div with id 'root' not found`);
- }
- createPlayground(rootElement, createWorkspace, defaultOptions);
-});
diff --git a/plugins/dev-create/templates/typescript-plugin/template/tsconfig.json b/plugins/dev-create/templates/typescript-plugin/template/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/dev-create/templates/typescript-plugin/template/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/dev-create/templates/typescript-theme/README.md b/plugins/dev-create/templates/typescript-theme/README.md
deleted file mode 100644
index bf69f7196..000000000
--- a/plugins/dev-create/templates/typescript-theme/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# @blockly/plugin [](https://github.com/google/blockly)
-
-
-
-A [Blockly](https://www.npmjs.com/package/blockly) theme that ...
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/plugin
-```
-
-### npm
-
-```
-npm install @blockly/plugin --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import Theme from '@blockly/plugin';
-
-Blockly.inject('blocklyDiv', {
- theme: Theme,
-});
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-create/templates/typescript-theme/template/src/index.ts b/plugins/dev-create/templates/typescript-theme/template/src/index.ts
deleted file mode 100644
index a03b6b994..000000000
--- a/plugins/dev-create/templates/typescript-theme/template/src/index.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// TODO: Edit theme overview.
-/**
- * @fileoverview Theme overview.
- */
-
-import * as Blockly from 'blockly/core';
-
-// TODO: Edit theme name.
-export default Blockly.Theme.defineTheme('THEME_NAME', {
- base: Blockly.Themes.Classic,
- blockStyles: {},
- categoryStyles: {},
- componentStyles: {},
- fontStyle: {},
- startHats: null,
-});
diff --git a/plugins/dev-create/templates/typescript-theme/template/test/index.html b/plugins/dev-create/templates/typescript-theme/template/test/index.html
deleted file mode 100644
index 2730c18ef..000000000
--- a/plugins/dev-create/templates/typescript-theme/template/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Theme Test
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-create/templates/typescript-theme/template/test/index.ts b/plugins/dev-create/templates/typescript-theme/template/test/index.ts
deleted file mode 100644
index ffe3bc49d..000000000
--- a/plugins/dev-create/templates/typescript-theme/template/test/index.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Theme test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import Theme from '../src/index';
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- theme: Theme,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/dev-create/templates/typescript-theme/template/tsconfig.json b/plugins/dev-create/templates/typescript-theme/template/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/dev-create/templates/typescript-theme/template/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/dev-scripts/CHANGELOG.md b/plugins/dev-scripts/CHANGELOG.md
deleted file mode 100644
index 79eb54daa..000000000
--- a/plugins/dev-scripts/CHANGELOG.md
+++ /dev/null
@@ -1,364 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/dev-scripts
-
-
-
-
-
-## [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/plugins/dev-scripts/README.md b/plugins/dev-scripts/README.md
deleted file mode 100644
index e1ee8bfad..000000000
--- a/plugins/dev-scripts/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# @blockly/dev-scripts [](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/plugins/dev-scripts/bin/blockly-scripts.js b/plugins/dev-scripts/bin/blockly-scripts.js
deleted file mode 100755
index ab5b52489..000000000
--- a/plugins/dev-scripts/bin/blockly-scripts.js
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/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/plugins/dev-scripts/config/webpack.config.js b/plugins/dev-scripts/config/webpack.config.js
deleted file mode 100644
index 3799fe891..000000000
--- a/plugins/dev-scripts/config/webpack.config.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/**
- * @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/plugins/dev-scripts/config/webpackDevServer.config.js b/plugins/dev-scripts/config/webpackDevServer.config.js
deleted file mode 100644
index 0e3d3fc47..000000000
--- a/plugins/dev-scripts/config/webpackDevServer.config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @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/plugins/dev-scripts/package.json b/plugins/dev-scripts/package.json
deleted file mode 100644
index dd2917b33..000000000
--- a/plugins/dev-scripts/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "name": "@blockly/dev-scripts",
- "version": "13.2.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.6"
- },
- "peerDependencies": {
- "typescript": "^4.3.2 || ^5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- },
- "publishConfig": {
- "access": "public"
- },
- "devDependencies": {
- "typescript": "^6.0.3"
- }
-}
diff --git a/plugins/dev-scripts/scripts/auditFix.js b/plugins/dev-scripts/scripts/auditFix.js
deleted file mode 100644
index f7daed5b1..000000000
--- a/plugins/dev-scripts/scripts/auditFix.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * @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/plugins/dev-scripts/scripts/build.js b/plugins/dev-scripts/scripts/build.js
deleted file mode 100644
index 8507409bc..000000000
--- a/plugins/dev-scripts/scripts/build.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * @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/plugins/dev-scripts/scripts/clean.js b/plugins/dev-scripts/scripts/clean.js
deleted file mode 100644
index 8528fc546..000000000
--- a/plugins/dev-scripts/scripts/clean.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * @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/plugins/dev-scripts/scripts/predeploy.js b/plugins/dev-scripts/scripts/predeploy.js
deleted file mode 100644
index 922fbcf2e..000000000
--- a/plugins/dev-scripts/scripts/predeploy.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @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/plugins/dev-scripts/scripts/start.js b/plugins/dev-scripts/scripts/start.js
deleted file mode 100644
index 030a1fe0f..000000000
--- a/plugins/dev-scripts/scripts/start.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * @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/plugins/dev-scripts/scripts/test.js b/plugins/dev-scripts/scripts/test.js
deleted file mode 100644
index 8df4aa140..000000000
--- a/plugins/dev-scripts/scripts/test.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * @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/plugins/dev-tools/CHANGELOG.md b/plugins/dev-tools/CHANGELOG.md
deleted file mode 100644
index 9d3b4e9a0..000000000
--- a/plugins/dev-tools/CHANGELOG.md
+++ /dev/null
@@ -1,688 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [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)
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [9.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/dev-tools@9.0.8...@blockly/dev-tools@9.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [9.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/dev-tools@9.0.7...@blockly/dev-tools@9.0.8) (2026-01-15)
-
-
-### Bug Fixes
-
-* Restore `extraState` to `lists_create_with` in the sample toolbox ([#2670](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2670)) ([ecaf83f](https://github.com/RaspberryPiFoundation/blockly-samples/commit/ecaf83f1f85b67921d3463087d76b02f5e21e132))
-
-
-
-## [9.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/dev-tools@9.0.6...@blockly/dev-tools@9.0.7) (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))
-
-
-
-## [9.0.6](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.5...@blockly/dev-tools@9.0.6) (2026-01-05)
-
-
-### Bug Fixes
-
-* Update broken links from Google repo ([#2655](https://github.com/google/blockly-samples/issues/2655)) ([8bd1177](https://github.com/google/blockly-samples/commit/8bd1177c9fa7e67be950c2be14d06a374116561a))
-
-
-
-## [9.0.5](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.4...@blockly/dev-tools@9.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [9.0.4](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.3...@blockly/dev-tools@9.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [9.0.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.2...@blockly/dev-tools@9.0.3) (2025-10-02)
-
-
-### Bug Fixes
-
-* Don't listen for shortcuts on the document. ([#2609](https://github.com/google/blockly-samples/issues/2609)) ([5b1a07c](https://github.com/google/blockly-samples/commit/5b1a07c3e4a4a245cecd783b3e86bc3608ee2c0d))
-
-
-
-## [9.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.1...@blockly/dev-tools@9.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [9.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@9.0.0...@blockly/dev-tools@9.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [9.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.1.2...@blockly/dev-tools@9.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))
-
-
-
-## [8.1.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.1.1...@blockly/dev-tools@8.1.2) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.1.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.1.0...@blockly/dev-tools@8.1.1) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-# [8.1.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.13...@blockly/dev-tools@8.1.0) (2025-02-13)
-
-
-### Features
-
-* Added button to Advanced Playground to import state. ([#2483](https://github.com/google/blockly-samples/issues/2483)) ([fed7ee0](https://github.com/google/blockly-samples/commit/fed7ee0e82cd0a2f3d2f00cec69abd5932feb42f))
-
-
-
-
-
-## [8.0.13](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.12...@blockly/dev-tools@8.0.13) (2024-12-19)
-
-
-### Bug Fixes
-
-* Update screenshot plugin for compatibility with CSS vars. ([#2472](https://github.com/google/blockly-samples/issues/2472)) ([eecfccd](https://github.com/google/blockly-samples/commit/eecfccda56027a613d76f9ace70e62d9143f1c2e))
-
-
-
-
-
-## [8.0.12](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.11...@blockly/dev-tools@8.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.11](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.10...@blockly/dev-tools@8.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.10](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.9...@blockly/dev-tools@8.0.10) (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)
-
-
-
-
-
-## [8.0.9](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.8...@blockly/dev-tools@8.0.9) (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))
-
-
-
-
-
-## [8.0.8](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.7...@blockly/dev-tools@8.0.8) (2024-08-22)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.7](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.6...@blockly/dev-tools@8.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.6](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.5...@blockly/dev-tools@8.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.5](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.4...@blockly/dev-tools@8.0.5) (2024-07-25)
-
-
-### Bug Fixes
-
-* dev-tools only set monaco model and text when changing ([#2417](https://github.com/google/blockly-samples/issues/2417)) ([20be3a3](https://github.com/google/blockly-samples/commit/20be3a3b43af41987f631b931d65121d761f6377)), closes [/github.com/mit-cml/workspace-multiselect/pull/62#issuecomment-2196819235](https://github.com/google//github.com/mit-cml/workspace-multiselect/pull/62/issues/issuecomment-2196819235) [/github.com/mit-cml/workspace-multiselect/pull/62#issuecomment-2212561339](https://github.com/google//github.com/mit-cml/workspace-multiselect/pull/62/issues/issuecomment-2212561339) [/github.com/mit-cml/workspace-multiselect/pull/62#issuecomment-2214203536](https://github.com/google//github.com/mit-cml/workspace-multiselect/pull/62/issues/issuecomment-2214203536)
-
-
-
-## [8.0.4](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.3...@blockly/dev-tools@8.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.2...@blockly/dev-tools@8.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.1...@blockly/dev-tools@8.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [8.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@8.0.0...@blockly/dev-tools@8.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))
-
-
-
-## [8.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.11...@blockly/dev-tools@8.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))
-
-
-### 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)
-* Fix the instructions for configuring the debug renderer. ([#2365](https://github.com/google/blockly-samples/issues/2365)) ([ec5405a](https://github.com/google/blockly-samples/commit/ec5405a604aee28c040ebeb55a032fe8e1aafdd3))
-* Include disabled block pattern in screenshot. ([#2189](https://github.com/google/blockly-samples/issues/2189)) ([b60f7be](https://github.com/google/blockly-samples/commit/b60f7beefda331371c53a2ec183cb4e062f223af))
-
-
-
-## [7.1.11](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.10...@blockly/dev-tools@7.1.11) (2024-05-16)
-
-
-### Bug Fixes
-
-* remove keyboard nav option from dev-tools ([#2347](https://github.com/google/blockly-samples/issues/2347)) ([6215a7e](https://github.com/google/blockly-samples/commit/6215a7e92db5df0f7bca9d8e637eea179b052d54))
-
-
-
-## [7.1.10](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.9...@blockly/dev-tools@7.1.10) (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))
-
-
-
-## [7.1.9](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.8...@blockly/dev-tools@7.1.9) (2024-04-25)
-
-
-### Bug Fixes
-
-* update screenshot.js DOM text reinterpreted as HTML ([7a5dcea](https://github.com/google/blockly-samples/commit/7a5dcea446117e632be2a10eb88c81b84c9fdd66))
-* Update screenshot.js DOM text reinterpreted as HTML ([#2328](https://github.com/google/blockly-samples/issues/2328)) ([5665493](https://github.com/google/blockly-samples/commit/5665493a10869a258d59ef561907a2fd7e9e2cca))
-
-
-
-## [7.1.8](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.7...@blockly/dev-tools@7.1.8) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.1.7](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.6...@blockly/dev-tools@7.1.7) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.1.6](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.5...@blockly/dev-tools@7.1.6) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.1.5](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.4...@blockly/dev-tools@7.1.5) (2023-12-14)
-
-
-### Bug Fixes
-
-* Fix TS errors in plugins/toolbox-search ([#2074](https://github.com/google/blockly-samples/issues/2074)) ([0d18a82](https://github.com/google/blockly-samples/commit/0d18a82137c7a88087a332ece1bb0deff386a390))
-
-
-
-## [7.1.4](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.3...@blockly/dev-tools@7.1.4) (2023-12-07)
-
-
-### Bug Fixes
-
-* Prevent advanced playground OOMing when scrolling aggressively ([#2089](https://github.com/google/blockly-samples/issues/2089)) ([a662278](https://github.com/google/blockly-samples/commit/a662278cb9c511e001ee3cd2977a891976ea06a9))
-
-
-
-## [7.1.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.2...@blockly/dev-tools@7.1.3) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.1.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.1...@blockly/dev-tools@7.1.2) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.1.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.1.0...@blockly/dev-tools@7.1.1) (2023-10-30)
-
-
-### Bug Fixes
-
-* Advanced playground should use JSON instead of XML on reload ([#1966](https://github.com/google/blockly-samples/issues/1966)) ([cc8b6b1](https://github.com/google/blockly-samples/commit/cc8b6b10ed6107eb270df994fdd1026e2c409a54))
-
-
-
-## [7.1.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.0.3...@blockly/dev-tools@7.1.0) (2023-09-14)
-
-
-### Features
-
-* make playground open state persistent ([#1921](https://github.com/google/blockly-samples/issues/1921)) ([#1921](https://github.com/google/blockly-samples/issues/1921)) ([f06f64f](https://github.com/google/blockly-samples/commit/f06f64f8ab2785f587dda1875d5b2b194ed7e7f3))
-
-
-### Bug Fixes
-
-* args and types for PlaygroundAPI.addGenerator ([#1889](https://github.com/google/blockly-samples/issues/1889)) ([#1889](https://github.com/google/blockly-samples/issues/1889)) ([f5598a6](https://github.com/google/blockly-samples/commit/f5598a65a26761c3854af06ee7a5a13b46d5ffdb))
-
-
-
-## [7.0.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.0.2...@blockly/dev-tools@7.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.0.1...@blockly/dev-tools@7.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@7.0.0...@blockly/dev-tools@7.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@6.0.1...@blockly/dev-tools@7.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@6.0.0...@blockly/dev-tools@6.0.1) (2023-07-06)
-
-
-### Bug Fixes
-
-* debug renderer for v10 ([#1747](https://github.com/google/blockly-samples/issues/1747)) ([3914045](https://github.com/google/blockly-samples/commit/3914045ab25ffbf05c25c3b7e17fee7963e4ec60))
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.3.2...@blockly/dev-tools@6.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))
-
-
-
-## [5.3.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.3.1...@blockly/dev-tools@5.3.2) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.3.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.3.0...@blockly/dev-tools@5.3.1) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.3.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.6...@blockly/dev-tools@5.3.0) (2023-05-11)
-
-
-### Features
-
-* Add angle, colour, and multiline fields. (Rebase of [#1674](https://github.com/google/blockly-samples/issues/1674)) ([#1693](https://github.com/google/blockly-samples/issues/1693)) ([1b447f4](https://github.com/google/blockly-samples/commit/1b447f41d6293f14e846b8a4d82d289a5637a99a))
-
-
-
-## [5.2.6](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.5...@blockly/dev-tools@5.2.6) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.2.5](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.4...@blockly/dev-tools@5.2.5) (2023-04-27)
-
-
-### Bug Fixes
-
-* Correct date field test assertions ([#1673](https://github.com/google/blockly-samples/issues/1673)) ([9974e85](https://github.com/google/blockly-samples/commit/9974e85becaa8ad17e35b588b95391c85865dafd))
-
-
-
-## [5.2.4](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.3...@blockly/dev-tools@5.2.4) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.2.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.2...@blockly/dev-tools@5.2.3) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.2.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.1...@blockly/dev-tools@5.2.2) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.2.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.2.0...@blockly/dev-tools@5.2.1) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [5.2.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.1.1...@blockly/dev-tools@5.2.0) (2023-02-23)
-
-
-### Features
-
-* add procedure blocks ([#1544](https://github.com/google/blockly-samples/issues/1544)) ([c190eca](https://github.com/google/blockly-samples/commit/c190eca57865090d9b6027ae4af7eecf425396e8))
-
-
-
-## [5.1.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.1.0...@blockly/dev-tools@5.1.1) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.1.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.5...@blockly/dev-tools@5.1.0) (2023-02-09)
-
-
-### Features
-
-* add procedure events ([#1536](https://github.com/google/blockly-samples/issues/1536)) ([05a02ae](https://github.com/google/blockly-samples/commit/05a02aed7f3f59758db83eb2d8459ce727405d4d))
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.4...@blockly/dev-tools@5.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.3...@blockly/dev-tools@5.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.2...@blockly/dev-tools@5.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.1...@blockly/dev-tools@5.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@5.0.0...@blockly/dev-tools@5.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/dev-tools@4.0.3...@blockly/dev-tools@5.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* add missing removeGenerator function in Playground API type ([#1224](https://github.com/google/blockly-samples/issues/1224)) ([#1274](https://github.com/google/blockly-samples/issues/1274)) ([9e92461](https://github.com/google/blockly-samples/commit/9e9246153d4089aaa1c9ad011cf5812e3c136f13))
-* generator imports for use with blockly v9 ([#1305](https://github.com/google/blockly-samples/issues/1305)) ([51d59e9](https://github.com/google/blockly-samples/commit/51d59e98d172400e45fc74755f577e068df9996b))
-* references to deprecated functions in v9 ([#1313](https://github.com/google/blockly-samples/issues/1313)) ([cb2e679](https://github.com/google/blockly-samples/commit/cb2e67987e0b62a77c26adc660cc6ade1ba67954))
-
-
-### Reverts
-
-* Revert "chore: fix generator imports in dev tools (#1236)" (#1266) ([4da4fd7](https://github.com/google/blockly-samples/commit/4da4fd71e9d56e78075d9809e75ab058cf0cca0e)), closes [#1236](https://github.com/google/blockly-samples/issues/1236) [#1266](https://github.com/google/blockly-samples/issues/1266)
-
-
-### 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))
-
-
-
-## 4.0.3 (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))
-
-
-
-
-
-## 4.0.2 (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))
-
-
-
-
-
-## 3.1.9 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## 3.1.8 (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))
-
-
-
-
-
-## 3.1.7 (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))
-
-
-
-
-
-## 3.1.6 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/dev-tools
-
-
-
-
-
-## 3.1.5 (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))
-
-
-
-
-
-## 3.1.4 (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/plugins/dev-tools/README.md b/plugins/dev-tools/README.md
deleted file mode 100644
index 58c8c2040..000000000
--- a/plugins/dev-tools/README.md
+++ /dev/null
@@ -1,216 +0,0 @@
-# @blockly/dev-tools [](https://github.com/google/blockly)
-
-A library of helpful tools for Blockly development.
-
-## Installation
-
-```
-npm install @blockly/dev-tools -D --save
-```
-
-## Usage
-
-### Playground
-
-The playground is a tremendously useful tool for debugging your Blockly project. As a preview, here is [one of the plugin playgrounds](https://raspberrypifoundation.github.io/blockly-samples/plugins/theme-modern/test/). The playground features are:
-
-- All the default blocks
-- All the language generators (JavaScript, Python, PHP, Lua, and Dart)
-- Switch between different Blockly options (eg: rtl, renderer, readOnly, zoom and scroll)
-- Switch between different toolboxes and themes
-- Import and export programs, or generate code using one of the built-in generators
-- Trigger programmatic actions (eg: Show/hide, Clear, Undo/Redo, Scale)
-- A debug renderer
-- Stress tests for the renderer
-- Log all events in the console
-
-```js
-import {createPlayground} from '@blockly/dev-tools';
-
-const defaultOptions = {
- ...
-};
-createPlayground(document.getElementById('blocklyDiv'), (blocklyDiv, options) => {
- return Blockly.inject(blocklyDiv, options);
-}, defaultOptions);
-```
-
-This package also exports pieces of the playground (addGUIControls, addCodeEditor) if you'd rather build your own playground.
-
-### Toolboxes
-
-Blockly built-in Simple and Category toolboxes.
-
-```js
-import * as Blockly from 'blockly';
-import {toolboxSimple, toolboxCategories} from '@blockly/dev-tools';
-
-Blockly.inject('blocklyDiv', {
- toolbox: toolboxCategories,
-});
-```
-
-#### Test Toolbox
-
-The test toolbox is re-exported in this package, but can be imported as a stand-alone through [@blockly/block-test](https://www.npmjs.com/package/@blockly/block-test). See the README for details.
-
-### Helpers
-
-#### `populateRandom`
-
-The `populateRandom` function adds random blocks to a workspace. Blocks are selected from the full set of defined blocks. Pass in a worskpace and how many blocks should be created.
-
-```js
-import {populateRandom} from '@blockly/dev-tools';
-// Add 10 random blocks to the workspace.
-populateRandom(workspace, 10);
-```
-
-#### `spaghetti`
-
-The `spaghetti` function is a renderer stress test that populates the workspace with nested if-statements. Pass in a worskpace and how deep the nesting should be.
-
-```js
-import {spaghetti} from '@blockly/dev-tools';
-spaghetti(workspace, 8);
-```
-
-#### `generateFieldTestBlocks`
-
-The `generateFieldTestBlocks` function automatically generates a number of field testing blocks for the passed-in field. This is useful for testing field plugins.
-
-```js
-import {generateFieldTestBlocks} from '@blockly/dev-tools';
-
-const toolbox = generateFieldTestBlocks('field_template', [
- {
- args: {
- value: 0, // default value
- },
- },
-]);
-```
-
-### Test Helpers
-
-This package is also used in mocha tests, and exports a suite of useful test helpers.
-You can find the full list of helpers [here](https://github.com/RaspberryPiFoundation/blockly-samples/blob/master/plugins/dev-tools/src/test_helpers.mocha.js).
-
-### Debug Renderer
-
-The [debug renderer][dev-tools] is a renderer plugin that wraps your normal
-renderer, and visualizes the measurements the [render info][render-info]
-collects. This is extremely helpful for understanding what your renderer thinks
-about the block it is trying to render.
-
-#### What it surfaces
-
-The debug renderer can show you several different things.
-
-
-
- Debug info
- Image
- Description
-
- Rows
-
- The bounds of the individual rows in a block.
-
- Row spacers
-
- The bounds of the row spacers in a block.
-
-
- Elements
-
- The bounds of the elements in a block.
-
-
- Element spacers
-
- The bounds of the element spacers in a block.
-
-
- Connections
-
-
- The locations of the connection points, with large circles for next and
- input connections (parent connections) and small circles for output and
- previous connections (child connections).
-
-
-
- Block bounds
-
-
- The bounds of the block, not including any child blocks.
-
-
-
- Connectioned block bounds
-
-
- The bounds of the block, including child blocks.
-
-
-
- Render / paint
-
-
- Flashes the block red when the renderer rerenders the block, equivalent
- to paint flashing
- in Chrome.
-
-
-
-
-#### How to use it
-
-The debug renderer wraps your existing renderer, and then you can register and
-use it just like any other renderer.
-
-```js
-import {createNewRenderer, DebugDrawer} from '@blockly/dev-tools';
-
-const DebugRenderer = createNewRenderer(YourCustomRenderer);
-Blockly.blockRendering.register('debugRenderer', DebugRenderer);
-
-Blockly.inject('blocklyDiv', {renderer: 'debugRenderer'});
-```
-
-To see the different information the debug renderer surfaces, you can modify
-the config from the browser console.
-
-```js
-DebugDrawer.config = {
- rows: true,
- rowSpacers: true,
- elems: true,
- elemSpacers: true,
- connections: true,
- blockBounds: true,
- connectedBlockBounds: true,
- render: true,
-};
-```
-
-[render-info]: https://developers.google.com/blocklyguides/create-custom-blocks/appearance/renderers/concepts/info
-[dev-tools]: https://www.npmjs.com/package/@blockly/dev-tools
-
-### Logger
-
-A lightweight workspace console logger.
-
-```js
-import {logger} from '@blockly/dev-tools';
-
-logger.enableLogger(workspace);
-logger.disableLogger(workspace);
-```
-
-The logger is included by default in the playground.
-
-## License
-
-Apache 2.0
diff --git a/plugins/dev-tools/package.json b/plugins/dev-tools/package.json
deleted file mode 100644
index 242b133a2..000000000
--- a/plugins/dev-tools/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "name": "@blockly/dev-tools",
- "version": "13.2.0",
- "description": "A library of common utilities for Blockly extension development.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "start": "blockly-scripts start"
- },
- "main": "dist/index.js",
- "module": "./src/index.js",
- "unpkg": "./dist/index.js",
- "types": "./src/index.d.ts",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "dev",
- "tools"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/dev-tools#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/dev-tools"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "dependencies": {
- "@blockly/block-test": "^13.2.0",
- "@blockly/theme-dark": "^13.2.0",
- "@blockly/theme-deuteranopia": "^13.2.0",
- "@blockly/theme-highcontrast": "^13.2.0",
- "@blockly/theme-tritanopia": "^13.2.0",
- "chai": "^6.2.2",
- "dat.gui": "^0.7.9",
- "lodash.assign": "^4.2.0",
- "lodash.merge": "^4.6.2",
- "monaco-editor": "^0.57.0",
- "sinon": "^22.0.0"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@types/dat.gui": "^0.7.13"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/dev-tools/readme-media/block-bounds-with-children.png b/plugins/dev-tools/readme-media/block-bounds-with-children.png
deleted file mode 100644
index a2214b6ee..000000000
Binary files a/plugins/dev-tools/readme-media/block-bounds-with-children.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/block-bounds.png b/plugins/dev-tools/readme-media/block-bounds.png
deleted file mode 100644
index d41c69339..000000000
Binary files a/plugins/dev-tools/readme-media/block-bounds.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/connection.png b/plugins/dev-tools/readme-media/connection.png
deleted file mode 100644
index 16acaa821..000000000
Binary files a/plugins/dev-tools/readme-media/connection.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/element-spacer.png b/plugins/dev-tools/readme-media/element-spacer.png
deleted file mode 100644
index d264d784f..000000000
Binary files a/plugins/dev-tools/readme-media/element-spacer.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/element.png b/plugins/dev-tools/readme-media/element.png
deleted file mode 100644
index 801654125..000000000
Binary files a/plugins/dev-tools/readme-media/element.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/row-spacer.png b/plugins/dev-tools/readme-media/row-spacer.png
deleted file mode 100644
index a400ca5df..000000000
Binary files a/plugins/dev-tools/readme-media/row-spacer.png and /dev/null differ
diff --git a/plugins/dev-tools/readme-media/row.png b/plugins/dev-tools/readme-media/row.png
deleted file mode 100644
index 811858238..000000000
Binary files a/plugins/dev-tools/readme-media/row.png and /dev/null differ
diff --git a/plugins/dev-tools/src/block_test_helpers.mocha.js b/plugins/dev-tools/src/block_test_helpers.mocha.js
deleted file mode 100644
index 7564368aa..000000000
--- a/plugins/dev-tools/src/block_test_helpers.mocha.js
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {assert} from 'chai';
-import * as sinon from 'sinon';
-import * as commonTestHelpers from './common_test_helpers.mocha';
-import * as Blockly from 'blockly/core';
-
-const {runTestCases, runTestSuites, TestCase, TestSuite} = commonTestHelpers;
-
-/**
- * Code generation test case configuration.
- * @implements {TestCase}
- * @record
- */
-export class CodeGenerationTestCase {
- /**
- * Class for a code generation test case.
- */
- constructor() {
- /**
- * @type {string} The expected code.
- */
- this.expectedCode;
- /**
- * @type {boolean|undefined} Whether to use workspaceToCode instead of
- * blockToCode for test.
- */
- this.useWorkspaceToCode;
- /**
- * @type {number|undefined} The expected inner order.
- */
- this.expectedInnerOrder;
- }
-
- /**
- * Creates the block to use for this test case.
- * @param {!Blockly.Workspace} workspace The workspace context for this
- * test.
- * @returns {!Blockly.Block} The block to use for the test case.
- */
- createBlock(workspace) {}
-}
-
-/**
- * Code generation test suite.
- * @extends {TestSuite}
- * @record
- */
-export class CodeGenerationTestSuite {
- /**
- * Class for a code generation test suite.
- */
- constructor() {
- /**
- * @type {!Blockly.Generator} The generator to use for running test cases.
- */
- this.generator;
- }
-}
-
-/**
- * Serialization test case.
- * @implements {TestCase}
- * @record
- */
-export class SerializationTestCase {
- /**
- * Class for a block serialization test case.
- */
- constructor() {
- /**
- * @type {string} The block xml to use for test. Do not provide if json is
- * provided.
- */
- this.xml;
- /**
- * @type {string|undefined} The expected xml after round trip. Provided if
- * it different from xml that was passed in.
- */
- this.expectedXml;
- /**
- * @type {string} The block json to use for test. Do not provide if xml is
- * provided.
- */
- this.json;
- /**
- * @type {string|undefined} The expected json after round trip. Provided if
- * it is different from json that was passed in.
- */
- this.expectedJson;
- }
- /**
- * Asserts that the block created from xml has the expected structure.
- * @param {!Blockly.Block} block The block to check.
- */
- assertBlockStructure(block) {}
-}
-
-/**
- * Returns mocha test callback for code generation based on provided
- * generator.
- * @param {!Blockly.Generator} generator The generator to use in test.
- * @returns {function(!CodeGenerationTestCase):!Function} Function that
- * returns mocha test callback based on test case.
- * @private
- */
-const createCodeGenerationTestFn_ = (generator) => {
- return (testCase) => {
- return function () {
- const block = testCase.createBlock(this.workspace);
- let code;
- let innerOrder;
- if (testCase.useWorkspaceToCode) {
- code = generator.workspaceToCode(this.workspace);
- } else {
- generator.init(this.workspace);
- code = generator.blockToCode(block);
- if (Array.isArray(code)) {
- innerOrder = code[1];
- code = code[0];
- }
- }
- const assertFunc =
- typeof testCase.expectedCode === 'string' ? assert.equal : assert.match;
- assertFunc(code, testCase.expectedCode);
- if (
- !testCase.useWorkspaceToCode &&
- testCase.expectedInnerOrder !== undefined
- ) {
- assert.equal(innerOrder, testCase.expectedInnerOrder);
- }
- };
- };
-};
-
-/**
- * Runs blockToCode test suites.
- * @param {!Array} testSuites The test suites to run.
- */
-export const runCodeGenerationTestSuites = (testSuites) => {
- /**
- * Creates function used to generate mocha test callback.
- * @param {!CodeGenerationTestSuite} suiteInfo The test suite information.
- * @returns {function(!CodeGenerationTestCase):!Function} Function that
- * creates mocha test callback.
- */
- const createTestFn = (suiteInfo) => {
- return createCodeGenerationTestFn_(suiteInfo.generator);
- };
-
- runTestSuites(testSuites, createTestFn);
-};
-
-/**
- * Runs serialization test suite.
- * @param {!Array} testCases The test cases to run.
- * @param {?Blockly} blockly The instance of Blockly to use for the
- * tests. Optional, but must be supplied and must correspond to
- * the instance used to create this.workspace if that would not
- * otherwise be the case.
- */
-export const runSerializationTestSuite = (testCases, blockly = Blockly) => {
- /**
- * Creates test callback for xmlToBlock test.
- * @param {!SerializationTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createSerializedDataToBlockTestCallback = (testCase) => {
- return function () {
- let block;
- if (testCase.json) {
- block = blockly.serialization.blocks.append(
- testCase.json,
- this.workspace,
- {recordUndo: true},
- );
- } else {
- block = blockly.Xml.domToBlock(
- blockly.utils.xml.textToDom(testCase.xml),
- this.workspace,
- );
- }
- if (globalThis.clock) globalThis.clock.runAll();
- testCase.assertBlockStructure(block);
- };
- };
- /**
- * Creates test callback for xml round trip test.
- * @param {!SerializationTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createRoundTripTestCallback = (testCase) => {
- return function () {
- if (testCase.json) {
- const block = blockly.serialization.blocks.append(
- testCase.json,
- this.workspace,
- {recordUndo: true},
- );
- if (globalThis.clock) globalThis.clock.runAll();
- const generatedJson = blockly.serialization.blocks.save(block);
- const expectedJson = testCase.expectedJson || testCase.json;
- assert.deepEqual(generatedJson, expectedJson);
- } else {
- const block = blockly.Xml.domToBlock(
- blockly.utils.xml.textToDom(testCase.xml),
- this.workspace,
- );
- if (globalThis.clock) globalThis.clock.runAll();
- const generatedXml = blockly.Xml.domToPrettyText(
- blockly.Xml.blockToDom(block),
- );
- const expectedXml = testCase.expectedXml || testCase.xml;
- assert.equal(generatedXml, expectedXml);
- }
- };
- };
- suite('Serialization', function () {
- suite('append block', function () {
- runTestCases(testCases, createSerializedDataToBlockTestCallback);
- });
- suite('serialization round-trip', function () {
- setup(function () {
- sinon.stub(blockly.utils.idGenerator.TEST_ONLY, 'genUid').returns('1');
- });
-
- teardown(function () {
- sinon.restore();
- });
-
- runTestCases(testCases, createRoundTripTestCallback);
- });
- });
-};
diff --git a/plugins/dev-tools/src/common_test_helpers.mocha.js b/plugins/dev-tools/src/common_test_helpers.mocha.js
deleted file mode 100644
index 24672c5eb..000000000
--- a/plugins/dev-tools/src/common_test_helpers.mocha.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * Test case configuration.
- * @record
- */
-export class TestCase {
- /**
- * Class for a test case configuration.
- */
- constructor() {
- /**
- * @type {string} The title for the test case.
- */
- this.title;
- /**
- * @type {boolean|undefined} Whether this test case should be skipped.
- * Used to skip buggy test case and should have an associated bug.
- */
- this.skip;
- /**
- * @type {boolean|undefined} Whether this test case should be called as
- * only. Used for debugging.
- */
- this.only;
- }
-}
-
-/**
- * Test suite configuration.
- * @record
- * @template {TestCase} T
- * @template {TestSuite} U
- */
-export class TestSuite {
- /**
- * Class for a test suite configuration.
- */
- constructor() {
- /**
- * @type {string} The title for the test case.
- */
- this.title;
- /**
- * @type {?Array} The associated test cases.
- */
- this.testCases;
- /**
- * @type {?Array} List of nested inner test suites.
- */
- this.testSuites;
- /**
- * @type {boolean|undefined} Whether this test suite should be skipped.
- * Used to skip buggy test case and should have an associated bug.
- */
- this.skip;
- /**
- * @type {boolean|undefined} Whether this test suite should be called as
- * only. Used for debugging.
- */
- this.only;
- }
-}
-
-/**
- * Runs provided test cases.
- * @template {TestCase} T
- * @param {!Array} testCases The test cases to run.
- * @param {function(T):Function} createTestCallback Creates test
- * callback using given test case.
- */
-export function runTestCases(testCases, createTestCallback) {
- testCases.forEach((testCase) => {
- let testCall = testCase.skip ? test.skip : test;
- testCall = testCase.only ? test.only : testCall;
- testCall(testCase.title, createTestCallback(testCase));
- });
-}
-
-/**
- * Runs provided test suite.
- * @template {TestCase} T
- * @template {TestSuite} U
- * @param {Array} testSuites The test suites to run.
- * @param {function(!U):(function(T):!Function)
- * } createTestCaseCallback Creates test case callback using given test
- * suite.
- */
-export function runTestSuites(testSuites, createTestCaseCallback) {
- testSuites.forEach((testSuite) => {
- let suiteCall = testSuite.skip ? suite.skip : suite;
- suiteCall = testSuite.only ? suite.only : suiteCall;
- suiteCall(testSuite.title, function () {
- if (testSuite.testSuites && testSuite.testSuites.length) {
- runTestSuites(testSuite.testSuites, createTestCaseCallback);
- }
- if (testSuite.testCases && testSuite.testCases.length) {
- runTestCases(testSuite.testCases, createTestCaseCallback(testSuite));
- }
- });
- });
-}
-
-/**
- * Captures the strings sent to console.warn() when calling a function.
- * Copies from core.
- * @param {Function} innerFunc The function where warnings may called.
- * @returns {Array} The warning messages (only the first arguments).
- */
-export function captureWarnings(innerFunc) {
- const msgs = [];
- const nativeConsoleWarn = console.warn;
- try {
- console.warn = function (msg) {
- msgs.push(msg);
- };
- innerFunc();
- } finally {
- console.warn = nativeConsoleWarn;
- }
- return msgs;
-}
diff --git a/plugins/dev-tools/src/debug.js b/plugins/dev-tools/src/debug.js
deleted file mode 100644
index 5adbb7aa5..000000000
--- a/plugins/dev-tools/src/debug.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-import {DebugDrawer} from './debugDrawer';
-
-/**
- * The name that the debug renderer is registered under.
- * @type {string}
- */
-export const debugRendererName = 'debugRenderer';
-
-/**
- * Creates and registers a renderer that draws debug rectangles on top of the
- * blocks. This renderer extends the renderer with the given name.
- * @param {string} name The name of the renderer we want to debug.
- */
-export function registerDebugRendererFromName(name) {
- if (!Blockly.registry.hasItem(Blockly.registry.Type.RENDERER, name)) {
- throw Error(
- 'No renderer with the name ' +
- name +
- ' is registered. ' +
- 'Please register your renderer using Blockly.registry.register.',
- );
- }
- const RendererClass = Blockly.registry.getClass(
- Blockly.registry.Type.RENDERER,
- name,
- );
-
- const DebugRenderer = createNewRenderer(RendererClass);
-
- Blockly.registry.register(
- Blockly.registry.Type.RENDERER,
- debugRendererName,
- DebugRenderer,
- true,
- );
-}
-
-/**
- * Creates a debug renderer.
- * @param {function(new: Blockly.blockRendering.Renderer)} Renderer The
- * original renderer we are going to extend.
- * @returns {function(new: Blockly.blockRendering.Renderer)} The renderer with
- * the necessary logic to draw the debug rectangles.
- */
-export function createNewRenderer(Renderer) {
- /**
- * The debug renderer.
- */
- class DebugRenderer extends Renderer {
- /**
- * Maps the id of a block to the object that draws
- * the debug rectangles.
- * @type {!Object}
- */
- blockToDebugger = Object.create(null);
-
- /**
- * Maps the workspace to the workspace event listener.
- * @type {!Object}
- */
- workspaceListeners = Object.create(null);
-
- /** @override */
- render(block) {
- super.render(block);
- const debugDrawer = this.getDebugger_(block);
- const info = this.makeRenderInfo_(block);
-
- info.measure();
- debugDrawer.drawDebug(block, info);
- }
-
- /**
- * Gets the debug renderer for the given block.
- * If we have already created a debugger for this block, use that debugger
- * so that it can remove any previously created html elements.
- * @param {Blockly.BlockSvg} block The block that is about to be rendered.
- * @returns {DebugDrawer} The object used to draw the debug rectangles
- * on the block.
- * @private
- */
- getDebugger_(block) {
- let debugDrawer = this.blockToDebugger[block.id];
-
- if (!debugDrawer) {
- this.regiserWorkspaceListener_(block.workspace);
- debugDrawer = new DebugRenderer.DebugDrawerClass(this.getConstants());
- this.blockToDebugger[block.id] = debugDrawer;
- }
- return debugDrawer;
- }
-
- /**
- * Adds a change listener to the given workspace to remove the reference to
- * the block's debugger when a block is deleted.
- * @param {Blockly.WorkspaceSvg} workspace The workspace to add the change
- * listener to.
- * @private
- */
- regiserWorkspaceListener_(workspace) {
- const workspaceListener = this.workspaceListeners[workspace.id];
-
- if (!workspaceListener) {
- this.workspaceListeners[workspace.id] = workspace.addChangeListener(
- (event) => {
- const blockIds = event.ids;
- if (event.type === Blockly.Events.DELETE) {
- for (let i = 0; i < blockIds.length; i++) {
- const blockId = blockIds[i];
- if (this.blockToDebugger[blockId]) {
- delete this.blockToDebugger[blockId];
- }
- }
- }
- },
- );
- }
- }
- }
- DebugRenderer.DebugDrawerClass = DebugDrawer;
- return DebugRenderer;
-}
diff --git a/plugins/dev-tools/src/debugDrawer.js b/plugins/dev-tools/src/debugDrawer.js
deleted file mode 100644
index 4950b8abe..000000000
--- a/plugins/dev-tools/src/debugDrawer.js
+++ /dev/null
@@ -1,456 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Visualizer for debugging custom renderers in Blockly.
- * @author fenichel@google.com (Rachel Fenichel)
- */
-import * as Blockly from 'blockly/core';
-
-/**
- * A basic visualizer for debugging custom renderers.
- */
-export class DebugDrawer {
- /**
- * An object that renders rectangles and dots for debugging rendering code.
- * @param {!Blockly.blockRendering.ConstantProvider} constants The renderer's
- * constants.
- * @package
- * @constructor
- */
- constructor(constants) {
- /**
- * An array of SVG elements that have been created by this object.
- * @type {Array.}
- * @private
- */
- this.debugElements_ = [];
-
- /**
- * The SVG root of the block that is being rendered. Debug elements will
- * be attached to this root.
- * @type {SVGElement}
- * @private
- */
- this.svgRoot_ = null;
-
- /**
- * The renderer's constant provider.
- * @type {!Blockly.blockRendering.ConstantProvider}
- * @private
- */
- this.constants_ = constants;
- }
-
- /**
- * Remove all elements the this object created on the last pass.
- * @protected
- */
- clearElems() {
- for (let i = 0, elem; (elem = this.debugElements_[i]); i++) {
- Blockly.utils.dom.removeNode(elem);
- }
-
- this.debugElements_ = [];
- }
-
- /**
- * Draw a debug rectangle for a spacer (empty) row.
- * @param {!Blockly.blockRendering.Row} row The row to render.
- * @param {number} cursorY The y position of the top of the row.
- * @param {boolean} isRtl Whether the block is rendered RTL.
- * @protected
- */
- drawSpacerRow(row, cursorY, isRtl) {
- if (!DebugDrawer.config.rowSpacers) {
- return;
- }
-
- const height = Math.abs(row.height);
- const isNegativeSpacing = row.height < 0;
- if (isNegativeSpacing) {
- cursorY -= height;
- }
-
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'rowSpacerRect blockRenderDebug',
- 'x': isRtl ? -(row.xPos + row.width) : row.xPos,
- 'y': cursorY,
- 'width': row.width,
- 'height': height,
- 'stroke': isNegativeSpacing ? 'black' : 'blue',
- 'fill': 'blue',
- 'fill-opacity': '0.5',
- 'stroke-width': '1px',
- },
- this.svgRoot_,
- ),
- );
- }
-
- /**
- * Draw a debug rectangle for a horizontal spacer.
- * @param {!Blockly.blockRendering.InRowSpacer} elem The spacer to render.
- * @param {number} rowHeight The height of the container row.
- * @param {boolean} isRtl Whether the block is rendered RTL.
- * @protected
- */
- drawSpacerElem(elem, rowHeight, isRtl) {
- if (!DebugDrawer.config.elemSpacers) {
- return;
- }
-
- const width = Math.abs(elem.width);
- const isNegativeSpacing = elem.width < 0;
- let xPos = isNegativeSpacing ? elem.xPos - width : elem.xPos;
- if (isRtl) {
- xPos = -(xPos + width);
- }
- const yPos = elem.centerline - elem.height / 2;
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'elemSpacerRect blockRenderDebug',
- 'x': xPos,
- 'y': yPos,
- 'width': width,
- 'height': elem.height,
- 'stroke': 'pink',
- 'fill': isNegativeSpacing ? 'black' : 'pink',
- 'fill-opacity': '0.5',
- 'stroke-width': '1px',
- },
- this.svgRoot_,
- ),
- );
- }
-
- /**
- * Draw a debug rectangle for an in-row element.
- * @param {!Blockly.blockRendering.Measurable} elem The element to render.
- * @param {boolean} isRtl Whether the block is rendered RTL.
- * @protected
- */
- drawRenderedElem(elem, isRtl) {
- if (DebugDrawer.config.elems) {
- let xPos = elem.xPos;
- if (isRtl) {
- xPos = -(xPos + elem.width);
- }
- const yPos = elem.centerline - elem.height / 2;
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'rowRenderingRect blockRenderDebug',
- 'x': xPos,
- 'y': yPos,
- 'width': elem.width,
- 'height': elem.height,
- 'stroke': 'black',
- 'fill': 'none',
- 'stroke-width': '1px',
- },
- this.svgRoot_,
- ),
- );
-
- if (
- Blockly.blockRendering.Types.isField(elem) &&
- elem.field instanceof Blockly.FieldLabel
- ) {
- const baseline = this.constants_.FIELD_TEXT_BASELINE;
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'rowRenderingRect blockRenderDebug',
- 'x': xPos,
- 'y': yPos + baseline,
- 'width': elem.width,
- 'height': '0.1px',
- 'stroke': 'red',
- 'fill': 'none',
- 'stroke-width': '0.5px',
- },
- this.svgRoot_,
- ),
- );
- }
- }
-
- if (
- Blockly.blockRendering.Types.isInput(elem) &&
- DebugDrawer.config.connections
- ) {
- this.drawConnection(elem.connectionModel);
- }
- }
-
- /**
- * Draw a circle at the location of the given connection. Inputs and outputs
- * share the same colours, as do previous and next. When positioned correctly
- * a connected pair will look like a bullseye.
- * @param {Blockly.RenderedConnection} conn The connection to circle.
- * @protected
- */
- drawConnection(conn) {
- if (!DebugDrawer.config.connections) {
- return;
- }
-
- let colour;
- let size;
- let fill;
- if (conn.type == Blockly.INPUT_VALUE) {
- size = 4;
- colour = 'magenta';
- fill = 'none';
- } else if (conn.type == Blockly.OUTPUT_VALUE) {
- size = 2;
- colour = 'magenta';
- fill = colour;
- } else if (conn.type == Blockly.NEXT_STATEMENT) {
- size = 4;
- colour = 'goldenrod';
- fill = 'none';
- } else if (conn.type == Blockly.PREVIOUS_STATEMENT) {
- size = 2;
- colour = 'goldenrod';
- fill = colour;
- }
- // TODO(blockly/7227): This method is still internal, so we're going to
- // have continual problems. We should consider making it public.
- const offset = conn.getOffsetInBlock();
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'circle',
- {
- class: 'blockRenderDebug',
- cx: offset.x,
- cy: offset.y,
- r: size,
- fill: fill,
- stroke: colour,
- },
- this.svgRoot_,
- ),
- );
- }
-
- /**
- * Draw a debug rectangle for a non-empty row.
- * @param {!Blockly.blockRendering.Row} row The non-empty row to render.
- * @param {number} cursorY The y position of the top of the row.
- * @param {boolean} isRtl Whether the block is rendered RTL.
- * @protected
- */
- drawRenderedRow(row, cursorY, isRtl) {
- if (!DebugDrawer.config.rows) {
- return;
- }
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'elemRenderingRect blockRenderDebug',
- 'x': isRtl ? -(row.xPos + row.width) : row.xPos,
- 'y': row.yPos,
- 'width': row.width,
- 'height': row.height,
- 'stroke': 'red',
- 'fill': 'none',
- 'stroke-width': '1px',
- },
- this.svgRoot_,
- ),
- );
-
- if (Blockly.blockRendering.Types.isTopOrBottomRow(row)) {
- return;
- }
-
- if (DebugDrawer.config.connectedBlockBounds) {
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'connectedBlockWidth blockRenderDebug',
- 'x': isRtl ? -(row.xPos + row.widthWithConnectedBlocks) : row.xPos,
- 'y': row.yPos,
- 'width': row.widthWithConnectedBlocks,
- 'height': row.height,
- 'stroke': this.randomColour_,
- 'fill': 'none',
- 'stroke-width': '1px',
- 'stroke-dasharray': '3,3',
- },
- this.svgRoot_,
- ),
- );
- }
- }
-
- /**
- * Draw debug rectangles for a non-empty row and all of its subcomponents.
- * @param {!Blockly.blockRendering.Row} row The non-empty row to render.
- * @param {number} cursorY The y position of the top of the row.
- * @param {boolean} isRtl Whether the block is rendered RTL.
- * @protected
- */
- drawRowWithElements(row, cursorY, isRtl) {
- for (let i = 0, l = row.elements.length; i < l; i++) {
- const elem = row.elements[i];
- if (!elem) {
- console.warn('A row has an undefined or null element.', row, elem);
- continue;
- }
- if (Blockly.blockRendering.Types.isSpacer(elem)) {
- this.drawSpacerElem(
- /** @type {!Blockly.blockRendering.InRowSpacer} */ (elem),
- row.height,
- isRtl,
- );
- } else {
- this.drawRenderedElem(elem, isRtl);
- }
- }
- this.drawRenderedRow(row, cursorY, isRtl);
- }
-
- /**
- * Draw a debug rectangle around the entire block.
- * @param {!Blockly.blockRendering.RenderInfo} info Rendering information
- * about the block to debug.
- * @protected
- */
- drawBoundingBox(info) {
- if (!DebugDrawer.config.blockBounds) {
- return;
- }
- // Bounding box without children.
- let xPos = info.RTL ? -info.width : 0;
- const yPos = 0;
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'blockBoundingBox blockRenderDebug',
- 'x': xPos,
- 'y': yPos,
- 'width': info.width,
- 'height': info.height,
- 'stroke': 'black',
- 'fill': 'none',
- 'stroke-width': '1px',
- 'stroke-dasharray': '5,5',
- },
- this.svgRoot_,
- ),
- );
-
- if (DebugDrawer.config.connectedBlockBounds) {
- // Bounding box with children.
- xPos = info.RTL ? -info.widthWithChildren : 0;
- this.debugElements_.push(
- Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- 'class': 'blockRenderDebug',
- 'x': xPos,
- 'y': yPos,
- 'width': info.widthWithChildren,
- 'height': info.height,
- 'stroke': '#DF57BC',
- 'fill': 'none',
- 'stroke-width': '1px',
- 'stroke-dasharray': '3,3',
- },
- this.svgRoot_,
- ),
- );
- }
- }
-
- /**
- * Do all of the work to draw debug information for the whole block.
- * @param {!Blockly.BlockSvg} block The block to draw debug information for.
- * @param {!Blockly.blockRendering.RenderInfo} info Rendering information
- * about the block to debug.
- */
- drawDebug(block, info) {
- this.clearElems();
- this.svgRoot_ = block.getSvgRoot();
-
- this.randomColour_ =
- '#' + Math.floor(Math.random() * 16777215).toString(16);
-
- let cursorY = 0;
- for (let i = 0, row; (row = info.rows[i]); i++) {
- if (Blockly.blockRendering.Types.isBetweenRowSpacer(row)) {
- this.drawSpacerRow(row, cursorY, info.RTL);
- } else {
- this.drawRowWithElements(row, cursorY, info.RTL);
- }
- cursorY += row.height;
- }
-
- if (block.previousConnection) {
- this.drawConnection(block.previousConnection);
- }
- if (block.nextConnection) {
- this.drawConnection(block.nextConnection);
- }
- if (block.outputConnection) {
- this.drawConnection(block.outputConnection);
- }
- if (info.rightSide) {
- this.drawRenderedElem(info.rightSide, info.RTL);
- }
-
- this.drawBoundingBox(info);
-
- this.drawRender(block.pathObject.svgPath);
- }
-
- /**
- * Show a debug filter to highlight that a block has been rendered.
- * @param {!SVGElement} svgPath The block's svg path.
- * @protected
- */
- drawRender(svgPath) {
- if (!DebugDrawer.config.render) {
- return;
- }
- svgPath.setAttribute(
- 'filter',
- 'url(#' + this.constants_.debugFilterId + ')',
- );
- setTimeout(function () {
- svgPath.setAttribute('filter', '');
- }, 100);
- }
-}
-
-/**
- * Configuration object containing booleans to enable and disable debug
- * rendering of specific rendering components.
- * @type {!Object.}
- */
-DebugDrawer.config = {
- rowSpacers: true,
- elemSpacers: true,
- rows: true,
- elems: true,
- connections: true,
- blockBounds: true,
- connectedBlockBounds: true,
- render: true,
-};
diff --git a/plugins/dev-tools/src/event_test_helpers.mocha.js b/plugins/dev-tools/src/event_test_helpers.mocha.js
deleted file mode 100644
index eb01f6bc5..000000000
--- a/plugins/dev-tools/src/event_test_helpers.mocha.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const Blockly = require('blockly/core');
-const sinon = require('sinon');
-
-/**
- * Returns a matcher that asserts that the actual object has the same properties
- * and values (shallowly equated) as the expected object.
- * @param {!Object} expected The expected set of properties we expect the
- * actual object to have.
- * @returns {function(*): boolean} A matcher that returns true if the `actual`
- * object has all of the properties of the `expected` param, with the same
- * values.
- */
-function shallowMatch(expected) {
- return (actual) => {
- for (const key in expected) {
- if (actual[key] !== expected[key]) {
- return false;
- }
- }
- return true;
- };
-}
-
-/**
- * Asserts that an event with the given values (shallowly evaluated) was fired.
- * @param {!sinon.SinonSpyCall|!sinon.SinonSpy} spy The spy or spy call to use.
- * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance
- * type of event fired.
- * @param {!Object} expectedProperties Map of of expected properties
- * to check on fired event.
- * @param {string} expectedWorkspaceId Expected workspace id of event fired.
- * @param {?string=} expectedBlockId Expected block id of event fired.
- */
-export function assertEventFiredShallow(
- spy,
- instanceType,
- expectedProperties,
- expectedWorkspaceId,
- expectedBlockId,
-) {
- const properties = {
- ...expectedProperties,
- workspaceId: expectedWorkspaceId,
- blockId: expectedBlockId,
- };
- sinon.assert.match(
- /** @type {sinon.SinonSpy} */ (spy).getCalls()[0].firstArg,
- sinon.match
- .instanceOf(instanceType)
- .and(sinon.match(shallowMatch(properties))),
- );
- // TODO: Why does the above assert work but not this one???
- // Also it does work when it's in the other pluging
- // sinon.assert.calledWith(
- // spy,
- // sinon.match.instanceOf(instanceType)
- // .and(sinon.match(shallowMatch(properties))));
-}
-
-/**
- * Asserts that an event with the given values was not fired.
- * @param {!sinon.SinonSpy} spy The spy to use.
- * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance
- * type of event fired.
- * @param {!Object} expectedProperties Map of of expected properties
- * to check on fired event.
- * @param {string=} expectedWorkspaceId Expected workspace id of event fired.
- * @param {?string=} expectedBlockId Expected block id of event fired.
- */
-export function assertEventNotFired(
- spy,
- instanceType,
- expectedProperties,
- expectedWorkspaceId,
- expectedBlockId,
-) {
- if (expectedWorkspaceId !== undefined) {
- expectedProperties.workspaceId = expectedWorkspaceId;
- }
- if (expectedBlockId !== undefined) {
- expectedProperties.blockId = expectedBlockId;
- }
- const expectedEvent = sinon.match
- .instanceOf(instanceType)
- .and(sinon.match(expectedProperties));
- sinon.assert.neverCalledWith(spy, expectedEvent);
-}
diff --git a/plugins/dev-tools/src/field_test_helpers.mocha.js b/plugins/dev-tools/src/field_test_helpers.mocha.js
deleted file mode 100644
index 1eb54fab3..000000000
--- a/plugins/dev-tools/src/field_test_helpers.mocha.js
+++ /dev/null
@@ -1,310 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {assert} from 'chai';
-import {runTestCases, TestCase} from './common_test_helpers.mocha';
-
-/**
- * Field value test case.
- * @implements {TestCase}
- * @record
- */
-export class FieldValueTestCase {
- /**
- * Class for a field value test case.
- */
- constructor() {
- /**
- * @type {*} The value to use in test.
- */
- this.value;
- /**
- * @type {*} The expected value.
- */
- this.expectedValue;
- /**
- * @type {string|undefined} The expected text value. Provided if different
- * from String(expectedValue).
- */
- this.expectedText;
- /**
- * @type {!RegExp|string|undefined} The optional error message matcher.
- * Provided if test case is expected to throw.
- */
- this.errMsgMatcher;
- }
-}
-
-/**
- * Field creation test case.
- * @extends {FieldValueTestCase}
- * @record
- */
-export class FieldCreationTestCase {
- /**
- * Class for a field creation test case.
- */
- constructor() {
- /**
- * @type {Array<*>} The arguments to pass to field constructor.
- */
- this.args;
- /**
- * @type {string} The json to use in field creation.
- */
- this.json;
- }
-}
-
-/**
- * Assert a field's value is the same as the expected value.
- * @param {!Blockly.Field} field The field.
- * @param {*} expectedValue The expected value.
- * @param {string=} expectedText The expected text.
- */
-export function assertFieldValue(
- field,
- expectedValue,
- expectedText = undefined,
-) {
- const actualValue = field.getValue();
- const actualText = field.getText();
- if (expectedText === undefined) {
- expectedText = String(expectedValue);
- }
- assert.equal(actualValue, expectedValue, 'Value');
- assert.equal(actualText, expectedText, 'Text');
-}
-
-/**
- * Runs provided creation test cases.
- * @param {!Array} testCases The test cases to run.
- * @param {function(!Blockly.Field, !FieldCreationTestCase)} assertion The
- * assertion to use.
- * @param {function(new:Blockly.Field,!FieldCreationTestCase):Blockly.Field
- * } creation A function that returns an instance of the field based on the
- * provided test case.
- * @private
- */
-function runCreationTests_(testCases, assertion, creation) {
- /**
- * Creates test callback for creation test.
- * @param {FieldCreationTestCase} testCase The test case to use.
- * @returns {Function} The test callback.
- */
- const createTestFn = (testCase) => {
- return function () {
- const field = creation.call(this, testCase);
- assertion(field, testCase);
- };
- };
- runTestCases(testCases, createTestFn);
-}
-
-/**
- * Runs provided creation test cases.
- * @param {!Array} testCases The test cases to run.
- * @param {function(new:Blockly.Field,!FieldCreationTestCase):Blockly.Field
- * } creation A function that returns an instance of the field based on the
- * provided test case.
- * @private
- */
-function runCreationTestsAssertThrows_(testCases, creation) {
- /**
- * Creates test callback for creation test.
- * @param {!FieldCreationTestCase} testCase The test case to use.
- * @returns {!Function} The test callback.
- */
- const createTestFn = (testCase) => {
- return function () {
- assert.throws(function () {
- creation.call(this, testCase);
- }, testCase.errMsgMatcher);
- };
- };
- runTestCases(testCases, createTestFn);
-}
-
-/**
- * Runs suite of tests for constructor for the specified field.
- * @param {function(new:Blockly.Field, *=)} TestedField The class of the field
- * being tested.
- * @param {Array} validValueTestCases Test cases with
- * valid values for given field.
- * @param {Array} invalidValueTestCases Test cases with
- * invalid values for given field.
- * @param {function(!Blockly.Field, !FieldCreationTestCase)
- * } validRunAssertField Asserts that field has expected values.
- * @param {function(!Blockly.Field)=} assertFieldDefault Asserts that field has
- * default values. If undefined, tests will check that field throws when
- * invalid value is passed rather than asserting default.
- * @param {function(!FieldCreationTestCase=)=} customCreateWithJs Custom
- * creation function to use in tests.
- */
-export function runConstructorSuiteTests(
- TestedField,
- validValueTestCases,
- invalidValueTestCases,
- validRunAssertField,
- assertFieldDefault,
- customCreateWithJs,
-) {
- suite('Constructor', function () {
- if (assertFieldDefault) {
- test('Empty', function () {
- const field = customCreateWithJs
- ? customCreateWithJs.call(this)
- : new TestedField();
- assertFieldDefault(field);
- });
- } else {
- test('Empty', function () {
- assert.throws(function () {
- customCreateWithJs
- ? customCreateWithJs.call(this)
- : new TestedField();
- });
- });
- }
-
- /**
- * Creates a field using its constructor and the provided test case.
- * @param {!FieldCreationTestCase} testCase The test case information.
- * @returns {!Blockly.Field} The instantiated field.
- */
- const createWithJs = function (testCase) {
- return customCreateWithJs
- ? customCreateWithJs.call(this, testCase)
- : new TestedField(...testCase.args);
- };
- if (assertFieldDefault) {
- runCreationTests_(
- invalidValueTestCases,
- assertFieldDefault,
- createWithJs,
- );
- } else {
- runCreationTestsAssertThrows_(invalidValueTestCases, createWithJs);
- }
- runCreationTests_(validValueTestCases, validRunAssertField, createWithJs);
- });
-}
-
-/**
- * Runs suite of tests for fromJson creation of specified field.
- * @param {function(new:Blockly.Field, *=)} TestedField The class of the field
- * being tested.
- * @param {!Array} validValueTestCases Test cases with
- * valid values for given field.
- * @param {!Array} invalidValueTestCases Test cases with
- * invalid values for given field.
- * @param {function(!Blockly.Field, !FieldValueTestCase)
- * } validRunAssertField Asserts that field has expected values.
- * @param {function(!Blockly.Field)=} assertFieldDefault Asserts that field has
- * default values. If undefined, tests will check that field throws when
- * invalid value is passed rather than asserting default.
- * @param {function(!FieldCreationTestCase=)=} customCreateWithJson Custom
- * creation function to use in tests.
- */
-export function runFromJsonSuiteTests(
- TestedField,
- validValueTestCases,
- invalidValueTestCases,
- validRunAssertField,
- assertFieldDefault,
- customCreateWithJson,
-) {
- suite('fromJson', function () {
- if (assertFieldDefault) {
- test('Empty', function () {
- const field = customCreateWithJson
- ? customCreateWithJson.call(this)
- : TestedField.fromJson({});
- assertFieldDefault(field);
- });
- } else {
- test('Empty', function () {
- assert.throws(function () {
- customCreateWithJson
- ? customCreateWithJson.call(this)
- : TestedField.fromJson({});
- });
- });
- }
-
- /**
- * Creates a field using fromJson and the provided test case.
- * @param {!FieldCreationTestCase} testCase The test case information.
- * @returns {!Blockly.Field} The instantiated field.
- */
- const createWithJson = function (testCase) {
- return customCreateWithJson
- ? customCreateWithJson.call(this, testCase)
- : TestedField.fromJson(testCase.json);
- };
- if (assertFieldDefault) {
- runCreationTests_(
- invalidValueTestCases,
- assertFieldDefault,
- createWithJson,
- );
- } else {
- runCreationTestsAssertThrows_(invalidValueTestCases, createWithJson);
- }
- runCreationTests_(validValueTestCases, validRunAssertField, createWithJson);
- });
-}
-
-/**
- * Runs tests for setValue calls.
- * @param {!Array} validValueTestCases Test cases with
- * valid values.
- * @param {!Array} invalidValueTestCases Test cases with
- * invalid values.
- * @param {*} invalidRunExpectedValue Expected value for field after invalid
- * call to setValue.
- * @param {string=} invalidRunExpectedText Expected text for field after invalid
- * call to setValue.
- */
-export function runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- invalidRunExpectedValue,
- invalidRunExpectedText,
-) {
- /**
- * Creates test callback for invalid setValue test.
- * @param {!FieldValueTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createInvalidSetValueTestCallback = (testCase) => {
- return function () {
- this.field.setValue(testCase.value);
- assertFieldValue(
- this.field,
- invalidRunExpectedValue,
- invalidRunExpectedText,
- );
- };
- };
- /**
- * Creates test callback for valid setValue test.
- * @param {!FieldValueTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createValidSetValueTestCallback = (testCase) => {
- return function () {
- this.field.setValue(testCase.value);
- assertFieldValue(
- this.field,
- testCase.expectedValue,
- testCase.expectedText,
- );
- };
- };
- runTestCases(invalidValueTestCases, createInvalidSetValueTestCallback);
- runTestCases(validValueTestCases, createValidSetValueTestCallback);
-}
diff --git a/plugins/dev-tools/src/generateFieldTestBlocks.js b/plugins/dev-tools/src/generateFieldTestBlocks.js
deleted file mode 100644
index e0ac8f0ef..000000000
--- a/plugins/dev-tools/src/generateFieldTestBlocks.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A field test helper that generates blocks with the field in
- * various configurations.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * Generates a number of field testing blocks for a specific field and returns
- * the toolbox xml string.
- * @param {string} fieldName The name of the field.
- * @param {Object|Array=} options An options object containing a label
- * and an args map that is passed to the field during initialization. If an
- * array is passed, multiple groups of blocks are created each with
- * different initialization arguments.
- * @returns {string} The toolbox XML string.
- */
-export function generateFieldTestBlocks(fieldName, options) {
- if (!Array.isArray(options)) {
- options = [options || {}];
- }
-
- let id = 0;
- let toolboxXml = '';
- const blocks = [];
-
- options.forEach((m) => {
- if (m.label) {
- // Add label.
- toolboxXml += ` `;
- }
-
- // Define a single field block.
- const singleFieldBlock = `${++id}test_${fieldName}_single`;
- blocks.push({
- type: singleFieldBlock,
- message0: '%1',
- args0: [
- {
- type: fieldName,
- name: 'FIELDNAME',
- ...m.args,
- alt: {
- type: 'field_label',
- text: `No ${fieldName}`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- });
- toolboxXml += ` `;
- toolboxXml += ` `;
-
- // Define a block and add the 'single field block' as a shadow.
- const parentBlock = `${++id}test_${fieldName}_parent`;
- blocks.push({
- type: `${parentBlock}`,
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- });
-
- toolboxXml += `
-
-
-
-
- `;
- toolboxXml += ` `;
-
- // Define a block with the field on it.
- const blockWithField = `${++id}test_${fieldName}_block`;
- blocks.push({
- type: blockWithField,
- message0: 'block %1',
- args0: [
- {
- type: fieldName,
- name: 'FIELDNAME',
- ...m.args,
- alt: {
- type: 'field_label',
- text: `No ${fieldName}`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- });
- toolboxXml += ` `;
- toolboxXml += ` `;
-
- // Add a block that includes the 'block with the field' as a shadow.
- toolboxXml += `
-
-
-
-
- `;
- });
-
- Blockly.defineBlocksWithJsonArray(blocks);
-
- return `
- ${toolboxXml}
- `;
-}
diff --git a/plugins/dev-tools/src/index.d.ts b/plugins/dev-tools/src/index.d.ts
deleted file mode 100644
index cc3a00659..000000000
--- a/plugins/dev-tools/src/index.d.ts
+++ /dev/null
@@ -1,120 +0,0 @@
-import * as Blockly from 'blockly/core';
-import * as dat from 'dat.gui';
-
-interface FieldGeneratorOptions {
- label?: string;
- args: {[key: string]: unknown};
-}
-
-interface PlaygroundTab {
- generate: () => void;
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- state: any;
- tabElement: HTMLElement;
-}
-
-interface PlaygroundAPI {
- addAction: (
- name: string,
- callback: (workspace: Blockly.Workspace) => void,
- folder?: string,
- ) => dat.GUIController;
- addCheckboxAction: (
- name: string,
- callback: (workspace: Blockly.Workspace, value: boolean) => void,
- folder?: string,
- defaultValue?: boolean,
- ) => dat.GUIController;
- addGenerator: (
- label: string,
- generator: Blockly.Generator,
- language?: string,
- ) => void;
- getCurrentTab: () => PlaygroundTab;
- getGUI: () => DevTools.GUI;
- getWorkspace: () => Blockly.WorkspaceSvg;
- removeGenerator: (label: string) => void;
-}
-
-declare namespace DevTools {
- /**
- * A basic visualizer for debugging custom renderers.
- */
- export class DebugRenderer extends Blockly.blockRendering.Debug {
- static init(): void;
- }
-
- /**
- * An extension of dat.GUI with additional functionality.
- */
- export class GUI extends dat.GUI {
- addAction(
- name: string,
- callback: (workspace: Blockly.Workspace) => void,
- folder?: string,
- ): dat.GUIController;
- addCheckboxAction: (
- name: string,
- callback: (workspace: Blockly.Workspace, value: boolean) => void,
- folder?: string,
- defaultValue?: boolean,
- ) => dat.GUIController;
- getWorkspace: () => Blockly.WorkspaceSvg;
- }
-
- /**
- * Create the Blockly playground.
- *
- * @param container
- * @param createWorkspace
- * @param defaultOptions
- * @param vsEditorPath
- * @returns A promise to the playground API.
- */
- function createPlayground(
- container: HTMLElement,
- createWorkspace?: (
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
- ) => Blockly.Workspace,
- defaultOptions?: Blockly.BlocklyOptions,
- vsEditorPath?: string,
- ): Promise;
-
- /**
- * Use dat.GUI to add controls to adjust configuration of a Blockly workspace.
- *
- * @param createWorkspace
- * @param defaultOptions
- * @returns The dat.GUI instance.
- */
- function addGUIControls(
- createWorkspace: (options: Blockly.BlocklyOptions) => Blockly.Workspace,
- defaultOptions: Blockly.BlocklyOptions,
- ): GUI;
-
- /**
- * Generates a number of field testing blocks for a specific field and returns
- * the toolbox xml string.
- *
- * @param fieldName
- * @param options
- * @returns The toolbox xml string.
- */
- export function generateFieldTestBlocks(
- fieldName: string,
- options?: FieldGeneratorOptions | FieldGeneratorOptions[],
- ): string;
-
- /**
- * A toolbox xml with built-in blocks split into categories.
- */
- const toolboxCategories: Blockly.utils.toolbox.ToolboxInfo;
-
- /**
- * A simple toolbox xml with built-in blocks and no categories.
- */
- const toolboxSimple: Blockly.utils.toolbox.ToolboxInfo;
-}
-
-export = DevTools;
diff --git a/plugins/dev-tools/src/index.js b/plugins/dev-tools/src/index.js
deleted file mode 100644
index 6cd083b8f..000000000
--- a/plugins/dev-tools/src/index.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-import {DebugDrawer} from './debugDrawer';
-import {createNewRenderer} from './debug';
-import {generateFieldTestBlocks} from './generateFieldTestBlocks';
-import {populateRandom} from './populateRandom';
-import {downloadWorkspaceScreenshot} from './screenshot';
-import {spaghetti} from './spaghetti';
-import * as logger from './logger';
-import * as testHelpers from './test_helpers.mocha';
-import {toolboxTestBlocksInit, toolboxTestBlocks} from '@blockly/block-test';
-import toolboxCategories from './toolboxCategories';
-import toolboxSimple from './toolboxSimple';
-
-let addGUIControls;
-let addCodeEditor;
-let createPlayground;
-if (typeof window !== 'undefined') {
- addGUIControls = require('./playground/options').addGUIControls;
- addCodeEditor = require('./playground/monaco').addCodeEditor;
- createPlayground = require('./playground/').createPlayground;
-}
-
-// Export Blockly into the global namespace to make it easier to debug from the
-// console.
-globalThis.Blockly = Blockly;
-
-export {
- addCodeEditor,
- addGUIControls,
- createNewRenderer,
- createPlayground,
- DebugDrawer,
- downloadWorkspaceScreenshot,
- generateFieldTestBlocks,
- populateRandom,
- logger,
- spaghetti,
- testHelpers,
- toolboxCategories,
- toolboxSimple,
- toolboxTestBlocks,
- toolboxTestBlocksInit,
-};
diff --git a/plugins/dev-tools/src/logger.js b/plugins/dev-tools/src/logger.js
deleted file mode 100644
index 98d3f57e9..000000000
--- a/plugins/dev-tools/src/logger.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A workspace console logger.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-/**
- * Enables console logging of workspace events.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- */
-export function enableLogger(workspace) {
- workspace.addChangeListener(log);
-}
-
-/**
- * Disables console logging of workspace events.
- * @param {!Blockly.Workspace} workspace The Blockly workspace.
- */
-export function disableLogger(workspace) {
- workspace.removeChangeListener(log);
-}
-
-/**
- * Logs a Blockly event directory to the console.
- * @param {!Blockly.Events.Abstract} e The Blockly event.
- */
-function log(e) {
- console.log(e);
-}
diff --git a/plugins/dev-tools/src/playground/hash_state.js b/plugins/dev-tools/src/playground/hash_state.js
deleted file mode 100644
index fb1c82c79..000000000
--- a/plugins/dev-tools/src/playground/hash_state.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview State manager for window.location.hash.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-/**
- * A class that manages loading / storing the state from a window hash.
- */
-export class HashState {
- /**
- * Load the state from the window hash string.
- * @param {string} hash The hash string.
- * @param {Object} state The state.
- */
- static parse(hash, state) {
- decodeURIComponent(hash).replace(
- /#?([^=&]+)=([^=&]+)/gm,
- function (_m0, key, value) {
- let current = state;
- let i;
- while ((i = key.indexOf('.')) > -1) {
- current[key.substr(0, i)] = current[key.substr(0, i)] || {};
- current = current[key.substr(0, i)];
- key = key.substr(i + 1);
- }
- // Parse the value.
- if (value == 'true' || value == 'false') {
- // Boolean.
- value = value == 'true';
- } else if (!isNaN(value)) {
- // Number.
- value = Number(value);
- }
- current[key] = value;
- },
- );
- }
-
- /**
- * Serialize the state into a hash string.
- * @param {Object} state The state.
- * @returns {string} The serialized state.
- */
- static save(state) {
- const result = {};
- const flatten = (cur, prop) => {
- if (Object(cur) !== cur) {
- result[prop] = cur;
- } else {
- let isEmpty = true;
- for (const p in cur) {
- if (Object.prototype.hasOwnProperty.call(cur, p)) {
- isEmpty = false;
- flatten(cur[p], prop ? prop + '.' + p : p);
- }
- }
- if (isEmpty && prop != '') {
- result[prop] = {};
- }
- }
- };
- flatten(state, '');
- return Object.keys(result)
- .map((k) => `${k}=${result[k]}`)
- .join('&');
- }
-}
diff --git a/plugins/dev-tools/src/playground/id.js b/plugins/dev-tools/src/playground/id.js
deleted file mode 100644
index 2469fc843..000000000
--- a/plugins/dev-tools/src/playground/id.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Returns the package name.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-export const id = process.env.PACKAGE_NAME;
diff --git a/plugins/dev-tools/src/playground/index.js b/plugins/dev-tools/src/playground/index.js
deleted file mode 100644
index 942bbc349..000000000
--- a/plugins/dev-tools/src/playground/index.js
+++ /dev/null
@@ -1,661 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Entry point for the Blockly playground.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-import {toolboxTestBlocks, toolboxTestBlocksInit} from '@blockly/block-test';
-import {dartGenerator} from 'blockly/dart';
-import {javascriptGenerator} from 'blockly/javascript';
-import {luaGenerator} from 'blockly/lua';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-
-import {downloadWorkspaceScreenshot} from '../screenshot';
-import toolboxCategories from '../toolboxCategories';
-import toolboxSimple from '../toolboxSimple';
-
-import {id} from './id';
-import {addCodeEditor} from './monaco';
-import {addGUIControls} from './options';
-import {LocalStorageState} from './state';
-import {
- renderButton,
- renderCheckbox,
- renderCodeTab,
- renderPlayground,
-} from './ui';
-
-/**
- * @typedef {function(!HTMLElement,!Blockly.BlocklyOptions):
- * Blockly.WorkspaceSvg}
- */
-let CreateWorkspaceFn;
-
-/**
- * @typedef {{
- * generate: function(): void,
- * state: ?,
- * tabElement: !HTMLElement
- * }}
- */
-let PlaygroundTab;
-
-/**
- * @typedef {Blockly.utils.toolbox.ToolboxDefinition} BlocklyToolbox
- */
-
-/**
- * @typedef {Object} PlaygroundConfig
- * @property {boolean} [auto] Whether or not to automatically import, and run
- * the XML and code generators.
- * @property {Object} [toolboxes] The toolbox registry.
- */
-
-/**
- * @typedef {{
- * state: ?,
- * addAction:function(string,function(!Blockly.Workspace):void,string=):
- * dat.GUI,
- * addCheckboxAction:function(string,
- * function(!Blockly.Workspace,boolean):void,string=,boolean=):dat.GUI,
- * addGenerator: function(string,!Blockly.Generator,string=):void,
- * getCurrentTab: function():!PlaygroundTab,
- * getGUI: function():!dat.GUI,
- * getWorkspace: function():!Blockly.WorkspaceSvg
- * }}
- */
-let PlaygroundAPI;
-
-/**
- * Create the Blockly playground.
- * @param {!HTMLElement} container Container element.
- * @param {CreateWorkspaceFn=} createWorkspace A workspace creation method
- * called every time the toolbox is re-configured.
- * @param {Blockly.BlocklyOptions=} defaultOptions The default workspace options
- * to use.
- * @param {PlaygroundConfig=} config Optional Playground config.
- * @param {string=} vsEditorPath Optional editor path.
- * @returns {Promise} A promise to the playground API.
- */
-export function createPlayground(
- container,
- createWorkspace = Blockly.inject,
- defaultOptions = {
- toolbox: toolboxCategories,
- },
- config = {},
- vsEditorPath,
-) {
- const {
- blocklyDiv,
- minimizeButton,
- monacoDiv,
- guiContainer,
- playgroundDiv,
- tabButtons,
- tabsDiv,
- } = renderPlayground(container);
-
- const monacoOptions = {
- model: null,
- language: 'xml',
- minimap: {
- enabled: false,
- },
- theme: 'vs-dark',
- scrollBeyondLastLine: false,
- automaticLayout: true,
- };
-
- // Load the code editor.
- return addCodeEditor(monacoDiv, monacoOptions, vsEditorPath).then(
- (editor) => {
- let workspace;
-
- // Create a model for displaying errors.
- const errorModel = window.monaco.editor.createModel('');
- const editorXmlContextKey = editor.createContextKey('isEditorXml', true);
- const editorJsonContextKey = editor.createContextKey(
- 'isEditorJson',
- true,
- );
-
- // Load / Save playground state.
- // setting active tab as JSON
- const playgroundState = new LocalStorageState(`playgroundState_${id}`, {
- activeTab: 'JSON',
- playgroundOpen: true,
- autoGenerate: config && config.auto != undefined ? config.auto : true,
- workspaceJson: '',
- });
- playgroundState.load();
-
- /**
- * Register a generator and create a new code tab for it.
- * @param {string} name The generator label.
- * @param {string} language The monaco language to use.
- * @param {function(Blockly.WorkspaceSvg):string} generator
- * The Blockly generator.
- * @param {boolean=} isReadOnly Whether the editor should be set to
- * read-only mode.
- * @returns {!PlaygroundTab} An object that represents the newly created
- * tab.
- */
- function registerGenerator(name, language, generator, isReadOnly) {
- const tabElement = renderCodeTab(name);
- tabElement.setAttribute('data-tab', name);
- tabsDiv.appendChild(tabElement);
-
- // Create a monaco editor model for each tab.
- const model = window.monaco.editor.createModel('', language);
- const state = {
- name,
- model,
- language,
- viewState: undefined,
- };
-
- /**
- * Call the generator, displaying an error message if it fails.
- */
- function generate() {
- let text;
- let generateModel = model;
- try {
- text = generator(workspace);
- } catch (e) {
- console.error(e);
- text = e.message;
- generateModel = errorModel;
- editor.updateOptions({
- wordWrap: true,
- });
- }
- if (
- generateModel.getValue() === text &&
- editor.getModel() === generateModel
- ) {
- return;
- }
- generateModel.pushEditOperations(
- [],
- [{range: generateModel.getFullModelRange(), text}],
- () => null,
- );
- editor.setModel(generateModel);
- editor.setSelection(new window.monaco.Range(0, 0, 0, 0));
- }
-
- const tab = {
- generate,
- state,
- tabElement,
- };
- return tab;
- }
-
- /**
- * Set the active tab.
- * @param {!PlaygroundTab} tab The new tab.
- */
- const setActiveTab = (tab) => {
- currentTab = tab;
- currentGenerate = tab.generate;
- const isXml = tab.state.name == 'XML';
- const isJson = tab.state.name == 'JSON';
- editor.setModel(currentTab.state.model);
- editor.updateOptions({
- readOnly: !isXml && !isJson,
- wordWrap: false,
- });
-
- // Update tab UI.
- Object.values(tabs).forEach(
- (t) =>
- (t.tabElement.style.background =
- t.tabElement == tab.tabElement ? '#1E1E1E' : '#2D2D2D'),
- );
- // Update editor state.
- editorXmlContextKey.set(isXml);
- editorJsonContextKey.set(isJson);
- updateImportButtonDisplay();
- playgroundState.set('activeTab', tab.state.name);
- playgroundState.save();
- };
-
- /**
- * Call the current generate method if we are in 'auto' mode. In
- * addition, persist the current workspace xml regardless of which tab
- * we are in.
- */
- const updateEditor = () => {
- if (playgroundState.get('autoGenerate')) {
- if (initialWorkspaceJson && isFirstLoad) {
- isFirstLoad = false;
- try {
- Blockly.serialization.workspaces.load(
- JSON.parse(initialWorkspaceJson),
- workspace,
- );
- } catch (e) {
- console.warn('Failed to auto import.', e);
- }
- }
-
- if (currentGenerate) {
- currentGenerate();
- }
-
- let code = '';
- try {
- code = JSON.stringify(
- Blockly.serialization.workspaces.save(workspace),
- null,
- 2,
- );
- } catch (e) {
- console.warn('Failed to auto save.', e);
- }
- playgroundState.set('workspaceJson', code);
- playgroundState.save();
- }
- };
-
- // Register default tabs.
- const tabs = {
- JSON: registerGenerator('JSON', 'json', (ws) => {
- return JSON.stringify(
- Blockly.serialization.workspaces.save(ws),
- null,
- 2,
- );
- }),
- XML: registerGenerator('XML', 'xml', (ws) => {
- return Blockly.Xml.domToPrettyText(Blockly.Xml.workspaceToDom(ws));
- }),
- JavaScript: registerGenerator(
- 'JavaScript',
- 'javascript',
- (ws) =>
- (javascriptGenerator || Blockly.JavaScript).workspaceToCode(ws),
- true,
- ),
- Python: registerGenerator(
- 'Python',
- 'python',
- (ws) => (pythonGenerator || Blockly.Python).workspaceToCode(ws),
- true,
- ),
- Dart: registerGenerator(
- 'Dart',
- 'dart',
- (ws) => (dartGenerator || Blockly.Dart).workspaceToCode(ws),
- true,
- ),
- Lua: registerGenerator(
- 'Lua',
- 'lua',
- (ws) => (luaGenerator || Blockly.Lua).workspaceToCode(ws),
- true,
- ),
- PHP: registerGenerator(
- 'PHP',
- 'php',
- (ws) => (phpGenerator || Blockly.PHP).workspaceToCode(ws),
- true,
- ),
- };
-
- // Handle tab click.
- tabsDiv.addEventListener('click', (e) => {
- const target = /** @type {HTMLElement} */ (e.target);
- const tabName = target.getAttribute('data-tab');
- if (!tabName) {
- // Not a tab.
- return;
- }
- const tab = tabs[tabName];
-
- // Save current tab state (eg: scroll position).
- currentTab.state.viewState = editor.saveViewState();
-
- setActiveTab(tab);
- updateEditor();
-
- // Restore tab state (eg: scroll position).
- editor.restoreViewState(currentTab.state.viewState);
- editor.focus();
- });
-
- // Initialized saved JSON and bind change listener.
- const initialWorkspaceJson = playgroundState.get('workspaceJson') || '';
- const jsonTab = tabs['JSON'];
- const jsonModel = jsonTab.state.model;
- let isFirstLoad = true;
- jsonModel.setValue(initialWorkspaceJson);
- jsonModel.onDidChangeContent(() => {
- playgroundState.set('workspaceJson', jsonModel.getValue());
- playgroundState.save();
- });
-
- // Create a button to import state from the editor tab to the workspace.
- const importButton = renderButton('Import');
- tabButtons.appendChild(importButton);
- importButton.addEventListener('click', (e) => {
- if (editorXmlContextKey.get()) {
- editor.getAction('import-xml').run();
- }
- if (editorJsonContextKey.get()) {
- editor.getAction('import-json').run();
- }
- });
- const updateImportButtonDisplay = function () {
- // The import button is only relevant for the XML and JSON tabs.
- if (editorXmlContextKey.get() || editorJsonContextKey.get()) {
- importButton.style.display = '';
- } else {
- importButton.style.display = 'none';
- }
- };
-
- // Set the initial tab as active.
- const activeTab = playgroundState.get('activeTab');
- let currentTab = tabs[activeTab];
- let currentGenerate;
- if (currentTab) {
- setActiveTab(currentTab);
- }
-
- // Load the GUI controls.
- const gui = addGUIControls(
- (options) => {
- workspace = createWorkspace(blocklyDiv, options);
-
- // Initialize the test toolbox.
- toolboxTestBlocksInit(
- /** @type {!Blockly.WorkspaceSvg} */ (workspace),
- );
-
- // Add download screenshot option.
- const prevConfigureContextMenu = workspace.configureContextMenu;
- workspace.configureContextMenu = (menuOptions, e) => {
- prevConfigureContextMenu &&
- prevConfigureContextMenu.call(null, menuOptions, e);
-
- const screenshotOption = {
- text: 'Download Screenshot',
- enabled: workspace.getTopBlocks().length,
- callback: function () {
- downloadWorkspaceScreenshot(workspace);
- },
- };
- menuOptions.push(screenshotOption);
- };
-
- updateEditor();
- workspace.addChangeListener((e) => {
- if (e.type !== 'ui' && e.type !== 'viewport_change') {
- updateEditor();
- }
- });
- return workspace;
- },
- defaultOptions,
- {
- disableResize: true,
- toolboxes: config.toolboxes || {
- 'categories': toolboxCategories,
- 'simple': toolboxSimple,
- 'test blocks': toolboxTestBlocks,
- },
- },
- );
-
- // Move the GUI Element to the gui container.
- const guiElement = gui.domElement;
- guiElement.removeChild(guiElement.firstChild);
- guiElement.style.position = 'relative';
- guiElement.style.minWidth = '100%';
- guiContainer.appendChild(guiElement);
-
- // Click handler to toggle the playground.
- const togglePlayground = (e) => {
- const shouldOpen = playgroundDiv.style.display === 'none';
- if (shouldOpen) {
- playgroundDiv.style.display = 'flex';
- minimizeButton.textContent = 'Collapse';
- } else {
- playgroundDiv.style.display = 'none';
- minimizeButton.textContent = 'Expand';
- }
- playgroundState.set('playgroundOpen', shouldOpen);
- playgroundState.save();
- Blockly.svgResize(workspace);
- };
- minimizeButton.addEventListener('click', togglePlayground);
-
- // Start minimized if the playground was previously closed.
- if (playgroundState.get('playgroundOpen') === false) {
- togglePlayground();
- }
-
- // Playground API.
-
- /**
- * Get the current GUI controls.
- * @returns {!dat.GUI} The GUI controls.
- */
- const getGUI = function () {
- return gui;
- };
-
- /**
- * Get the current workspace.
- * @returns {!Blockly.WorkspaceSvg} The Blockly workspace.
- */
- const getWorkspace = function () {
- return workspace;
- };
-
- /**
- * Get the current tab.
- * @returns {!PlaygroundTab} The current tab.
- */
- const getCurrentTab = function () {
- return currentTab;
- };
-
- /**
- * Add a generator tab.
- * @param {string} label The label of the generator tab.
- * @param {Blockly.Generator} generator The Blockly generator.
- * @param {string=} language Optional editor language, defaults to
- * 'javascript'.
- */
- const addGenerator = function (label, generator, language) {
- if (!label || !generator) {
- throw Error('usage: addGenerator(label, generator, language?);');
- }
- tabs[label] = registerGenerator(
- label,
- language || 'javascript',
- (ws) => generator.workspaceToCode(ws),
- true,
- );
- if (activeTab === label) {
- // Set the new generator as the current tab if it is currently
- // active. This occurs when a dynamically added generator is active
- // and the page is reloaded.
- setActiveTab(tabs[label]);
- }
- };
-
- /**
- * Removes a generator tab.
- * @param {string} label The label of the generator tab to remove.
- */
- const removeGenerator = function (label) {
- if (!label) {
- throw Error('usage: removeGenerator(label);');
- }
- if (!(label in tabs)) {
- throw Error('removeGenerator called on invalid label: ' + label);
- }
- const tab = tabs[label];
- tabsDiv.removeChild(tab.tabElement);
- delete tabs[label];
- const tabsKeys = Object.keys(tabs);
- if (activeTab === label && tabsKeys.length) {
- // Set the active tab to another tab if the active tab corresponded
- // to a removed generator.
- setActiveTab(tabs[tabsKeys[0]]);
- }
- };
-
- const playground = {
- state: playgroundState,
- addAction: /** @type {?} */ (gui).addAction,
- addCheckboxAction: /** @type {?} */ (gui).addCheckboxAction,
- addGenerator,
- getCurrentTab,
- getGUI,
- getWorkspace,
- removeGenerator,
- };
-
- // Add tab buttons.
- registerTabButtons(editor, playground, tabButtons, updateEditor);
-
- // Register editor commands.
- registerEditorCommands(editor, playground);
-
- return playground;
- },
- );
-}
-
-/**
- * Register tab buttons.
- * @param {monaco.editor.IStandaloneCodeEditor} editor The monaco editor.
- * @param {PlaygroundAPI} playground The current playground.
- * @param {!HTMLElement} tabButtons Tab buttons element wrapper.
- * @param {function():void} updateEditor Update Editor method.
- */
-function registerTabButtons(editor, playground, tabButtons, updateEditor) {
- const [autoGenerateCheckbox, autoGenerateLabel] = renderCheckbox(
- 'autoGenerate',
- 'Auto',
- );
- /** @type {HTMLInputElement} */ (autoGenerateCheckbox).checked =
- playground.state.get('autoGenerate');
- autoGenerateCheckbox.addEventListener('change', (e) => {
- const inputTarget = /** @type {HTMLInputElement} */ (e.target);
- playground.state.set('autoGenerate', !!inputTarget.checked);
- playground.state.save();
-
- updateEditor();
- });
- tabButtons.appendChild(autoGenerateCheckbox);
- tabButtons.appendChild(autoGenerateLabel);
-}
-
-/**
- * Register editor commands / shortcuts.
- * @param {monaco.editor.IStandaloneCodeEditor} editor The monaco editor.
- * @param {PlaygroundAPI} playground The current playground.
- */
-function registerEditorCommands(editor, playground) {
- const loadXml = () => {
- const xml = editor.getModel().getValue();
- const workspace = playground.getWorkspace();
- try {
- Blockly.Xml.clearWorkspaceAndLoadFromXml(
- Blockly.utils.xml.textToDom(xml),
- workspace,
- );
- } catch {
- // If this fails that's fine.
- return false;
- }
- return true;
- };
- const loadJson = () => {
- const json = editor.getModel().getValue();
- const workspace = playground.getWorkspace();
- try {
- Blockly.serialization.workspaces.load(JSON.parse(json), workspace);
- } catch {
- // If this fails fall back to trying to load XML instead.
- return loadXml();
- }
- return true;
- };
- const save = () => {
- playground.getCurrentTab().generate();
- };
-
- // Add XMl Import action (only available on the XML tab).
- editor.addAction({
- id: 'import-xml',
- label: 'Import from XML',
- keybindings: [window.monaco.KeyMod.CtrlCmd | window.monaco.KeyCode.Enter],
- precondition: 'isEditorXml',
- contextMenuGroupId: 'playground',
- contextMenuOrder: 0,
- run: loadXml,
- });
- // Add XMl Export action (only available on the XML tab).
- editor.addAction({
- id: 'export-xml',
- label: 'Export to XML',
- keybindings: [window.monaco.KeyMod.CtrlCmd | window.monaco.KeyCode.KEY_S],
- precondition: 'isEditorXml',
- contextMenuGroupId: 'playground',
- contextMenuOrder: 1,
- run: save,
- });
- // Add Clean XML action (only available on the XML tab).
- editor.addAction({
- id: 'clean-xml',
- label: 'Clean XML',
- precondition: 'isEditorXml',
- contextMenuGroupId: 'playground',
- contextMenuOrder: 2,
- run: () => {
- const model = editor.getModel();
- const text = model.getValue().replace(/ (x|y|id)="[^"]*"/gim, '');
- model.pushEditOperations(
- [],
- [{range: model.getFullModelRange(), text}],
- () => null,
- );
- editor.setSelection(new window.monaco.Range(0, 0, 0, 0));
- },
- });
- // Add JSON Import action (only available on the JSON tab).
- editor.addAction({
- id: 'import-json',
- label: 'Import from JSON',
- keybindings: [window.monaco.KeyMod.CtrlCmd | window.monaco.KeyCode.Enter],
- precondition: 'isEditorJson',
- contextMenuGroupId: 'playground',
- contextMenuOrder: 0,
- run: loadJson,
- });
- // Add a Generator generate action.
- editor.addAction({
- id: 'generate',
- label: 'Generate',
- keybindings: [window.monaco.KeyMod.CtrlCmd | window.monaco.KeyCode.KEY_S],
- precondition: '!isEditorXml',
- contextMenuGroupId: 'playground',
- contextMenuOrder: 1,
- run: save,
- });
-}
diff --git a/plugins/dev-tools/src/playground/monaco.js b/plugins/dev-tools/src/playground/monaco.js
deleted file mode 100644
index 840ab4a31..000000000
--- a/plugins/dev-tools/src/playground/monaco.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Load the monaco editor.
- * @param {!HTMLElement} container The container element.
- * @param {Object} options Monaco editor options.
- * @param {string=} vsEditorPath Optional VS editor path.
- * @returns {Promise} A promise that resolves with the editor.
- */
-export function addCodeEditor(container, options, vsEditorPath) {
- return new Promise((resolve, reject) => {
- if (!vsEditorPath) {
- const vsEditorPaths = [
- // monaco-editor is a devDependency of @blockly/dev-tools, look for it
- // there first, otherwise attempt to find it in the local node_modules
- // and finally resort to an online version.
- '../node_modules/@blockly/dev-tools/node_modules/monaco-editor/min/vs',
- '../node_modules/monaco-editor/min/vs',
- 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.19.2/min/vs',
- ];
- // Find the VS loader.
- for (let i = 0; i < vsEditorPaths.length; i++) {
- if (checkFileExists(`${vsEditorPaths[i]}/loader.js`)) {
- vsEditorPath = vsEditorPaths[i];
- break;
- }
- }
- }
-
- const onLoad = () => {
- const amdRequire = /** @type {?} */ (window.require);
- amdRequire.config({
- paths: {vs: vsEditorPath},
- });
-
- // Load the monaco editor.
- amdRequire(['vs/editor/editor.main'], () => {
- resolve(createEditor(container, options));
- });
- };
-
- if (!window.require) {
- const script = document.createElement('script');
- script.type = 'text/javascript';
- script.setAttribute('src', `${vsEditorPath}/loader.js`);
- script.addEventListener('load', onLoad);
- document.body.appendChild(script);
- } else {
- onLoad();
- }
- });
-}
-
-/**
- * Create the monaco editor.
- * @param {!HTMLElement} container The container element.
- * @param {Object} options Monaco editor options.
- * @returns {monaco.editor.IStandaloneCodeEditor} A monaco editor.
- */
-function createEditor(container, options) {
- const editor = window.monaco.editor.create(container, options);
- editor.layout();
- return editor;
-}
-
-/**
- * Check whether or not a JS file exists at the url specified.
- * @param {string} url The url of the file.
- * @returns {boolean} Whether or not the file exists.
- */
-function checkFileExists(url) {
- const http = new XMLHttpRequest();
- http.open('HEAD', url, false);
- try {
- http.send();
- } catch {
- return false;
- }
- return http.status != 404;
-}
diff --git a/plugins/dev-tools/src/playground/options.js b/plugins/dev-tools/src/playground/options.js
deleted file mode 100644
index 8bc47ef42..000000000
--- a/plugins/dev-tools/src/playground/options.js
+++ /dev/null
@@ -1,1083 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A helper to use the dat.GUI interface for configuring Blockly
- * workspace options.
- * @author samelh@google.com (Sam El-Husseini)
- */
-import * as Blockly from 'blockly/core';
-import * as dat from 'dat.gui';
-
-import {DebugDrawer} from '../debugDrawer';
-import {registerDebugRendererFromName, debugRendererName} from '../debug';
-import {disableLogger, enableLogger} from '../logger';
-import {HashState} from './hash_state';
-import {populateRandom} from '../populateRandom';
-import {spaghetti} from '../spaghetti';
-import {id} from './id';
-import toolboxCategories from '../toolboxCategories';
-import toolboxSimple from '../toolboxSimple';
-import darkTheme from '@blockly/theme-dark';
-import deuteranopiaTheme from '@blockly/theme-deuteranopia';
-import themeTritanopia from '@blockly/theme-tritanopia';
-import highContrastTheme from '@blockly/theme-highcontrast';
-
-const assign = require('lodash.assign');
-const merge = require('lodash.merge');
-
-/**
- * @typedef {Blockly.utils.toolbox.ToolboxDefinition} BlocklyToolbox
- */
-
-/**
- * @typedef {Object} GUIConfig
- * @property {boolean} [disableResize] Whether or not to disable automatically
- * resizing the GUI control.
- * @property {Object} [toolboxes] The toolbox registry.
- */
-
-/**
- * Use dat.GUI to add controls to adjust configuration of a Blockly workspace.
- * @param {function(!Blockly.BlocklyOptions):Blockly.WorkspaceSvg} genWorkspace
- * A workspace creation method called every time the toolbox is
- * re-configured.
- * @param {Blockly.BlocklyOptions} defaultOptions The default workspace options
- * to use.
- * @param {GUIConfig=} config Optional GUI config.
- * @returns {dat.GUI} The dat.GUI instance.
- */
-export function addGUIControls(genWorkspace, defaultOptions, config = {}) {
- // Initialize state.
- const guiState = loadGUIState();
-
- // Initialize toolboxes.
- const toolboxes =
- /** @type {Object} */ (
- config.toolboxes || {
- categories: toolboxCategories,
- simple: toolboxSimple,
- }
- );
- const defaultToolboxName = initDefaultToolbox(defaultOptions, toolboxes);
- guiState.toolboxName = guiState.toolboxName || defaultToolboxName;
- guiState.options.toolbox = toolboxes[guiState.toolboxName];
-
- // Initialize themes.
- const themes = getThemes(defaultOptions);
- const defaultThemeName = defaultOptions.theme
- ? /** @type {!Blockly.Theme} */ (defaultOptions.theme).name
- : 'classic';
- guiState.themeName = guiState.themeName || defaultThemeName;
- guiState.options.theme = themes[guiState.themeName];
-
- const defaultRendererName = defaultOptions.renderer
- ? defaultOptions.renderer
- : 'geras';
- guiState.renderer = guiState.renderer || defaultRendererName;
- guiState.debugEnabled = guiState.debugEnabled || false;
-
- // Merge default and saved state.
- const saveOptions = /** @type {!Blockly.BlocklyOptions} */ ({
- ...defaultOptions,
- ...guiState.options,
- });
- initDebugRenderer(guiState);
-
- let workspace = genWorkspace(saveOptions);
- const resizeEnabled = !config.disableResize;
-
- const gui = new dat.GUI({
- autoPlace: false,
- closeOnTop: true,
- width: 250,
- load: guiState.guiObject || {},
- });
-
- const guiElement = gui.domElement;
- guiElement.style.position = 'absolute';
- guiElement.style.zIndex = '1000';
- guiElement.onclick = () => {
- // Save the GUI state locally.
- guiState.guiObject = gui.getSaveObject();
- saveGUIState(guiState, defaultToolboxName, defaultThemeName);
- };
-
- const onResize = () => {
- const metrics = workspace.getMetrics();
- if (workspace.RTL) {
- guiElement.style.left = metrics.absoluteLeft + 'px';
- guiElement.style.right = 'auto';
- } else {
- guiElement.style.left = 'auto';
- if (metrics.toolboxPosition === Blockly.TOOLBOX_AT_RIGHT) {
- guiElement.style.right = metrics.toolboxWidth + 'px';
- } else {
- guiElement.style.right = '0';
- }
- }
- guiElement.style.top = metrics.absoluteTop + 'px';
- };
- if (resizeEnabled) {
- onResize();
- }
-
- const container = /** @type {!HTMLElement} */ (
- workspace.getInjectionDiv().parentNode
- );
- container.style.position = 'relative';
- container.appendChild(guiElement);
-
- const options = Object.assign({}, workspace.options);
-
- const onChangeInternal = () => {
- // Serialize current workspace state.
- const state = Blockly.serialization.workspaces.save(workspace);
- // Dispose of the current workspace
- workspace.dispose();
- // Create a new workspace with options.
- workspace = genWorkspace(saveOptions);
- // Deserialize state into workspace.
- Blockly.serialization.workspaces.load(state, workspace);
- // Resize the gui.
- if (resizeEnabled) {
- onResize();
- }
- // Save the GUI state locally.
- guiState.guiObject = gui.getSaveObject();
- saveGUIState(guiState, defaultToolboxName, defaultThemeName);
- // Update options.
- merge(saveOptions, workspace.options);
- gui.updateDisplay();
- };
-
- const onChange = (key, value) => {
- saveOptions[key] = value;
- guiState.options[key] = value;
- onChangeInternal();
- };
-
- const reset = () => {
- // Reset saved options.
- Object.keys(saveOptions).forEach((k) => delete saveOptions[k]);
- assign(saveOptions, defaultOptions);
- Object.keys(guiState.options).forEach((k) => delete guiState.options[k]);
- // Reset debug options.
- guiState.renderer = defaultRendererName;
- initDebugRenderer(guiState, true);
- updateDebugFolder(debugOptionsFolder, false);
-
- // Reset toolbox selection.
- guiState.toolboxName = defaultToolboxName;
- guiState.themeName = defaultThemeName;
-
- // Close all folders.
- Object.values(gui.__folders).forEach((f) => f.close());
-
- onChangeInternal();
- };
-
- gui.add(
- {
- Reset: reset,
- },
- 'Reset',
- );
-
- // Options folder.
- const optionsFolder = gui.addFolder('Options');
- setTooltip(
- optionsFolder,
- 'Options that affect the appearance of the workspace.',
- );
- openFolderIfOptionSelected(optionsFolder, guiState, guiState.options, [
- 'rtl',
- 'renderer',
- 'toolboxPosition',
- 'horizontalLayout',
- ]);
-
- setTooltip(
- optionsFolder
- .add(options, 'RTL')
- .name('rtl')
- .onChange((value) => onChange('rtl', value)),
- 'If true, mirror the editor (for Arabic or Hebrew locales).',
- );
-
- // Renderer.
- populateRendererOption(optionsFolder, guiState, onChange);
-
- // Theme.
- populateThemeOption(
- optionsFolder,
- guiState,
- themes,
- defaultThemeName,
- onChange,
- );
-
- // Toolbox.
- populateToolboxOption(
- optionsFolder,
- guiState,
- toolboxes,
- defaultToolboxName,
- onChange,
- );
- populateToolboxSidesOption(
- optionsFolder,
- options,
- saveOptions,
- guiState,
- onChangeInternal,
- );
-
- // Basic options.
- const basicFolder = optionsFolder.addFolder('Basic');
- setTooltip(basicFolder, 'Basic options like sound, comment etc...');
- populateBasicOptions(basicFolder, options, guiState, onChange);
-
- // Move options.
- const moveFolder = optionsFolder.addFolder('Move');
- setTooltip(moveFolder, 'Move options like scrollbars, drag etc...');
- populateMoveOptions(moveFolder, options, saveOptions, onChange);
- openFolderIfOptionSelected(moveFolder, guiState, guiState.options, ['move']);
-
- // Zoom options.
- const zoomFolder = optionsFolder.addFolder('Zoom');
- setTooltip(zoomFolder, 'Zoom options like controls, startScale etc...');
- populateZoomOptions(zoomFolder, options, saveOptions, onChange);
- openFolderIfOptionSelected(moveFolder, guiState, guiState.options, ['zoom']);
-
- // Grid options.
- const gridFolder = optionsFolder.addFolder('Grid');
- setTooltip(gridFolder, 'Grid options like spacing, length etc...');
- populateGridOptions(gridFolder, options, saveOptions, onChange);
- openFolderIfOptionSelected(moveFolder, guiState, guiState.options, ['grid']);
-
- // Debug renderer.
- const debugFolder = gui.addFolder('Debug');
- // Adds the checkbox to toggle using the debug renderer.
- const debugController = debugFolder.add(guiState, 'debugEnabled');
- // Folder with all the debug options. Hidden if the debugger is not enabled.
- const debugOptionsFolder = debugFolder.addFolder('Debug Options');
-
- setTooltip(debugFolder, 'Rendering debug configuration.');
- populateDebugFolder(debugController, debugOptionsFolder, guiState, onChange);
- populateDebugOptionsFolder(debugOptionsFolder, guiState, onChangeInternal);
-
- // GUI actions.
- const actionsFolder = gui.addFolder('Actions');
- const actionSubFolders = {};
- const actions = {};
-
- /**
- * Get the current workspace.
- * @returns {!Blockly.WorkspaceSvg} The Blockly workspace.
- */
- const getWorkspace = () => {
- return workspace;
- };
-
- /**
- * Add a custom action to the list of playground actions.
- * @param {string} name The action label.
- * @param {function(!Blockly.Workspace):void} callback The callback to call
- * when the action is clicked.
- * @param {string=} folderName Optional folder to place the action under.
- * @param {string=} tooltip Optional tooltip to set.
- * @returns {dat.GUIController} The GUI controller.
- */
- const addAction = (name, callback, folderName, tooltip) => {
- actions[name] = () => {
- callback(workspace);
- };
- let folder = actionsFolder;
- if (folderName) {
- if (actionSubFolders[folderName]) {
- folder = actionSubFolders[folderName];
- } else {
- folder = actionsFolder.addFolder(folderName);
- folder.open();
- actionSubFolders[folderName] = folder;
- }
- }
- const controller = folder.add(actions, name);
- tooltip && setTooltip(controller, tooltip);
- name && controller.name(name);
- return controller;
- };
-
- /**
- * Add a custom checkbox action to the list of playground actions.
- * @param {string} name The action label.
- * @param {function(!Blockly.Workspace,boolean):void} callback The callback to
- * call when the action is clicked.
- * @param {string=} folderName Optional folder to place the action under.
- * @param {boolean=} defaultValue Default value.
- * @param {string=} tooltip Optional tooltip to set.
- * @returns {dat.GUIController} The GUI controller.
- */
- const addCheckboxAction = (
- name,
- callback,
- folderName,
- defaultValue,
- tooltip,
- ) => {
- actions[name] = !!defaultValue;
- let folder = actionsFolder;
- if (folderName) {
- if (actionSubFolders[folderName]) {
- folder = actionSubFolders[folderName];
- } else {
- folder = actionsFolder.addFolder(folderName);
- folder.open();
- actionSubFolders[folderName] = folder;
- }
- }
- const controller = folder.add(actions, name);
- tooltip && setTooltip(controller, tooltip);
- name && controller.name(name);
- controller.listen().onFinishChange((value) => {
- callback(workspace, value);
- });
-
- return controller;
- };
-
- const devGui = /** @type {?} */ (gui);
- devGui.addCheckboxAction = addCheckboxAction;
- devGui.addAction = addAction;
- devGui.getWorkspace = getWorkspace;
-
- addActions(devGui, workspace);
-
- return devGui;
-}
-
-/**
- * Save the GUI state to local storage and the window hash.
- * @param {Object} guiState The GUI State.
- * @param {string} defaultToolboxName The default toolbox name.
- * @param {string} defaultThemeName The default theme name.
- */
-function saveGUIState(guiState, defaultToolboxName, defaultThemeName) {
- // Don't save toolbox and theme, as we'll save their names instead.
- delete guiState.options['toolbox'];
- delete guiState.options['theme'];
-
- if (guiState.debugEnabled) {
- // In this case guiState.options.renderer is 'debugRenderer'. Storing this
- // is not helpful, so instead store the actual name of the renderer.
- guiState.options.renderer = guiState.renderer;
- }
-
- // Save GUI control options to local storage.
- const guiStateKey = `guiState_${id}`;
- localStorage.setItem(guiStateKey, JSON.stringify(guiState));
-
- // Save GUI state into the URL:
- const hashGuiState = Object.assign({}, guiState.options);
- if (guiState.toolboxName !== defaultToolboxName) {
- hashGuiState.toolbox = guiState.toolboxName;
- }
- if (guiState.themeName !== defaultThemeName) {
- hashGuiState.theme = guiState.themeName;
- }
-
- // Save whether the debug is enabled.
- hashGuiState.debugEnabled = guiState.debugEnabled;
- window.location.hash = HashState.save(hashGuiState);
-}
-
-/**
- * Load the GUI state from local storage and the window hash.
- * @returns {Object} The GUI state.
- */
-function loadGUIState() {
- const defaultState = {options: {}, debug: {}, debugEnabled: false};
- const guiStateKey = `guiState_${id}`;
- const guiState =
- JSON.parse(localStorage.getItem(guiStateKey)) || defaultState;
- if (window.location.hash) {
- HashState.parse(window.location.hash, guiState.options);
- }
- // Move GUI toolbox state out of options, as it refers to the toolbox name
- // and not the toolbox value.
- if (guiState.options.toolbox) {
- guiState.toolboxName = guiState.options.toolbox;
- delete guiState.options.toolbox;
- }
- // Move GUI theme state out of options, as it refers to the theme name
- // and not the theme object.
- if (guiState.options.theme) {
- guiState.themeName = guiState.options.theme;
- delete guiState.options.theme;
- }
- // If we end up using the 'debugRenderer' we still need to store the name of
- // the original renderer.
- guiState.renderer = guiState.options.renderer;
-
- // Use the debug renderer.
- if (guiState.debugEnabled) {
- guiState.options.renderer = debugRendererName;
- }
-
- return guiState;
-}
-
-/**
- * Open a dat.GUI folder and all of its parents if one of the options is present
- * in the GUI state.
- * @param {dat.GUI} folder The GUI folder.
- * @param {Object} guiState GUI state.
- * @param {Object} mainObj The main object to check options against.
- * @param {Array} options The options to check.
- */
-function openFolderIfOptionSelected(folder, guiState, mainObj, options) {
- if (guiState.guiObject) {
- // The GUI state is controlling the folder state.
- return;
- }
- options.forEach((option) => {
- if (mainObj[option] != undefined) {
- folder.open();
- while (folder.parent) {
- folder = folder.parent;
- folder.open();
- }
- }
- });
-}
-
-/**
- * Initialize the default toolbox. If the default toolbox is not in the list of
- * toolboxes, add a "default" option to the toolbox list.
- * @param {Blockly.BlocklyOptions} defaultOptions Default Blockly options.
- * @param {Object} toolboxes The
- * registered toolboxes.
- * @returns {string} The default toolbox name.
- */
-function initDefaultToolbox(defaultOptions, toolboxes) {
- const defaultToolbox = defaultOptions.toolbox;
- const isDefaultInToolboxes = Object.keys(toolboxes).filter(
- (k) => toolboxes[k] == defaultToolbox,
- );
- if (defaultToolbox && !isDefaultInToolboxes.length) {
- // Default toolbox not in the toolbox list. Add a "default" option.
- toolboxes['default'] = defaultToolbox;
- return 'default';
- } else if (isDefaultInToolboxes.length) {
- // Get the
- return isDefaultInToolboxes[0];
- } else {
- // No default toolbox set, choose the first one.
- return Object.keys(toolboxes)[0];
- }
-}
-
-/**
- * Populate basic options.
- * @param {dat.GUI} basicFolder The dat.GUI basic folder.
- * @param {Blockly.Options} options Blockly options.
- * @param {Object} guiState The GUI state.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateBasicOptions(basicFolder, options, guiState, onChange) {
- setTooltip(
- basicFolder
- .add(options, 'readOnly')
- .onChange((value) => onChange('readOnly', value)),
- 'If true, prevent the user from editing. Suppresses the toolbox and' +
- ' trashcan.',
- );
- setTooltip(
- basicFolder
- .add(options, 'hasTrashcan')
- .name('trashCan')
- .onChange((value) => onChange('trashcan', value)),
- 'Displays or hides the trashcan.',
- );
- setTooltip(
- basicFolder
- .add(options, 'hasSounds')
- .name('sounds')
- .onChange((value) => onChange('sounds', value)),
- `If false, don't play sounds (e.g. click and delete).`,
- );
- setTooltip(
- basicFolder
- .add(options, 'disable')
- .onChange((value) => onChange('disable', value)),
- 'Allows blocks to be disabled. ',
- );
- setTooltip(
- basicFolder
- .add(options, 'collapse')
- .onChange((value) => onChange('collapse', value)),
- 'Allows blocks to be collapsed or expanded.',
- );
- setTooltip(
- basicFolder
- .add(options, 'comments')
- .onChange((value) => onChange('comments', value)),
- 'Allows blocks to have comments.',
- );
-
- openFolderIfOptionSelected(basicFolder, guiState, guiState.options, [
- 'readOnly',
- 'trashcan',
- 'sounds',
- 'disable',
- 'collapse',
- 'comments',
- ]);
-}
-
-/**
- * Populate the renderer option.
- * @param {dat.GUI} folder The dat.GUI folder.
- * @param {Object} guiState The GUI state.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateRendererOption(folder, guiState, onChange) {
- // Get the list of renderers. Previous versions of Blockly used the
- // rendererMap_, whereas newer versions that use the global registry get their
- // list of renderers from somewhere else.
- const renderers =
- Blockly.blockRendering.rendererMap_ ||
- (Blockly.registry && Blockly.registry.getAllItems('renderer'));
- const publicRenderers = Object.keys(renderers).filter(
- (name) => name !== debugRendererName.toLowerCase(),
- );
- setTooltip(
- folder.add(guiState, 'renderer', publicRenderers).onChange((value) => {
- guiState.renderer = value;
- registerDebugRendererFromName(value);
- onChange('renderer', guiState.debugEnabled ? debugRendererName : value);
- }),
- 'The renderer used by Blockly.',
- );
-}
-
-/**
- * Populate the toolbox option.
- * @param {dat.GUI} folder The dat.GUI folder.
- * @param {Object} guiState The GUI state.
- * @param {Object} toolboxes The
- * registered toolboxes.
- * @param {string} defaultToolboxName The default toolbox name.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateToolboxOption(
- folder,
- guiState,
- toolboxes,
- defaultToolboxName,
- onChange,
-) {
- setTooltip(
- folder
- .add(guiState, 'toolboxName')
- .options(Object.keys(toolboxes))
- .name('toolbox')
- .onChange((value) => {
- guiState.toolboxName = value;
- onChange('toolbox', toolboxes[value]);
- }),
- 'The toolbox used by Blockly.',
- );
- if (guiState.toolboxName !== defaultToolboxName) {
- openFolderIfOptionSelected(folder, guiState, guiState.options, ['toolbox']);
- }
-}
-
-/**
- * Populate the toolbox sides option.
- * @param {dat.GUI} folder The dat.GUI folder.
- * @param {Blockly.Options} options Blockly options.
- * @param {Blockly.BlocklyOptions} saveOptions Saved Blockly options.
- * @param {Object} guiState GUI state.
- * @param {function():void} onChangeInternal Internal on change method.
- */
-function populateToolboxSidesOption(
- folder,
- options,
- saveOptions,
- guiState,
- onChangeInternal,
-) {
- const toolboxSides = {top: 0, bottom: 1, left: 2, right: 3};
- setTooltip(
- folder
- .add(options, 'toolboxPosition', toolboxSides)
- .name('toolboxPosition')
- .onChange((value) => {
- const side = Object.keys(toolboxSides).find(
- (key) => toolboxSides[key] == value,
- );
- saveOptions['horizontalLayout'] = side == 'top' || side == 'bottom';
- saveOptions['toolboxPosition'] =
- side == 'top' || side == 'left' ? 'start' : 'end';
- guiState.options['toolboxPosition'] = saveOptions['toolboxPosition'];
- guiState.options['horizontalLayout'] = saveOptions['horizontalLayout'];
- onChangeInternal();
- }),
- 'The toolbox position.',
- );
-}
-
-/**
- * Get the list of Blockly themes.
- * @param {Blockly.BlocklyOptions} defaultOptions Default Blockly options.
- * @returns {Object} The list of registered themes.
- */
-function getThemes(defaultOptions) {
- let themes;
- if (Blockly.registry && Blockly.registry.getAllItems('theme')) {
- // Using a version of Blockly that registers themes.
- themes = Blockly.registry.getAllItems('theme');
- } else {
- // Fall back to a pre-set list of themes.
- themes = {
- classic: Blockly.Themes.Classic,
- dark: darkTheme,
- deuteranopia: deuteranopiaTheme,
- tritanopia: themeTritanopia,
- highcontrast: highContrastTheme,
- };
- if (defaultOptions.theme) {
- themes[/** @type {!Blockly.Theme} */ (defaultOptions.theme).name] =
- defaultOptions.theme;
- }
- }
- return themes;
-}
-
-/**
- * Populate the theme option.
- * @param {dat.GUI} folder The dat.GUI folder.
- * @param {Object} guiState The GUI state.
- * @param {Object} themes The list of
- * themes.
- * @param {string} defaultThemeName Default Theme name.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateThemeOption(
- folder,
- guiState,
- themes,
- defaultThemeName,
- onChange,
-) {
- setTooltip(
- folder
- .add(guiState, 'themeName')
- .options(Object.keys(themes))
- .name('theme')
- .onChange((value) => {
- guiState.themeName = value;
- onChange('theme', themes[value]);
- }),
- 'The theme used by Blockly.',
- );
- if (guiState.themeName !== defaultThemeName) {
- openFolderIfOptionSelected(folder, guiState, guiState.options, ['theme']);
- }
-}
-
-/**
- * Populate move options.
- * @param {dat.GUI} moveFolder The dat.GUI move options folder.
- * @param {Blockly.Options} options Blockly options.
- * @param {Blockly.BlocklyOptions} saveOptions Saved Blockly options.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateMoveOptions(moveFolder, options, saveOptions, onChange) {
- setTooltip(
- moveFolder.add(options.moveOptions, 'scrollbars').onChange((value) =>
- onChange('move', {
- ...saveOptions.move,
- scrollbars: value,
- }),
- ),
- 'True if the workspace has scrollbars.',
- );
- setTooltip(
- moveFolder.add(options.moveOptions, 'wheel').onChange((value) =>
- onChange('move', {
- ...saveOptions.move,
- wheel: value,
- }),
- ),
- 'True if the workspace can be scrolled with the mouse wheel.',
- );
- setTooltip(
- moveFolder.add(options.moveOptions, 'drag').onChange((value) =>
- onChange('move', {
- ...saveOptions.move,
- drag: value,
- }),
- ),
- 'True if the workspace can be dragged with the mouse.',
- );
-}
-
-/**
- * Populate zoom options.
- * @param {dat.GUI} zoomFolder The dat.GUI zoom options folder.
- * @param {Blockly.Options} options Blockly options.
- * @param {Blockly.BlocklyOptions} saveOptions Saved Blockly options.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateZoomOptions(zoomFolder, options, saveOptions, onChange) {
- setTooltip(
- zoomFolder.add(options.zoomOptions, 'controls').onChange((value) =>
- onChange('zoom', {
- ...saveOptions.zoom,
- controls: value,
- }),
- ),
- 'Set to true to show zoom-centre, zoom-in, and zoom-out buttons.',
- );
- setTooltip(
- zoomFolder.add(options.zoomOptions, 'wheel').onChange((value) =>
- onChange('zoom', {
- ...saveOptions.zoom,
- wheel: value,
- }),
- ),
- 'Set to true to allow the mouse wheel to zoom.',
- );
- setTooltip(
- zoomFolder
- .add(options.zoomOptions, 'startScale', 0.1, 4)
- .onChange((value) =>
- onChange('zoom', {
- ...saveOptions.zoom,
- startScale: value,
- }),
- ),
- 'Initial magnification factor. For applications with multiple levels,' +
- ' startScale is often set to a higher value on the first level, then' +
- ' incrementally decreased as subsequent levels become more complex.',
- );
- setTooltip(
- zoomFolder
- .add(options.zoomOptions, 'maxScale', 1, 20)
- .onChange((value) =>
- onChange('zoom', {
- ...saveOptions.zoom,
- maxScale: value,
- }),
- )
- .step(1),
- 'Maximum multiplication factor for how far one can zoom in.',
- );
- setTooltip(
- zoomFolder
- .add(options.zoomOptions, 'minScale', 0.1, 1)
- .onChange((value) =>
- onChange('zoom', {
- ...saveOptions.zoom,
- minScale: value,
- }),
- )
- .step(0.05),
- 'Minimum multiplication factor for how far one can zoom out.',
- );
-}
-
-/**
- * Populate grid options.
- * @param {dat.GUI} gridFolder The dat.GUI grid options folder.
- * @param {Blockly.Options} options Blockly options.
- * @param {Blockly.BlocklyOptions} saveOptions Saved Blockly options.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateGridOptions(gridFolder, options, saveOptions, onChange) {
- setTooltip(
- gridFolder.add(options.gridOptions, 'spacing', 0, 50).onChange((value) =>
- onChange('grid', {
- ...saveOptions.grid,
- spacing: value,
- }),
- ),
- `The distance between the grid's points.`,
- );
- setTooltip(
- gridFolder.add(options.gridOptions, 'length', 0, 30).onChange((value) =>
- onChange('grid', {
- ...saveOptions.grid,
- length: value,
- }),
- ),
- 'The shape of the grid points. A length of 0 results in an invisible' +
- ' grid (but still one that may be snapped to), a length of 1 (the' +
- ' default value) results in dots, a longer length results in crosses, ' +
- 'and a length equal or greater than the spacing results in graph paper.',
- );
- setTooltip(
- gridFolder.addColor(options.gridOptions, 'colour').onChange((value) =>
- onChange('grid', {
- ...saveOptions.grid,
- colour: value,
- }),
- ),
- 'The colour of the grid points.',
- );
- setTooltip(
- gridFolder.add(options.gridOptions, 'snap').onChange((value) =>
- onChange('grid', {
- ...saveOptions.grid,
- snap: value,
- }),
- ),
- 'Whether blocks should snap to the nearest grid point when placed on' +
- ' the workspace.',
- );
-}
-
-/**
- * Set a tooltip on a GUI folder or controller.
- * @param {dat.GUI|dat.GUIController} controller GUI folder or controller.
- * @param {string} tooltip Tooltip string.
- */
-function setTooltip(controller, tooltip) {
- const parentElement = controller.domElement.parentElement;
- parentElement.setAttribute('title', tooltip);
-}
-
-/**
- * Initialize debug renderer.
- * @param {!Object} guiState The GUI State.
- * @param {boolean=} reset Whether or not to reset the renderer config.
- */
-function initDebugRenderer(guiState, reset) {
- const guiDebugState = guiState.debug;
- registerDebugRendererFromName(guiState.renderer);
- Object.keys(DebugDrawer.config).map((key) => {
- if (guiDebugState[key] == undefined || reset) {
- guiDebugState[key] = false;
- }
- DebugDrawer.config[key] = guiDebugState[key];
- });
-
- if (reset) {
- guiState.debugEnabled = false;
- }
-}
-
-/**
- * Populate the parent folder that holds the debug enabled button and the
- * folder with all the debug options in it. When debug is enabled it should
- * open the folder holding all the debug options.
- * @param {dat.GUIController} debugController The GUI controller.
- * @param {dat.GUI} debugOptionsFolder The folder that holds all the debug
- * options.
- * @param {Object} guiState The GUI State.
- * @param {function(string, *):void} onChange On Change method.
- */
-function populateDebugFolder(
- debugController,
- debugOptionsFolder,
- guiState,
- onChange,
-) {
- updateDebugFolder(debugOptionsFolder, guiState.debugEnabled);
-
- debugController.onChange((value) => {
- guiState.debugEnabled = value;
- onChange('renderer', value ? debugRendererName : guiState.renderer);
- updateDebugFolder(debugOptionsFolder, guiState.debugEnabled);
- });
-}
-
-/**
- * Updates the debug folder to be hidden/displayed based on whether the
- * rendering debugger is enabled.
- * @param {dat.GUI} folder The folder that holds all the debug
- * options.
- * @param {boolean} isEnabled True if the debugger is enabled, false otherwise.
- */
-function updateDebugFolder(folder, isEnabled) {
- if (isEnabled) {
- folder.show();
- folder.open();
- } else {
- folder.hide();
- }
-}
-
-/**
- * Populates the folder holding all the debug renderer options.
- * @param {dat.GUI} debugOptionsFolder The folder that holds all the debug
- * options.
- * @param {Object} guiState The GUI State.
- * @param {function():void} onChangeInternal Internal on change method.
- */
-function populateDebugOptionsFolder(
- debugOptionsFolder,
- guiState,
- onChangeInternal,
-) {
- const debugState = guiState.debug;
- Object.keys(DebugDrawer.config).map((key) => {
- debugOptionsFolder.add(debugState, key, 0, 50).onChange((value) => {
- debugState[key] = value;
- DebugDrawer.config[key] = debugState[key];
- onChangeInternal();
- });
- });
-}
-
-/**
- * Add default actions to the GUI instance.
- * @param {?} gui The GUI instance.
- * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace.
- */
-function addActions(gui, workspace) {
- // Visibility actions.
- gui.addAction(
- 'Show',
- (workspace) => {
- workspace.setVisible(true);
- },
- 'Visibility',
- 'Show the workspace.',
- );
- gui.addAction(
- 'Hide',
- (workspace) => {
- workspace.setVisible(false);
- },
- 'Visibility',
- 'Hide the workspace.',
- );
-
- // Block actions.
- gui.addAction(
- 'Clear',
- (workspace) => {
- workspace.clear();
- },
- 'Blocks',
- 'Clear all the blocks from the workspace.',
- );
- gui.addAction(
- 'Format',
- (workspace) => {
- workspace.cleanUp();
- },
- 'Blocks',
- 'Format the blocks on the workspace.',
- );
-
- // Undo/Redo actions.
- gui.addAction(
- 'Undo',
- (workspace) => {
- workspace.undo();
- },
- 'Undo/Redo',
- 'Undo last action.',
- );
- gui.addAction(
- 'Redo',
- (workspace) => {
- workspace.undo(true);
- },
- 'Undo/Redo',
- 'Redo last action.',
- );
- gui.addAction(
- 'Clear Undo Stack',
- (workspace) => {
- workspace.clearUndo();
- },
- 'Undo/Redo',
- 'Clear the undo stack.',
- );
-
- // Scale actions.
- gui.addAction(
- 'Zoom reset',
- (workspace) => {
- workspace.setScale(workspace.options.zoomOptions.startScale);
- workspace.scrollCenter();
- },
- 'Scale',
- 'Reset zoom.',
- );
- gui.addAction(
- 'Zoom center',
- (workspace) => {
- workspace.scrollCenter();
- },
- 'Scale',
- 'Center the workspace.',
- );
- gui.addAction(
- 'Zoom to Fit',
- (workspace) => {
- workspace.zoomToFit();
- },
- 'Scale',
- 'Zoom the blocks to fit in the workspace if possible.',
- );
-
- // Stress Test.
- gui.addAction(
- 'Random Blocks',
- (workspace) => {
- populateRandom(workspace, 100);
- },
- 'Stress Test',
- 'Populate the workspace with a random set of blocks, for testing.',
- );
- gui.addAction(
- 'Spaghetti!',
- (workspace) => {
- spaghetti(workspace, 8);
- },
- 'Stress Test',
- 'Populate the workspace with nested if-statement blocks, for testing.',
- );
-
- // Logging.
- gui.addCheckboxAction(
- 'Log Events',
- function (workspace, value) {
- if (value) {
- enableLogger(workspace);
- } else {
- disableLogger(workspace);
- }
- },
- 'Logging',
- false,
- 'Toggle console logging of workspace events.',
- );
- gui.addCheckboxAction(
- 'Log Flyout Events',
- function (workspace, value) {
- if (value) {
- if (workspace.getFlyout()) {
- enableLogger(workspace.getFlyout().getWorkspace());
- }
- } else {
- if (workspace.getFlyout()) {
- disableLogger(workspace.getFlyout().getWorkspace());
- }
- }
- },
- 'Logging',
- false,
- 'Toggle console logging of flyout events.',
- );
-}
diff --git a/plugins/dev-tools/src/playground/state.js b/plugins/dev-tools/src/playground/state.js
deleted file mode 100644
index f003c5f4f..000000000
--- a/plugins/dev-tools/src/playground/state.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Local storage state manager.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-/**
- * A class that manages loading / storing the local storage state.
- */
-export class LocalStorageState {
- /**
- * Local storage state constructor.
- * @param {string} key The local storage key.
- * @param {Object=} defaultState The default state.
- */
- constructor(key, defaultState) {
- /**
- * @type {string}
- * @private
- */
- this.key_ = key;
-
- /**
- * @type {!Object}
- * @private
- */
- this.state_ = Object.create(null);
-
- /**
- * @type {!Object}
- * @private
- */
- this.defaultState_ = defaultState || Object.create(null);
- }
-
- /**
- * Load the state from local storage.
- */
- load() {
- this.state_ =
- JSON.parse(localStorage.getItem(this.key_)) || this.defaultState_;
- }
-
- /**
- * Get value of key.
- * @param {string} key The key to lookup.
- * @returns {*} The value.
- */
- get(key) {
- return this.state_[key];
- }
-
- /**
- * Set the value of a key.
- * @param {string} key The key to set.
- * @param {*} value The value.
- */
- set(key, value) {
- this.state_[key] = value;
- }
-
- /**
- * Save and persist the current state.
- */
- save() {
- localStorage.setItem(this.key_, JSON.stringify(this.state_));
- }
-}
diff --git a/plugins/dev-tools/src/playground/ui.js b/plugins/dev-tools/src/playground/ui.js
deleted file mode 100644
index 855b0becd..000000000
--- a/plugins/dev-tools/src/playground/ui.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Playground UI.
- * @author samelh@google.com (Sam El-Husseini)
- */
-
-/**
- * Render the playground layout.
- * @param {HTMLElement} container The container to render the playground in.
- * @returns {{
- * blocklyDiv: HTMLElement,
- * minimizeButton: HTMLElement,
- * monacoDiv: HTMLElement,
- * guiContainer: HTMLElement,
- * playgroundDiv: HTMLElement,
- * tabsDiv: HTMLElement,
- * tabButtons: HTMLElement
- * }} An object with the various playground components.
- */
-export function renderPlayground(container) {
- container.style.display = 'flex';
- container.style.overflow = 'hidden';
- container.style.height = '100vh';
- container.style.width = '100vw';
- container.style.userSelect = 'none';
- container.style.background = '#E4E4E4';
-
- // Blockly area.
-
- const blocklyArea = document.createElement('div');
- blocklyArea.style.flex = '2 1 0';
- container.appendChild(blocklyArea);
-
- const blocklyDiv = document.createElement('div');
- blocklyDiv.style.height = '100%';
- blocklyDiv.style.width = '100%';
- blocklyDiv.style.maxHeight = '100%';
- blocklyArea.appendChild(blocklyDiv);
-
- // Playground area.
-
- // Minimize button
- const minimizeButton = document.createElement('div');
- minimizeButton.style.width = '18px';
- minimizeButton.style.background = 'black';
- minimizeButton.style.color = 'white';
- minimizeButton.style.font = `12px 'Lucida Grande', sans-serif`;
- minimizeButton.style.writingMode = 'vertical-lr';
- minimizeButton.style.textOrientation = 'mixed';
- minimizeButton.style.textAlign = 'center';
- minimizeButton.textContent = 'Collapse';
- container.appendChild(minimizeButton);
-
- const playgroundDiv = document.createElement('div');
- playgroundDiv.style.flex = '1 1 1';
- playgroundDiv.style.maxWidth = '40vw';
- playgroundDiv.style.width = '100%';
- playgroundDiv.style.height = '100%';
- playgroundDiv.style.display = 'flex';
- playgroundDiv.style.background = 'grey';
- playgroundDiv.style.flexDirection = 'column';
- playgroundDiv.style.color = '#bbb';
- playgroundDiv.style.font = `11px 'Lucida Grande', sans-serif`;
- container.appendChild(playgroundDiv);
-
- const playgroundTitle = document.createElement('span');
- playgroundTitle.textContent = 'Blockly Playground';
- playgroundTitle.style.background = '#3C3C3C';
- playgroundTitle.style.fontSize = '12px';
- playgroundTitle.style.padding = '7px';
- playgroundDiv.appendChild(playgroundTitle);
-
- // GUI controls area.
-
- const guiContainer = document.createElement('div');
- guiContainer.style.maxHeight = '50%';
- guiContainer.style.flex = '1';
- guiContainer.style.background = '#000';
- guiContainer.style.overflow = 'auto';
- playgroundDiv.appendChild(guiContainer);
-
- // Code area.
-
- const codeWrapper = document.createElement('div');
- codeWrapper.style.maxHeight = '50%';
- codeWrapper.style.background = '#1E1E1E';
- codeWrapper.style.flex = '1';
- playgroundDiv.appendChild(codeWrapper);
-
- // Code editor tabs.
- const tabContainer = document.createElement('div');
- tabContainer.style.background = '#252526';
- tabContainer.style.height = '30px';
- tabContainer.style.lineHeight = '30px';
- tabContainer.style.position = 'relative';
- codeWrapper.appendChild(tabContainer);
-
- const tabsDiv = document.createElement('div');
- tabsDiv.style.overflow = 'auto hidden';
- tabsDiv.style.width = 'calc(100% - 50px)';
- tabContainer.appendChild(tabsDiv);
-
- // Code editor tab buttons.
- const tabButtons = document.createElement('div');
- tabButtons.style.position = 'absolute';
- tabButtons.style.height = '30px';
- tabButtons.style.top = '0';
- tabButtons.style.right = '0';
- tabButtons.style.display = 'flex';
- tabButtons.style.justifyContent = 'center';
- tabButtons.style.alignItems = 'center';
- tabButtons.style.background = '#252526';
- tabContainer.appendChild(tabButtons);
-
- // Code editor.
- const editorContainer = document.createElement('div');
- editorContainer.style.height = 'calc(100% - 30px)';
- codeWrapper.appendChild(editorContainer);
-
- return {
- blocklyDiv,
- minimizeButton,
- monacoDiv: editorContainer,
- guiContainer,
- playgroundDiv,
- tabsDiv,
- tabButtons,
- };
-}
-
-/**
- * Render a code tab.
- * @param {string} name Name of the tab.
- * @returns {HTMLElement} The tab element.
- */
-export function renderCodeTab(name) {
- const tab = document.createElement('span');
- tab.style.background = '#2D2D2D';
- tab.style.color = '#969696';
- tab.style.padding = '10px 20px';
- tab.style.lineHeight = '30px';
- tab.style.cursor = 'pointer';
- tab.textContent = name;
- return tab;
-}
-
-/**
- * Render a checkbox.
- * @param {string} id Id to use for the checkbox element.
- * @param {string} label The label string to use.
- * @returns {Array} A tuple of the checkbox input element, and the
- * checkbox label element.
- */
-export function renderCheckbox(id, label) {
- const checkbox = document.createElement('input');
- checkbox.setAttribute('type', 'checkbox');
- checkbox.setAttribute('id', id);
- const checkboxLabel = document.createElement('label');
- checkboxLabel.textContent = label;
- checkboxLabel.setAttribute('for', id);
- return [checkbox, checkboxLabel];
-}
-
-/**
- * Render a button.
- * @param {string} label The text content of the button.
- * @returns {HTMLButtonElement} The button element.
- */
-export function renderButton(label) {
- const button = document.createElement('button');
- button.setAttribute('type', 'button');
- button.textContent = label;
- return button;
-}
diff --git a/plugins/dev-tools/src/populateRandom.js b/plugins/dev-tools/src/populateRandom.js
deleted file mode 100644
index 422a72589..000000000
--- a/plugins/dev-tools/src/populateRandom.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Helper for randomly populating a workspace.
- * @author fenichel@google.com (Rachel Fenichel)
- */
-import * as Blockly from 'blockly/core';
-
-/**
- * Populate the workspace with a random set of blocks, for testing.
- * @param {Blockly.Workspace} workspace The workspace to populate.
- * @param {number} count How many blocks to create.
- */
-export function populateRandom(workspace, count) {
- const names = [];
- for (const blockName in Blockly.Blocks) {
- if (
- Object.prototype.hasOwnProperty.call(Blockly.Blocks, blockName) &&
- Object.prototype.hasOwnProperty.call(Blockly.Blocks[blockName], 'init')
- ) {
- names.push(blockName);
- }
- }
-
- for (let i = 0; i < count; i++) {
- const name = names[Math.floor(Math.random() * names.length)];
- const block = workspace.newBlock(name);
- block.initSvg();
- block
- .getSvgRoot()
- .setAttribute(
- 'transform',
- 'translate(' +
- Math.round(Math.random() * 450 + 40) +
- ', ' +
- Math.round(Math.random() * 600 + 40) +
- ')',
- );
- block.render();
- }
-}
diff --git a/plugins/dev-tools/src/screenshot.js b/plugins/dev-tools/src/screenshot.js
deleted file mode 100644
index 41ff4671e..000000000
--- a/plugins/dev-tools/src/screenshot.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * @license
- * Copyright 2019 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Download screenshot.
- * @author samelh@google.com (Sam El-Husseini)
- */
-import * as Blockly from 'blockly/core';
-
-/**
- * Convert an SVG datauri into a PNG datauri.
- * @param {string} data SVG datauri.
- * @param {number} width Image width.
- * @param {number} height Image height.
- * @param {!Function} callback Callback.
- */
-function svgToPng_(data, width, height, callback) {
- const canvas = document.createElement('canvas');
- const context = canvas.getContext('2d');
- const img = new Image();
-
- const pixelDensity = 10;
- canvas.width = width * pixelDensity;
- canvas.height = height * pixelDensity;
- img.onload = function () {
- context.drawImage(
- img,
- 0,
- 0,
- width,
- height,
- 0,
- 0,
- canvas.width,
- canvas.height,
- );
- try {
- const dataUri = canvas.toDataURL('image/png');
- callback(dataUri);
- } catch {
- console.warn('Error converting the workspace svg to a png');
- callback('');
- }
- };
- img.src = data;
-}
-
-/**
- * Create an SVG of the blocks on the workspace.
- * @param {!Blockly.WorkspaceSvg} workspace The workspace.
- * @param {!Function} callback Callback.
- * @param {string=} customCss Custom CSS to append to the SVG.
- */
-function workspaceToSvg_(workspace, callback, customCss) {
- // Go through all text areas and set their value.
- const textAreas = document.getElementsByTagName('textarea');
- for (let i = 0; i < textAreas.length; i++) {
- textAreas[i].innerText = textAreas[i].value;
- }
-
- const bBox = workspace.getBlocksBoundingBox();
- const x = bBox.x || bBox.left;
- const y = bBox.y || bBox.top;
- const width = bBox.width || bBox.right - x;
- const height = bBox.height || bBox.bottom - y;
-
- const blockCanvas = workspace.getCanvas();
- const blockCanvasClone = blockCanvas.cloneNode(true);
- blockCanvasClone.removeAttribute('transform');
-
- const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
- svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
- svg.setAttribute('viewBox', x + ' ' + y + ' ' + width + ' ' + height);
-
- svg.setAttribute(
- 'class',
- 'blocklySvg ' +
- (workspace.options.renderer || 'geras') +
- '-renderer ' +
- (workspace.getTheme ? workspace.getTheme().name + '-theme' : ''),
- );
- svg.setAttribute('width', width);
- svg.setAttribute('height', height);
- svg.setAttribute(
- 'style',
- 'background-color: transparent; ' +
- workspace.getInjectionDiv().style.cssText, // has CSS vars for SVG filters
- );
-
- const css = [].slice
- .call(document.head.querySelectorAll('style'))
- .filter(function (el) {
- return (
- /\.blocklySvg/.test(el.innerText) || el.id.indexOf('blockly-') === 0
- );
- })
- .map(function (el) {
- return el.innerText;
- })
- .join('\n');
- const style = document.createElement('style');
- style.textContent = css + '\n' + customCss;
-
- svg.appendChild(style);
- for (const defs of workspace.getSvgGroup().getElementsByTagName('defs')) {
- svg.appendChild(defs.cloneNode(true));
- }
- svg.appendChild(blockCanvasClone);
-
- let svgAsXML = new XMLSerializer().serializeToString(svg);
- svgAsXML = svgAsXML.replace(/ /g, ' ');
- const data = 'data:image/svg+xml,' + encodeURIComponent(svgAsXML);
-
- svgToPng_(data, width, height, callback);
-}
-
-/**
- * Download a screenshot of the blocks on a Blockly workspace.
- * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace.
- */
-export function downloadWorkspaceScreenshot(workspace) {
- workspaceToSvg_(workspace, function (datauri) {
- const a = document.createElement('a');
- a.download = 'screenshot.png';
- a.target = '_self';
- a.href = datauri;
- document.body.appendChild(a);
- a.click();
- a.parentNode.removeChild(a);
- });
-}
diff --git a/plugins/dev-tools/src/spaghetti.js b/plugins/dev-tools/src/spaghetti.js
deleted file mode 100644
index bc0b52565..000000000
--- a/plugins/dev-tools/src/spaghetti.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Helper for populating the workspace with nested if-statement
- * blocks, for testing.
- * @author samelh@google.com (Sam El-Husseini)
- */
-import * as Blockly from 'blockly/core';
-
-const spaghettiXml = [
- ' ',
- ' ',
- ' ',
- ' EQ ',
- ' ',
- ' ',
- ' MULTIPLY ',
- ' ',
- ' ',
- ' 6 ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' 7 ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' 42 ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' ',
- ' ',
-].join('\n');
-
-/**
- * Populate the workspace with nested if-statement blocks, for testing.
- * @param {Blockly.Workspace} workspace The workspace to populate.
- * @param {number} depth How many layers of nesting to create.
- */
-export function spaghetti(workspace, depth) {
- let xml = spaghettiXml;
- for (let i = 0; i < depth; i++) {
- xml = xml.replace(
- /(<(statement|next)( name="DO0")?>)<\//g,
- '$1' + spaghettiXml + '',
- );
- }
- xml =
- '' + xml + ' ';
- const dom = Blockly.utils.xml.textToDom(xml);
- console.time('Spaghetti domToWorkspace');
- Blockly.Xml.domToWorkspace(dom, workspace);
- console.timeEnd('Spaghetti domToWorkspace');
-}
diff --git a/plugins/dev-tools/src/test_helpers.mocha.js b/plugins/dev-tools/src/test_helpers.mocha.js
deleted file mode 100644
index c5ff8ca46..000000000
--- a/plugins/dev-tools/src/test_helpers.mocha.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as commonHelpers from './common_test_helpers.mocha';
-import * as blockTestHelpers from './block_test_helpers.mocha';
-import * as fieldTestHelpers from './field_test_helpers.mocha';
-import * as eventTestHelpers from './event_test_helpers.mocha';
-
-const {TestCase, TestSuite, runTestCases, runTestSuites, captureWarnings} =
- commonHelpers;
-
-const {
- CodeGenerationTestCase,
- CodeGenerationTestSuite,
- runCodeGenerationTestSuites,
- runSerializationTestSuite,
- SerializationTestCase,
-} = blockTestHelpers;
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = fieldTestHelpers;
-
-const {assertEventFiredShallow, assertEventNotFired} = eventTestHelpers;
-
-export {
- assertEventFiredShallow,
- assertEventNotFired,
- assertFieldValue,
- CodeGenerationTestCase,
- CodeGenerationTestSuite,
- FieldCreationTestCase,
- FieldValueTestCase,
- runCodeGenerationTestSuites,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSerializationTestSuite,
- runSetValueTests,
- runTestCases,
- runTestSuites,
- captureWarnings,
- SerializationTestCase,
- TestCase,
- TestSuite,
-};
diff --git a/plugins/dev-tools/src/toolboxCategories.js b/plugins/dev-tools/src/toolboxCategories.js
deleted file mode 100644
index 1f5ca4ce7..000000000
--- a/plugins/dev-tools/src/toolboxCategories.js
+++ /dev/null
@@ -1,786 +0,0 @@
-export default {
- kind: 'categoryToolbox',
- contents: [
- {
- kind: 'category',
- name: 'Logic',
- categorystyle: 'logic_category',
- contents: [
- {
- type: 'controls_if',
- kind: 'block',
- },
- {
- type: 'logic_compare',
- kind: 'block',
- fields: {
- OP: 'EQ',
- },
- },
- {
- type: 'logic_operation',
- kind: 'block',
- fields: {
- OP: 'AND',
- },
- },
- {
- type: 'logic_negate',
- kind: 'block',
- },
- {
- type: 'logic_boolean',
- kind: 'block',
- fields: {
- BOOL: 'TRUE',
- },
- },
- {
- type: 'logic_null',
- kind: 'block',
- enabled: false,
- },
- {
- type: 'logic_ternary',
- kind: 'block',
- },
- ],
- },
- {
- kind: 'category',
- name: 'Loops',
- categorystyle: 'loop_category',
- contents: [
- {
- type: 'controls_repeat_ext',
- kind: 'block',
- inputs: {
- TIMES: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 10,
- },
- },
- },
- },
- },
- {
- type: 'controls_repeat',
- kind: 'block',
- enabled: false,
- fields: {
- TIMES: 10,
- },
- },
- {
- type: 'controls_whileUntil',
- kind: 'block',
- fields: {
- MODE: 'WHILE',
- },
- },
- {
- type: 'controls_for',
- kind: 'block',
- fields: {
- VAR: {
- name: 'i',
- },
- },
- inputs: {
- FROM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- TO: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 10,
- },
- },
- },
- BY: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- },
- },
- {
- type: 'controls_forEach',
- kind: 'block',
- fields: {
- VAR: {
- name: 'j',
- },
- },
- },
- {
- type: 'controls_flow_statements',
- kind: 'block',
- enabled: false,
- fields: {
- FLOW: 'BREAK',
- },
- },
- ],
- },
- {
- kind: 'category',
- name: 'Math',
- categorystyle: 'math_category',
- contents: [
- {
- type: 'math_number',
- kind: 'block',
- fields: {
- NUM: 123,
- },
- },
- {
- type: 'math_arithmetic',
- kind: 'block',
- fields: {
- OP: 'ADD',
- },
- inputs: {
- A: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- B: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- },
- },
- {
- type: 'math_single',
- kind: 'block',
- fields: {
- OP: 'ROOT',
- },
- inputs: {
- NUM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 9,
- },
- },
- },
- },
- },
- {
- type: 'math_trig',
- kind: 'block',
- fields: {
- OP: 'SIN',
- },
- inputs: {
- NUM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 45,
- },
- },
- },
- },
- },
- {
- type: 'math_constant',
- kind: 'block',
- fields: {
- CONSTANT: 'PI',
- },
- },
- {
- type: 'math_number_property',
- kind: 'block',
- fields: {
- PROPERTY: 'EVEN',
- },
- inputs: {
- NUMBER_TO_CHECK: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 0,
- },
- },
- },
- },
- },
- {
- type: 'math_round',
- kind: 'block',
- fields: {
- OP: 'ROUND',
- },
- inputs: {
- NUM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 3.1,
- },
- },
- },
- },
- },
- {
- type: 'math_on_list',
- kind: 'block',
- fields: {
- OP: 'SUM',
- },
- },
- {
- type: 'math_modulo',
- kind: 'block',
- inputs: {
- DIVIDEND: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 64,
- },
- },
- },
- DIVISOR: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 10,
- },
- },
- },
- },
- },
- {
- type: 'math_constrain',
- kind: 'block',
- inputs: {
- VALUE: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 50,
- },
- },
- },
- LOW: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- HIGH: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 100,
- },
- },
- },
- },
- },
- {
- type: 'math_random_int',
- kind: 'block',
- inputs: {
- FROM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- TO: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 100,
- },
- },
- },
- },
- },
- {
- type: 'math_random_float',
- kind: 'block',
- },
- {
- type: 'math_atan2',
- kind: 'block',
- inputs: {
- X: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- Y: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- },
- },
- ],
- },
- {
- kind: 'category',
- name: 'Text',
- categorystyle: 'text_category',
- contents: [
- {
- type: 'text',
- kind: 'block',
- fields: {
- TEXT: '',
- },
- },
- {
- type: 'text_join',
- kind: 'block',
- },
- {
- type: 'text_append',
- kind: 'block',
- fields: {
- name: 'item',
- },
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- },
- },
- {
- type: 'text_length',
- kind: 'block',
- inputs: {
- VALUE: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- {
- type: 'text_isEmpty',
- kind: 'block',
- inputs: {
- VALUE: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- },
- },
- {
- type: 'text_indexOf',
- kind: 'block',
- fields: {
- END: 'FIRST',
- },
- inputs: {
- VALUE: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'text',
- },
- },
- },
- },
- FIND: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- {
- type: 'text_charAt',
- kind: 'block',
- fields: {
- WHERE: 'FROM_START',
- },
- inputs: {
- VALUE: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'text',
- },
- },
- },
- },
- },
- },
- {
- type: 'text_getSubstring',
- kind: 'block',
- fields: {
- WHERE1: 'FROM_START',
- WHERE2: 'FROM_START',
- },
- inputs: {
- STRING: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'text',
- },
- },
- },
- },
- },
- },
- {
- type: 'text_changeCase',
- kind: 'block',
- fields: {
- CASE: 'UPPERCASE',
- },
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- {
- type: 'text_trim',
- kind: 'block',
- fields: {
- MODE: 'BOTH',
- },
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- {
- type: 'text_count',
- kind: 'block',
- inputs: {
- SUB: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- },
- },
- {
- type: 'text_replace',
- kind: 'block',
- inputs: {
- FROM: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- TO: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- },
- },
- {
- type: 'text_reverse',
- kind: 'block',
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: '',
- },
- },
- },
- },
- },
-
- {
- type: 'text_print',
- kind: 'block',
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- {
- type: 'text_prompt_ext',
- kind: 'block',
- fields: {
- TYPE: 'TEXT',
- },
- inputs: {
- TEXT: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: 'abc',
- },
- },
- },
- },
- },
- ],
- },
- {
- kind: 'category',
- name: 'Lists',
- categorystyle: 'list_category',
- contents: [
- {
- type: 'lists_create_with',
- kind: 'block',
- extraState: {
- itemCount: 0,
- },
- },
- {
- type: 'lists_create_with',
- kind: 'block',
- },
- {
- type: 'lists_repeat',
- kind: 'block',
- inputs: {
- NUM: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 5,
- },
- },
- },
- },
- },
- {
- type: 'lists_length',
- kind: 'block',
- },
- {
- type: 'lists_isEmpty',
- kind: 'block',
- },
- {
- type: 'lists_indexOf',
- kind: 'block',
-
- fields: {
- END: 'FIRST',
- },
- inputs: {
- VALUE: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'list',
- },
- },
- },
- },
- },
- },
- {
- type: 'lists_getIndex',
- kind: 'block',
- fields: {
- MODE: 'GET',
- WHERE: 'FROM_START',
- },
- inputs: {
- VALUE: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'list',
- },
- },
- },
- },
- },
- },
- {
- type: 'lists_setIndex',
- kind: 'block',
- fields: {
- MODE: 'SET',
- WHERE: 'FROM_START',
- },
- inputs: {
- LIST: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'list',
- },
- },
- },
- },
- },
- },
- {
- type: 'lists_getSublist',
- kind: 'block',
- fields: {
- WHERE1: 'FROM_START',
- WHERE2: 'FROM_START',
- },
- inputs: {
- LIST: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'list',
- },
- },
- },
- },
- },
- },
- {
- type: 'lists_split',
- kind: 'block',
-
- fields: {
- MODE: 'SPLIT',
- },
- inputs: {
- DELIM: {
- shadow: {
- type: 'text',
- fields: {
- TEXT: ',',
- },
- },
- },
- },
- },
- {
- type: 'lists_sort',
- kind: 'block',
-
- fields: {
- TYPE: 'NUMERIC',
- DIRECTION: '1',
- },
- },
- {
- type: 'lists_reverse',
- kind: 'block',
- },
- ],
- },
- {
- kind: 'sep',
- },
- {
- kind: 'category',
- name: 'Variables',
- custom: 'VARIABLE',
- categorystyle: 'variable_category',
- },
- {
- kind: 'category',
- name: 'Functions',
- custom: 'PROCEDURE',
- categorystyle: 'procedure_category',
- },
- ],
-};
diff --git a/plugins/dev-tools/src/toolboxSimple.js b/plugins/dev-tools/src/toolboxSimple.js
deleted file mode 100644
index 278f69785..000000000
--- a/plugins/dev-tools/src/toolboxSimple.js
+++ /dev/null
@@ -1,83 +0,0 @@
-export default {
- kind: 'flyoutToolbox',
- contents: [
- {
- type: 'controls_ifelse',
- kind: 'block',
- },
- {
- type: 'logic_compare',
- kind: 'block',
- fields: {
- OP: 'EQ',
- },
- },
- {
- type: 'logic_operation',
- kind: 'block',
- fields: {
- OP: 'AND',
- },
- },
- {
- type: 'controls_repeat_ext',
- kind: 'block',
- inputs: {
- TIMES: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 10,
- },
- },
- },
- },
- },
- {
- type: 'logic_operation',
- kind: 'block',
- fields: {
- OP: 'AND',
- },
- },
- {
- type: 'logic_negate',
- kind: 'block',
- },
- {
- type: 'logic_boolean',
- kind: 'block',
- fields: {
- BOOL: 'TRUE',
- },
- },
- {
- type: 'logic_null',
- kind: 'block',
- enabled: false,
- },
- {
- type: 'logic_ternary',
- kind: 'block',
- },
- {
- type: 'text_charAt',
- kind: 'block',
- fields: {
- WHERE: 'FROM_START',
- },
- inputs: {
- VALUE: {
- block: {
- type: 'variables_get',
- fields: {
- VAR: {
- name: 'text',
- },
- },
- },
- },
- },
- },
- ],
-};
diff --git a/plugins/dev-tools/test/index.html b/plugins/dev-tools/test/index.html
deleted file mode 100644
index 91177218a..000000000
--- a/plugins/dev-tools/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Dev-Tools Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/dev-tools/test/index.js b/plugins/dev-tools/test/index.js
deleted file mode 100644
index 1443d3d4e..000000000
--- a/plugins/dev-tools/test/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Dev-tools Playground test.
- * @author samelh@google.com (Sam El-Huseini)
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground, toolboxCategories} from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/disable-top-blocks/CHANGELOG.md b/plugins/disable-top-blocks/CHANGELOG.md
deleted file mode 100644
index c46314200..000000000
--- a/plugins/disable-top-blocks/CHANGELOG.md
+++ /dev/null
@@ -1,653 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [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)
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [0.6.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/disable-top-blocks@0.6.8...@blockly/disable-top-blocks@0.6.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/disable-top-blocks@0.6.7...@blockly/disable-top-blocks@0.6.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/disable-top-blocks@0.6.6...@blockly/disable-top-blocks@0.6.7) (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))
-
-
-
-## [0.6.6](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.5...@blockly/disable-top-blocks@0.6.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.5](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.4...@blockly/disable-top-blocks@0.6.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.4](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.3...@blockly/disable-top-blocks@0.6.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.3](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.2...@blockly/disable-top-blocks@0.6.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.2](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.1...@blockly/disable-top-blocks@0.6.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.1](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.6.0...@blockly/disable-top-blocks@0.6.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.6.0](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.16...@blockly/disable-top-blocks@0.6.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))
-
-
-
-## [0.5.16](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.15...@blockly/disable-top-blocks@0.5.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.15](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.14...@blockly/disable-top-blocks@0.5.15) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.14](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.13...@blockly/disable-top-blocks@0.5.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.13](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.12...@blockly/disable-top-blocks@0.5.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.12](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.11...@blockly/disable-top-blocks@0.5.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.11](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.10...@blockly/disable-top-blocks@0.5.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.10](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.9...@blockly/disable-top-blocks@0.5.10) (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)
-
-
-
-
-
-## [0.5.9](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.8...@blockly/disable-top-blocks@0.5.9) (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))
-
-
-
-
-
-## [0.5.8](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.7...@blockly/disable-top-blocks@0.5.8) (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))
-
-
-
-
-
-## [0.5.7](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.6...@blockly/disable-top-blocks@0.5.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.6](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.5...@blockly/disable-top-blocks@0.5.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.5](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.4...@blockly/disable-top-blocks@0.5.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.4](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.3...@blockly/disable-top-blocks@0.5.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)
-
-
-
-## [0.5.3](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.2...@blockly/disable-top-blocks@0.5.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.2](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.1...@blockly/disable-top-blocks@0.5.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.5.1](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.5.0...@blockly/disable-top-blocks@0.5.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))
-
-
-
-## [0.5.0](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.15...@blockly/disable-top-blocks@0.5.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))
-
-
-
-## [0.4.15](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.14...@blockly/disable-top-blocks@0.4.15) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.14](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.13...@blockly/disable-top-blocks@0.4.14) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.13](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.12...@blockly/disable-top-blocks@0.4.13) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.12](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.11...@blockly/disable-top-blocks@0.4.12) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.11](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.10...@blockly/disable-top-blocks@0.4.11) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.10](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.9...@blockly/disable-top-blocks@0.4.10) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.9](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.8...@blockly/disable-top-blocks@0.4.9) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.8](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.7...@blockly/disable-top-blocks@0.4.8) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.7](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.6...@blockly/disable-top-blocks@0.4.7) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.6](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.5...@blockly/disable-top-blocks@0.4.6) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.5](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.4...@blockly/disable-top-blocks@0.4.5) (2023-10-30)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.4](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.3...@blockly/disable-top-blocks@0.4.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.3](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.2...@blockly/disable-top-blocks@0.4.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.2](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.1...@blockly/disable-top-blocks@0.4.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.1](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.4.0...@blockly/disable-top-blocks@0.4.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.4.0](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.3.1...@blockly/disable-top-blocks@0.4.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [0.3.1](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.3.0...@blockly/disable-top-blocks@0.3.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.3.0](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.17...@blockly/disable-top-blocks@0.3.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))
-
-
-
-## [0.2.17](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.16...@blockly/disable-top-blocks@0.2.17) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.16](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.15...@blockly/disable-top-blocks@0.2.16) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.15](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.14...@blockly/disable-top-blocks@0.2.15) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.14](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.13...@blockly/disable-top-blocks@0.2.14) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.13](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.12...@blockly/disable-top-blocks@0.2.13) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.12](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.11...@blockly/disable-top-blocks@0.2.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.11](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.10...@blockly/disable-top-blocks@0.2.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.10](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.9...@blockly/disable-top-blocks@0.2.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.9](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.8...@blockly/disable-top-blocks@0.2.9) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [0.2.8](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.7...@blockly/disable-top-blocks@0.2.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.7](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.6...@blockly/disable-top-blocks@0.2.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.6](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.5...@blockly/disable-top-blocks@0.2.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.5](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.4...@blockly/disable-top-blocks@0.2.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.4](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.3...@blockly/disable-top-blocks@0.2.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.3](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.2...@blockly/disable-top-blocks@0.2.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.2](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.1...@blockly/disable-top-blocks@0.2.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.1](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.2.0...@blockly/disable-top-blocks@0.2.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## [0.2.0](https://github.com/google/blockly-samples/compare/@blockly/disable-top-blocks@0.1.42...@blockly/disable-top-blocks@0.2.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* 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))
-
-
-
-## 0.1.42 (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))
-
-
-
-
-
-## 0.1.41 (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))
-
-
-
-
-
-## 0.1.39 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## 0.1.38 (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))
-
-
-
-
-
-## 0.1.37 (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))
-
-
-
-
-
-## 0.1.36 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/disable-top-blocks
-
-
-
-
-
-## 0.1.35 (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))
-
-
-
-
-
-## 0.1.34 (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/plugins/disable-top-blocks/README.md b/plugins/disable-top-blocks/README.md
deleted file mode 100644
index 481b2fce5..000000000
--- a/plugins/disable-top-blocks/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# @blockly/disable-top-blocks [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that shows the
-'disable' context menu option only on non-orphan blocks. This is useful in
-conjunction with the `Blockly.Events.disableOrphans` event handler (which you
-must set up yourself).
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/disable-top-blocks
-```
-
-### npm
-
-```
-npm install @blockly/disable-top-blocks --save
-```
-
-## Usage
-
-```js
-import * as Blockly from 'blockly';
-import {DisableTopBlocks} from '@blockly/disable-top-blocks';
-
-// Inject Blockly.
-const workspace = Blockly.inject('blocklyDiv', {};
-
-// Add the disableOrphans event handler. This is not done automatically by
-// the plugin and should be handled by your application.
-workspace.addChangeListener(Blockly.Events.disableOrphans);
-
-// The plugin must be initialized before it has any effect.
-const disableTopBlocksPlugin = new DisableTopBlocks();
-disableTopBlocksPlugin.init();
-```
-
-## API
-
-- `init` initializes the plugin and modifies the behavior of the 'disable'
- context menu item.
-- `dispose` restores the original behavior of the context menu. This is never
- required to be called, but can be if you want to programmatically disable
- the effects of the plugin.
-
-## License
-
-Apache 2.0
diff --git a/plugins/disable-top-blocks/package.json b/plugins/disable-top-blocks/package.json
deleted file mode 100644
index f7555b8ae..000000000
--- a/plugins/disable-top-blocks/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "@blockly/disable-top-blocks",
- "version": "13.2.0",
- "description": "A Blockly plugin that shows the 'disable' context menu option only on non-orphan blocks.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "start": "blockly-scripts start",
- "predeploy": "npm run build && blockly-scripts predeploy"
- },
- "main": "./dist/index.js",
- "module": "./src/index.js",
- "unpkg": "./dist/index.js",
- "author": "",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "disable-top-blocks"
- ],
- "homepage": "git@github.com:RaspberryPiFoundation/blockly-samples/tree/master/plugins/disable-top-blocks#readme",
- "bugs": {
- "url": "git@github.com:RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "git@github.com:RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/disable-top-blocks"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/disable-top-blocks/src/index.js b/plugins/disable-top-blocks/src/index.js
deleted file mode 100644
index 457c19186..000000000
--- a/plugins/disable-top-blocks/src/index.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-/**
- * @fileoverview Plugin for changing the context menu to match the
- * `disableOrphans` event handler.
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * This plugin changes the logic of the enable/disable context menu item. It is
- * enabled for all blocks except top-level blocks that have output or
- * previous connections. In other words, the option is disabled for orphan
- * blocks. Using this plugin allows users to disable valid non-orphan blocks,
- * but not re-enable blocks that have been automatically disabled by
- * `disableOrphans`.
- */
-export class DisableTopBlocks {
- /**
- * Modifies the context menu 'disable' option as described above.
- */
- init() {
- const disableMenuItem =
- Blockly.ContextMenuRegistry.registry.getItem('blockDisable');
- this.oldPreconditionFn = disableMenuItem.preconditionFn;
- disableMenuItem.preconditionFn = function (
- /** @type {!Blockly.ContextMenuRegistry.Scope} */ scope,
- ) {
- const block = scope.block;
- if (
- !block.isInFlyout &&
- block.workspace.options.disable &&
- block.isEditable()
- ) {
- if (block.getInheritedDisabled() || isOrphan(block)) {
- return 'disabled';
- }
- return 'enabled';
- }
- return 'hidden';
- };
- }
-
- /**
- * Turn off the effects of this plugin and restore the initial behavior.
- * This is never required to be called. It is optional in case you need to
- * disable the plugin.
- */
- dispose() {
- const disableMenuItem =
- Blockly.ContextMenuRegistry.registry.getItem('blockDisable');
- disableMenuItem.preconditionFn = this.oldPreconditionFn;
- }
-}
-
-/**
- * A block is an orphan if its parent is an orphan, or if it doesn't have a
- * parent but it does have a previous or output connection (so it expects to be
- * attached to something). This means all children of orphan blocks are also
- * orphans and cannot be manually re-enabled.
- * @param {!Blockly.BlockSvg} block Block to check.
- * @returns {boolean} Whether the block is an orphan.
- */
-function isOrphan(block) {
- // If the parent is an orphan block, this block should also be considered
- // an orphan so it cannot be manually re-enabled.
- const parent = /** @type {Blockly.BlockSvg} */ (block.getParent());
- if (parent && isOrphan(parent)) {
- return true;
- }
- return !parent && !!(block.outputConnection || block.previousConnection);
-}
diff --git a/plugins/disable-top-blocks/test/index.html b/plugins/disable-top-blocks/test/index.html
deleted file mode 100644
index 70aaa3122..000000000
--- a/plugins/disable-top-blocks/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly DisableTopBlocks Plugin Test
-
-
-
-
-
-
-
-
diff --git a/plugins/disable-top-blocks/test/index.js b/plugins/disable-top-blocks/test/index.js
deleted file mode 100644
index 553569f10..000000000
--- a/plugins/disable-top-blocks/test/index.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Disable top blocks plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {toolboxCategories, createPlayground} from '@blockly/dev-tools';
-import {DisableTopBlocks} from '../src/index';
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
-
- // Add the disableOrphans event handler. This is not done automatically by
- // the plugin and should be handled by your application.
- workspace.addChangeListener(Blockly.Events.disableOrphans);
-
- // The plugin must be initialized before it has any effect.
- const disableTopBlocksPlugin = new DisableTopBlocks();
- disableTopBlocksPlugin.init();
-
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: toolboxCategories,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/field-angle/CHANGELOG.md b/plugins/field-angle/CHANGELOG.md
deleted file mode 100644
index 31010a97e..000000000
--- a/plugins/field-angle/CHANGELOG.md
+++ /dev/null
@@ -1,509 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-### ⚠ BREAKING CHANGES
-
-* make field-multilineinput keyboard navigable and accessible (#2729)
-* Bump Blockly dependency to v13 (#2704)
-
-### Features
-
-* make field-multilineinput keyboard navigable and accessible ([#2729](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2729))
-
-### Bug Fixes
-
-* Improve accessibility of `FieldAngle` ([#2697](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2697))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-angle@6.0.8...@blockly/field-angle@6.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-angle@6.0.7...@blockly/field-angle@6.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-angle@6.0.6...@blockly/field-angle@6.0.7) (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))
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.5...@blockly/field-angle@6.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.4...@blockly/field-angle@6.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.3...@blockly/field-angle@6.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.2...@blockly/field-angle@6.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.1...@blockly/field-angle@6.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@6.0.0...@blockly/field-angle@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.16...@blockly/field-angle@6.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))
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.15...@blockly/field-angle@5.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.14...@blockly/field-angle@5.0.15) (2025-05-15)
-
-
-### Bug Fixes
-
-* Fix ephemeral focus being taken twice ([#2521](https://github.com/google/blockly-samples/issues/2521)) ([29b5a0d](https://github.com/google/blockly-samples/commit/29b5a0d896e7e6f7eb83867bd5b2577bf808e839)), closes [#2514](https://github.com/google/blockly-samples/issues/2514) [#2515](https://github.com/google/blockly-samples/issues/2515) [#2514](https://github.com/google/blockly-samples/issues/2514) [#2515](https://github.com/google/blockly-samples/issues/2515) [#2527](https://github.com/google/blockly-samples/issues/2527)
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.13...@blockly/field-angle@5.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.12...@blockly/field-angle@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.11...@blockly/field-angle@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.10...@blockly/field-angle@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.9...@blockly/field-angle@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.8...@blockly/field-angle@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.7...@blockly/field-angle@5.0.8) (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))
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.6...@blockly/field-angle@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.5...@blockly/field-angle@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.4...@blockly/field-angle@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.3...@blockly/field-angle@5.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.2...@blockly/field-angle@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.1...@blockly/field-angle@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@5.0.0...@blockly/field-angle@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@4.0.4...@blockly/field-angle@5.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))
-* 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))
-* remove some uses of generateFieldTextBlocks ([#2357](https://github.com/google/blockly-samples/issues/2357)) ([53b3fa4](https://github.com/google/blockly-samples/commit/53b3fa4604aabb1fc5240d41c8d1d389d4b15301))
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-angle@4.0.3...@blockly/field-angle@4.0.4) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-angle@4.0.2...@blockly/field-angle@4.0.3) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-angle@4.0.1...@blockly/field-angle@4.0.2) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@4.0.0...@blockly/field-angle@4.0.1) (2024-04-11)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.13...@blockly/field-angle@4.0.0) (2024-04-04)
-
-
-### ⚠ BREAKING CHANGES
-
-* The multiline text input field no longer registers itself on load. The developer must either manually register the field or install blocks, which will install the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-* The angle field no longer registers itself on load. The developer must manually register the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-
-### Features
-
-* add block definitions to fields ([#2299](https://github.com/google/blockly-samples/issues/2299)) ([c197af6](https://github.com/google/blockly-samples/commit/c197af6c67bc989bbdb4e83a62abc08167bcbbfe)), closes [#2162](https://github.com/google/blockly-samples/issues/2162) [#2202](https://github.com/google/blockly-samples/issues/2202) [#2221](https://github.com/google/blockly-samples/issues/2221) [#2211](https://github.com/google/blockly-samples/issues/2211) [#2220](https://github.com/google/blockly-samples/issues/2220) [#2232](https://github.com/google/blockly-samples/issues/2232) [#2233](https://github.com/google/blockly-samples/issues/2233) [#2296](https://github.com/google/blockly-samples/issues/2296)
-
-
-
-## [3.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.12...@blockly/field-angle@3.0.13) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.11...@blockly/field-angle@3.0.12) (2024-02-08)
-
-
-### Bug Fixes
-
-* Display rounded number in field angle. ([#2191](https://github.com/google/blockly-samples/issues/2191)) ([68d60b7](https://github.com/google/blockly-samples/commit/68d60b7868f0a89c09afd16d64e7f2f16a719d7f))
-
-
-
-## [3.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.10...@blockly/field-angle@3.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.9...@blockly/field-angle@3.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.8...@blockly/field-angle@3.0.9) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.7...@blockly/field-angle@3.0.8) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.6...@blockly/field-angle@3.0.7) (2023-10-30)
-
-
-### Bug Fixes
-
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* publish type for field angle ([#1956](https://github.com/google/blockly-samples/issues/1956)) ([f0e8dbf](https://github.com/google/blockly-samples/commit/f0e8dbfacfe1a7207380c83a347603a3dd845d58))
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.5...@blockly/field-angle@3.0.6) (2023-09-21)
-
-
-### Bug Fixes
-
-* Fire intermediate events instead of change events while dragging angle field ([#1933](https://github.com/google/blockly-samples/issues/1933)) ([dc79b14](https://github.com/google/blockly-samples/commit/dc79b14e4bc402e76cff960a4d72d4ac3a4365a5))
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.4...@blockly/field-angle@3.0.5) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.3...@blockly/field-angle@3.0.4) (2023-08-31)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.2...@blockly/field-angle@3.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.1...@blockly/field-angle@3.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@3.0.0...@blockly/field-angle@3.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@2.0.1...@blockly/field-angle@3.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@2.0.0...@blockly/field-angle@2.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@1.2.2...@blockly/field-angle@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))
-
-
-
-## [1.2.2](https://github.com/google/blockly-samples/compare/@blockly/field-angle@1.2.1...@blockly/field-angle@1.2.2) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [1.2.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@1.2.0...@blockly/field-angle@1.2.1) (2023-06-15)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## [1.2.0](https://github.com/google/blockly-samples/compare/@blockly/field-angle@1.1.1...@blockly/field-angle@1.2.0) (2023-05-25)
-
-
-### Features
-
-* Revise fields ([#1700](https://github.com/google/blockly-samples/issues/1700)) ([c326f7b](https://github.com/google/blockly-samples/commit/c326f7b1ef54fe45387046c693ebd5afe2b2c571))
-
-
-
-## [1.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-angle@1.1.0...@blockly/field-angle@1.1.1) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-angle
-
-
-
-
-
-## 1.1.0 (2023-05-11)
-
-
-### Features
-
-* Add angle, colour, and multiline fields. (Rebase of [#1674](https://github.com/google/blockly-samples/issues/1674)) ([#1693](https://github.com/google/blockly-samples/issues/1693)) ([1b447f4](https://github.com/google/blockly-samples/commit/1b447f41d6293f14e846b8a4d82d289a5637a99a))
diff --git a/plugins/field-angle/README.md b/plugins/field-angle/README.md
deleted file mode 100644
index d9f0b9afd..000000000
--- a/plugins/field-angle/README.md
+++ /dev/null
@@ -1,112 +0,0 @@
-# @blockly/field-angle [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) angle field.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-angle
-```
-
-### npm
-
-```
-npm install @blockly/field-angle --save
-```
-
-## Usage
-
-### Installation
-
-You must register this field with Blockly. You can do this by calling
-`registerFieldAngle` before instantiating your blocks. If another field is
-registered under the same name, this field will overwrite it.
-
-### Parameters
-
-This field accepts up to 9 parameters, in addition to the 4 accepted by the
-[number field][number-field]:
-
-- "value" to specify the default value of the angle field. Defaults to 0.
-- "mode" to specify the basic setup of the angle field. Either Mode.COMPASS
- or Mode.PROTRACTOR. COMPASS specifies "clockwise" should be "true", and the
- "offset" should be "90". PROTRACTOR specifies that "clockwise" should be
- "false" and the "offset" should be 0. These settings can be overridden by
- the following options. Defaults to PROTRACTOR.
-- "clockwise" to specify whether the value of the angle field should increase
- in the clockwise direction (if true) or in the counter-clockwise direction
- (if false). Defaults to false.
-- "offset" to specify where the minimum/maximum displayed value of the angle
- field should be. The offset is in degree units that consider the circle to
- be 360 degrees. A 0 offset (or multiple of 360) specifies the right side of
- the circle as the minimum/maximum value. More positive values rotate
- clockwise and more negative values rotate counter clockwise (regardless of
- the "clockwise" setting). Defaults to 0.
-- "displayMin" to specify the minimum displayed value of the angle field. The
- minimum displayed value may not actually be a selectable value. For example,
- you may have a full 0-360 degree circle ("displayMin" of 0), but only be
- able to select angle values from 90-270. Defaults to 0.
-- "displayMax" to specify the maximum displayed value of the angle field. The
- maximum displayed value may not actually be a selectable value. For example,
- you may have a full 0-360 degree circle ("displayMax" of 360), but only be
- able to select angle values from 90-270. Defaults to 360.
-- "minorTick" to specify the distance between small tick marks on the angle
- picker. The minorTick is in units from your displayMin-displayMax. The ticks
- start at your "min" rounded up to a multiple of your "minorTick". The
- ticks end at you "max" rounded down to a multiple of your "minorTick".
- Defaults to 15.
-- "majorTick" to specify the distance between big tick marks on the angle
- picker. The majorTick is in units from your displayMin-displayMax. The ticks
- start at your "min" rounded up to a multiple of your "majorTick". The
- ticks end at you "max" rounded down to a multiple of your "majorTick".
- Defaults to 45.
-- "symbol" to specify the unit symbol to append to your number. Defaults to °.
- If this is used to specify "radians" or similar,
- `Blockly.Msg['ARIA_LABEL_FIELD_ANGLE']` should be overridden accordingly to
- ensure that the screenreader description remains consistent.
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldAngle} from '@blockly/field-angle';
-
-registerFieldAngle();
-Blockly.Blocks['test_field_angle'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('angle: ')
- .appendField(new FieldAngle(90), 'FIELDNAME');
- },
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldAngle} from '@blockly/field-angle';
-
-registerFieldAngle();
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_field_angle',
- message0: 'angle: %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- value: 50,
- },
- ],
- },
-]);
-```
-
-## License
-
-Apache 2.0
-
-[number-field]: https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/number#creation
diff --git a/plugins/field-angle/package.json b/plugins/field-angle/package.json
deleted file mode 100644
index a8a8f7222..000000000
--- a/plugins/field-angle/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "name": "@blockly/field-angle",
- "version": "13.2.0",
- "description": "A Blockly angle field.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "field",
- "angle"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-angle#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-angle"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-angle/readme-media/clockwise_false.gif b/plugins/field-angle/readme-media/clockwise_false.gif
deleted file mode 100644
index daa54b7fa..000000000
Binary files a/plugins/field-angle/readme-media/clockwise_false.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/clockwise_true.gif b/plugins/field-angle/readme-media/clockwise_true.gif
deleted file mode 100644
index 58e103c13..000000000
Binary files a/plugins/field-angle/readme-media/clockwise_true.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/collapsed.png b/plugins/field-angle/readme-media/collapsed.png
deleted file mode 100644
index a84dae0d2..000000000
Binary files a/plugins/field-angle/readme-media/collapsed.png and /dev/null differ
diff --git a/plugins/field-angle/readme-media/compass.gif b/plugins/field-angle/readme-media/compass.gif
deleted file mode 100644
index ac5c1d445..000000000
Binary files a/plugins/field-angle/readme-media/compass.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/offset_right.png b/plugins/field-angle/readme-media/offset_right.png
deleted file mode 100644
index 04c97e1e5..000000000
Binary files a/plugins/field-angle/readme-media/offset_right.png and /dev/null differ
diff --git a/plugins/field-angle/readme-media/offset_top.png b/plugins/field-angle/readme-media/offset_top.png
deleted file mode 100644
index 66c62b414..000000000
Binary files a/plugins/field-angle/readme-media/offset_top.png and /dev/null differ
diff --git a/plugins/field-angle/readme-media/on_block.png b/plugins/field-angle/readme-media/on_block.png
deleted file mode 100644
index 03c2c880c..000000000
Binary files a/plugins/field-angle/readme-media/on_block.png and /dev/null differ
diff --git a/plugins/field-angle/readme-media/protractor.gif b/plugins/field-angle/readme-media/protractor.gif
deleted file mode 100644
index fdd032785..000000000
Binary files a/plugins/field-angle/readme-media/protractor.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/round_70.gif b/plugins/field-angle/readme-media/round_70.gif
deleted file mode 100644
index 430c55be4..000000000
Binary files a/plugins/field-angle/readme-media/round_70.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/validator.gif b/plugins/field-angle/readme-media/validator.gif
deleted file mode 100644
index 4257c56ea..000000000
Binary files a/plugins/field-angle/readme-media/validator.gif and /dev/null differ
diff --git a/plugins/field-angle/readme-media/with_editor.png b/plugins/field-angle/readme-media/with_editor.png
deleted file mode 100644
index afe936344..000000000
Binary files a/plugins/field-angle/readme-media/with_editor.png and /dev/null differ
diff --git a/plugins/field-angle/readme-media/wrap.gif b/plugins/field-angle/readme-media/wrap.gif
deleted file mode 100644
index 146f7b29e..000000000
Binary files a/plugins/field-angle/readme-media/wrap.gif and /dev/null differ
diff --git a/plugins/field-angle/src/field_angle.ts b/plugins/field-angle/src/field_angle.ts
deleted file mode 100644
index 4c13e2fdd..000000000
--- a/plugins/field-angle/src/field_angle.ts
+++ /dev/null
@@ -1,800 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Angle input field.
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * Class for an editable angle field.
- */
-export class FieldAngle extends Blockly.FieldNumber {
- /** Half the width of protractor image. */
- static readonly HALF = 100 / 2;
-
- /**
- * Radius of protractor circle. Slightly smaller than protractor size since
- * otherwise SVG crops off half the border at the edges.
- */
- static readonly RADIUS: number = FieldAngle.HALF - 1;
-
- static readonly DEFAULT_PRECISION = 15;
- static readonly DEFAULT_MIN = 0;
- static readonly DEFAULT_MAX = 360;
-
- /**
- * Whether the angle should increase as the angle picker is moved clockwise
- * (true) or counterclockwise (false).
- */
- private clockwise = false;
-
- /**
- * The angle (in degrees) at which displayMin is pointed. Always in the
- * counterclockwise direction, regardless of the field's clockwise property.
- * Usually either 0 (0 = right) or 90 (0 = up).
- */
- private offset = 0;
-
- /**
- * Smallest value displayed on the gauge. Usually 0 or -180.
- */
- private displayMin = 0;
-
- /**
- * Largest value displayed on the gauge. Usually 360 or 180.
- */
- private displayMax = 360;
-
- /**
- * Distance between minor tick marks on dial. Zero to disable.
- * If displayMin/Max span 360, then majorTick would usually be 15.
- * May not be negative.
- */
- private minorTick = 15;
-
- /**
- * Distance between major tick marks on dial. Zero to disable.
- * If displayMin/Max span 360, then majorTick would usually be 45.
- * May not be negative.
- */
- private majorTick = 45;
-
- /**
- * Unit symbol to append to the number when not being edited.
- */
- private symbol = '°';
-
- /**
- * Array holding info needed to unbind events.
- * Used for disposing.
- * Ex: [[node, name, func], [node, name, func]].
- */
- private boundEvents: Blockly.browserEvents.Data[] = [];
-
- /** Dynamic red line pointing at the value's angle. */
- private line: SVGLineElement | null = null;
-
- /** Dynamic pink area extending from 0 to the value's angle. */
- private gauge: SVGPathElement | null = null;
-
- /** The degree symbol for this field. */
- protected symbolElement: SVGTSpanElement | null = null;
-
- /**
- * @param value The initial value of the field. Should cast to a number.
- * Defaults to 0. Also accepts Field.SKIP_SETUP if you wish to skip setup
- * (only used by subclasses that want to handle configuration and setting
- * the field value after their own constructors have run).
- * @param validator A function that is called to validate changes to the
- * field's value. Takes in a number & returns a validated number, or null
- * to abort the change.
- * @param config A map of options used to configure the field.
- * See the [field creation documentation]{@link
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/angle#creation}
- * for a list of properties this parameter supports.
- */
- constructor(
- value?: string | number | typeof Blockly.Field.SKIP_SETUP,
- validator?: FieldAngleValidator,
- config?: FieldAngleConfig,
- ) {
- super(Blockly.Field.SKIP_SETUP);
-
- if (value === Blockly.Field.SKIP_SETUP) return;
- if (config) {
- this.configure_(config);
- if (config.min === undefined || config.min === null) {
- this.setMin(FieldAngle.DEFAULT_MIN);
- }
- if (config.max === undefined || config.max === null) {
- this.setMax(FieldAngle.DEFAULT_MAX);
- }
- if (config.precision === undefined || config.precision === null) {
- this.setPrecision(FieldAngle.DEFAULT_PRECISION);
- }
- } else {
- this.setMin(FieldAngle.DEFAULT_MIN);
- this.setMax(FieldAngle.DEFAULT_MAX);
- this.setPrecision(FieldAngle.DEFAULT_PRECISION);
- }
- this.setValue(value);
- if (validator) {
- this.setValidator(validator);
- }
- }
-
- /**
- * Configure the field based on the given map of options.
- *
- * @param config A map of options to configure the field based on.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override configure_(config: FieldAngleConfig) {
- super.configure_(config);
- switch (config.mode) {
- case Mode.COMPASS:
- this.clockwise = true;
- this.offset = 90;
- break;
- case Mode.PROTRACTOR:
- // This is the default mode, so we could do nothing. But just to
- // future-proof, we'll set it anyway.
- this.clockwise = false;
- this.offset = 0;
- break;
- }
-
- // Allow individual settings to override the mode setting.
- if (config.clockwise !== undefined) this.clockwise = config.clockwise;
- if (config.offset !== undefined) this.offset = config.offset;
- if (config.displayMin !== undefined) this.displayMin = config.displayMin;
- if (config.displayMax !== undefined) this.displayMax = config.displayMax;
- if (config.minorTick !== undefined) this.minorTick = config.minorTick;
- if (config.majorTick !== undefined) this.majorTick = config.majorTick;
- if (config.symbol !== undefined) this.symbol = config.symbol;
-
- // Sanity check the inputs.
- if (this.displayMin >= this.displayMax) {
- throw Error('Display min must be larger than display max');
- }
- if (this.minorTick < 0 || this.majorTick < 0) {
- throw Error('Ticks cannot be negative');
- }
- }
-
- override getAriaTypeName() {
- return Blockly.Msg['ARIA_TYPE_FIELD_ANGLE'];
- }
-
- override getAriaValue() {
- return Blockly.Msg['ARIA_LABEL_FIELD_ANGLE'].replace(
- '%1',
- super.getAriaValue() ?? '',
- );
- }
-
- /**
- * Create the block UI for this field.
- *
- * @internal
- */
- override initView() {
- super.initView();
- if (this.symbol) {
- // Add the degree symbol to the left of the number,
- // even in RTL (https://github.com/google/blockly/issues/2380).
- this.symbolElement = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.TSPAN,
- {class: 'blocklyAngleSymbol'},
- );
- this.symbolElement.appendChild(document.createTextNode(this.symbol));
- this.getTextElement().appendChild(this.symbolElement);
- }
- }
-
- /**
- * Updates the angle when the field rerenders.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override render_() {
- super.render_();
- this.updateGraph();
- }
-
- /**
- * Create and show the angle field's editor.
- *
- * @param e Optional mouse event that triggered the field to open,
- * or undefined if triggered programmatically.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override showEditor_(e?: Event) {
- // Mobile browsers have issues with in-line textareas (focus & keyboards).
- // Also, don't let the parent take ephemeral focus since the drop-down div
- // below will handle it, instead.
- const noFocus =
- Blockly.utils.userAgent.MOBILE ||
- Blockly.utils.userAgent.ANDROID ||
- Blockly.utils.userAgent.IPAD;
-
- const editor = this.dropdownCreate();
- Blockly.DropDownDiv.getContentDiv().appendChild(editor);
-
- const sourceBlock = this.getSourceBlock();
- if (sourceBlock instanceof Blockly.BlockSvg) {
- Blockly.DropDownDiv.setColour(
- sourceBlock.style.colourPrimary,
- sourceBlock.style.colourTertiary,
- );
- }
-
- Blockly.DropDownDiv.showPositionedByField(
- this,
- this.dropdownDispose.bind(this),
- );
-
- super.showEditor_(e, noFocus, false);
-
- this.updateGraph();
- }
-
- /**
- * Creates the angle dropdown editor.
- *
- * @returns The newly created slider.
- */
- private dropdownCreate(): SVGSVGElement {
- const svg = Blockly.utils.dom.createSvgElement(Blockly.utils.Svg.SVG, {
- 'xmlns': Blockly.utils.dom.SVG_NS,
- // eslint-disable-next-line @typescript-eslint/naming-convention
- 'xmlns:html': Blockly.utils.dom.HTML_NS,
- // eslint-disable-next-line @typescript-eslint/naming-convention
- 'xmlns:xlink': Blockly.utils.dom.XLINK_NS,
- 'version': '1.1',
- 'height': FieldAngle.HALF * 2 + 'px',
- 'width': FieldAngle.HALF * 2 + 'px',
- });
- svg.style.touchAction = 'none';
- const circle = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.CIRCLE,
- {
- cx: FieldAngle.HALF,
- cy: FieldAngle.HALF,
- r: FieldAngle.RADIUS,
- class: 'blocklyAngleCircle',
- },
- svg,
- );
- this.gauge = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.PATH,
- {
- class: 'blocklyAngleGauge',
- },
- svg,
- );
- this.line = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.LINE,
- {
- x1: FieldAngle.HALF,
- y1: FieldAngle.HALF,
- class: 'blocklyAngleLine',
- },
- svg,
- );
-
- // Draw markers around the edge.
- const minValueDegrees = Blockly.utils.math.toDegrees(
- this.fieldAngleToRadians(this.min_),
- );
- const maxValueDegrees = Blockly.utils.math.toDegrees(
- this.fieldAngleToRadians(this.max_),
- );
-
- /**
- * Draw a set of ticks on the gauge.
- *
- * @param tickAngle Angle between each tick.
- * @param length Length of the tick (minor=5, major=10).
- */
- const drawTicks = (tickAngle: number, length: number) => {
- let min = Math.ceil(minValueDegrees / tickAngle) * tickAngle;
- let max = Math.floor(maxValueDegrees / tickAngle) * tickAngle;
-
- if (this.clockwise) {
- if (min < max) {
- min += 360;
- }
- } else {
- if (min > max) {
- max += 360;
- }
- }
- if (max === min) {
- // Technically this could actually be zero, but more likely it's whole.
- max += 360;
- }
- if (min > max) {
- [min, max] = [max, min];
- }
- for (let angle = min; angle <= max; angle += tickAngle) {
- Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.LINE,
- {
- x1: FieldAngle.HALF + FieldAngle.RADIUS,
- y1: FieldAngle.HALF,
- x2: FieldAngle.HALF + FieldAngle.RADIUS - length,
- y2: FieldAngle.HALF,
- class: 'blocklyAngleMarks',
- transform:
- 'rotate(' +
- -angle +
- ',' +
- FieldAngle.HALF +
- ',' +
- FieldAngle.HALF +
- ')',
- },
- svg,
- );
- }
- };
-
- const displayRange = this.displayMax - this.displayMin;
- const minorTickAngle = (360 / displayRange) * this.minorTick;
- if (minorTickAngle) {
- drawTicks(minorTickAngle, 5);
- }
- const majorTickAngle = (360 / displayRange) * this.majorTick;
- if (majorTickAngle) {
- drawTicks(majorTickAngle, 10);
- }
-
- // The angle picker is different from other fields in that it updates on
- // mousemove even if it's not in the middle of a drag. In future we may
- // change this behaviour.
- this.boundEvents.push(
- Blockly.browserEvents.conditionalBind(svg, 'click', this, this.hide),
- );
- // On touch devices, the picker's value is only updated with a drag. Add
- // a click handler on the drag surface to update the value if the surface
- // is clicked.
- this.boundEvents.push(
- Blockly.browserEvents.conditionalBind(
- circle,
- 'pointerdown',
- this,
- this.onMouseMove_,
- true,
- ),
- );
- this.boundEvents.push(
- Blockly.browserEvents.conditionalBind(
- circle,
- 'pointermove',
- this,
- this.onMouseMove_,
- true,
- ),
- );
- return svg;
- }
-
- /**
- * Disposes of events belonging to the angle editor.
- */
- private dropdownDispose() {
- for (const event of this.boundEvents) {
- Blockly.browserEvents.unbind(event);
- }
- this.boundEvents.length = 0;
- this.gauge = null;
- this.line = null;
- }
-
- /** Hide the editor. */
- private hide() {
- this.recomputeAriaContext();
- Blockly.DropDownDiv.hideIfOwner(this);
- Blockly.WidgetDiv.hide();
- }
-
- /**
- * Set the angle to match the mouse's position.
- *
- * @param e Mouse move event.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected onMouseMove_(e: PointerEvent) {
- // Calculate angle.
- const bBox = this.gauge?.ownerSVGElement?.getBoundingClientRect();
- if (!bBox) {
- // This can't happen, but TypeScript thinks it can and lint forbids `!.`.
- return;
- }
- const dx = e.clientX - bBox.left - FieldAngle.HALF;
- const dy = e.clientY - bBox.top - FieldAngle.HALF;
- let angle = Math.atan2(-dy, dx);
- if (isNaN(angle)) {
- // This shouldn't happen, but let's not let this error propagate further.
- return;
- }
- angle = this.radiansToFieldAngle(angle);
- this.displayMouseOrKeyboardValue(angle);
- }
-
- /**
- * Convert an on-screen angle into a value for this field.
- *
- * @param angle Radians where 0: East, π/2: North, π or -π: West, -π/2: South.
- * @returns Angle value for this field, scaled and offset as specified.
- */
- private radiansToFieldAngle(angle: number): number {
- // Convert angle from radians (-π to π) to turns (-0.5 to 0.5).
- angle /= 2 * Math.PI;
- // Compensate for offset.
- angle -= this.offset / 360;
- // Flip if clockwise.
- if (this.clockwise) {
- angle *= -1;
- }
- // Normalize to positive.
- angle %= 1;
- if (angle < 0) {
- angle += 1;
- }
- // Convert angle from turns (0.0 to 1.0) to the display min/max range.
- angle *= this.displayMax - this.displayMin;
- angle += this.displayMin;
- return angle;
- }
-
- /**
- * Convert a value for this field into an on-screen angle.
- *
- * @param angle Angle value for this field, scaled and offset as specified.
- * @returns Radians where 0: East, π/2: North, π or -π: West, -π/2: South.
- */
- private fieldAngleToRadians(angle: number): number {
- // Convert angle from the display min/max range to turns (0.0 to 1.0).
- angle -= this.displayMin;
- angle /= this.displayMax - this.displayMin;
- // Flip if clockwise.
- if (this.clockwise) {
- angle *= -1;
- }
- // Compensate for offset.
- angle += this.offset / 360;
- // Normalize to span equally across zero (-0.5 to 0.5).
- angle %= 1;
- if (angle > 0.5) {
- angle -= 1;
- }
- if (angle < -0.5) {
- angle += 1;
- }
- // Convert angle from turns to radians.
- angle *= 2 * Math.PI;
- return angle;
- }
-
- /**
- * Handles and displays values that are input via mouse or arrow key input.
- * These values need to be rounded and wrapped before being displayed so
- * that the text input's value is appropriate.
- *
- * @param angle New angle.
- */
- private displayMouseOrKeyboardValue(angle: number) {
- const validAngle = this.doClassValidation_(angle);
- if (validAngle !== null && validAngle !== this.value_) {
- // Intermediate value changes from user input are not confirmed until the
- // user closes the editor, and may be numerous. Inhibit reporting these as
- // normal block change events, and instead report them as special
- // intermediate changes that do not get recorded in undo history.
- const oldValue = this.value_;
- this.setEditorValue_(validAngle, false);
- if (
- this.sourceBlock_ &&
- Blockly.Events.isEnabled() &&
- this.value_ !== oldValue
- ) {
- Blockly.Events.fire(
- new (Blockly.Events.get(
- Blockly.Events.BLOCK_FIELD_INTERMEDIATE_CHANGE,
- ))(this.sourceBlock_, this.name || null, oldValue, this.value_),
- );
- Blockly.utils.aria.announceDynamicAriaState(this.getAriaValue());
- }
- }
- }
-
- /** Redraw the graph with the current angle. */
- private updateGraph() {
- if (!this.gauge || !this.line) {
- return;
- }
- let angle = Number(this.getText());
- if (isNaN(angle)) {
- // This shouldn't happen, but let's not let this error propagate further.
- return;
- }
- angle = this.fieldAngleToRadians(angle);
-
- let path = `M ${FieldAngle.HALF},${FieldAngle.HALF}`;
- let x2 = FieldAngle.HALF;
- let y2 = FieldAngle.HALF;
- if (!isNaN(angle)) {
- const angle1 = Blockly.utils.math.toRadians(this.offset);
- const x1 = Math.cos(angle1) * FieldAngle.RADIUS;
- const y1 = Math.sin(angle1) * -FieldAngle.RADIUS;
- x2 += Math.cos(angle) * FieldAngle.RADIUS;
- y2 -= Math.sin(angle) * FieldAngle.RADIUS;
- // Don't ask how the flag calculations work. They just do.
- const clockwiseFlag = Number(this.clockwise);
- let largeFlag = Math.abs(Math.floor((angle - angle1) / Math.PI) % 2);
- if (clockwiseFlag) {
- largeFlag = 1 - largeFlag;
- }
- path +=
- ` l ${x1},${y1} A ${FieldAngle.RADIUS},${FieldAngle.RADIUS} 0 ` +
- `${largeFlag} ${clockwiseFlag} ${x2},${y2} z`;
- }
- this.gauge.setAttribute('d', path);
- this.line.setAttribute('x2', `${x2}`);
- this.line.setAttribute('y2', `${y2}`);
- }
-
- /**
- * Handle key down to the editor.
- *
- * @param e Keyboard event.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override onHtmlInputKeyDown_(e: KeyboardEvent) {
- super.onHtmlInputKeyDown_(e);
- const block = this.getSourceBlock();
- if (!block) {
- throw new Error(
- 'The field has not yet been attached to its input. ' +
- 'Call appendField to attach it.',
- );
- }
-
- let multiplier = 0;
- switch (e.key) {
- case 'ArrowLeft':
- // decrement (increment in RTL)
- multiplier = block.RTL ? 1 : -1;
- break;
- case 'ArrowRight':
- // increment (decrement in RTL)
- multiplier = block.RTL ? -1 : 1;
- break;
- case 'ArrowDown':
- // decrement
- multiplier = -1;
- break;
- case 'ArrowUp':
- // increment
- multiplier = 1;
- break;
- }
- if (multiplier) {
- const value = this.getValue() as number;
- this.displayMouseOrKeyboardValue(value + multiplier * this.precision_);
- e.preventDefault();
- e.stopPropagation();
- }
- }
-
- /**
- * Ensure that the input value is a valid angle.
- *
- * @param newValue The input value.
- * @returns A valid angle, or null if invalid.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue: number,
- ): number | null | undefined;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(newValue?: number): number | null;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue?: number,
- ): number | null | undefined {
- // The obvious approach would be to call super.doClassValidation_ to handle
- // min/max limitations. However angle pickers out of range need to clamp
- // to the closest min/max point, which may involve a wrap to the opposite
- // end of the numeric scale.
- // E.g. min/max is 0/180 on a 0/360 display, and value is 365.
- // FieldNumber would clamp 365 to max (180), but 0 is closer on the dial.
- if (newValue === null) {
- return null;
- }
- let value = Number(newValue);
- if (isNaN(value) || !isFinite(value)) {
- return null;
- }
- // Get the value in range.
- value = this.wrapValue(value);
- // Round to nearest multiple of precision.
- if (this.precision_) {
- value = Math.round(value / this.precision_) * this.precision_;
- }
- // Deal with 6.6000000000000005 IEEE float errors.
- // Clean up floating point errors.
- value = Number(value.toFixed(10));
- // Clamp the value between min and max, noting wrapping.
- const displayRange = this.displayMax - this.displayMin;
- const valueRange = this.max_ - this.min_;
- if (value < this.min_) {
- const undershoot = this.min_ - value;
- const overshoot = displayRange - undershoot - valueRange;
- value = undershoot < overshoot ? this.min_ : this.max_;
- }
- if (value > this.max_) {
- const overshoot = value - this.max_;
- const undershoot = displayRange - overshoot - valueRange;
- value = undershoot < overshoot ? this.min_ : this.max_;
- }
- return value;
- }
-
- /**
- * Wraps the value so that it is in the min/max display range (e.g. 0 to 360).
- *
- * @param value The value to wrap.
- * @returns The wrapped value.
- */
- private wrapValue(value: number): number {
- const displayRange = this.displayMax - this.displayMin;
- value %= displayRange;
- while (value < this.displayMin) {
- value += displayRange;
- }
- while (value >= this.displayMax) {
- value -= displayRange;
- }
- return value;
- }
-
- /**
- * Construct a FieldAngle from a JSON arg object.
- *
- * @param options A JSON object with options
- * (value, mode, clockwise, offset, min, max, precision).
- * @returns The new field instance.
- * @nocollapse
- * @internal
- */
- static fromJson(options: FieldAngleFromJsonConfig): FieldAngle {
- // `this` might be a subclass of FieldAngle if that class doesn't override
- // the static fromJson method.
- return new this(options.value, undefined, options);
- }
-
- /**
- * Hides the angle editor and updates the ARIA label.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override widgetDispose_() {
- super.widgetDispose_();
- this.recomputeAriaContext();
- }
-}
-
-/** Register the field and any dependencies. */
-export function registerFieldAngle() {
- Blockly.fieldRegistry.register('field_angle', FieldAngle);
-}
-
-FieldAngle.prototype.DEFAULT_VALUE = 0;
-
-/**
- * CSS for angle field.
- */
-Blockly.Css.register(`
-.blocklyAngleCircle {
- stroke: #444;
- stroke-width: 1;
- fill: #ddd;
- fill-opacity: 0.8;
-}
-
-.blocklyAngleMarks {
- stroke: #444;
- stroke-width: 1;
-}
-
-.blocklyAngleGauge {
- fill: #f88;
- fill-opacity: 0.8;
- pointer-events: none;
-}
-
-.blocklyAngleLine {
- stroke: #f00;
- stroke-width: 2;
- stroke-linecap: round;
- pointer-events: none;
-}
-
-.blocklyAngleSymbol {
- dominant-baseline: central;
-}
-`);
-
-/**
- * The two main modes of the angle field.
- * Compass specifies:
- * - clockwise: true
- * - offset: 90
- * - min: 0
- * - max: 360
- * - precision: 15
- * - displayMin: 0
- * - displayMax: 360
- * - minorTick: 15
- * - majorTick: 45
- * - symbol: '°'
- *
- * Protractor specifies:
- * - clockwise: false
- * - offset: 0
- * - min: 0
- * - max: 360
- * - precision: 15
- * - displayMin: 0
- * - displayMax: 360
- * - minorTick: 15
- * - majorTick: 45
- * - symbol: '°'
- */
-export enum Mode {
- COMPASS = 'compass',
- PROTRACTOR = 'protractor',
-}
-
-/**
- * Extra configuration options for the angle field.
- */
-export interface FieldAngleConfig extends Blockly.FieldNumberConfig {
- mode?: Mode;
- clockwise?: boolean;
- offset?: number;
- displayMin?: number;
- displayMax?: number;
- minorTick?: number;
- majorTick?: number;
- symbol?: string;
-}
-
-/**
- * fromJson configuration options for the angle field.
- */
-export interface FieldAngleFromJsonConfig extends FieldAngleConfig {
- value?: number;
-}
-
-/**
- * A function that is called to validate changes to the field's value before
- * they are set.
- *
- * @see {@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/validators#return_values}
- * @param newValue The value to be validated.
- * @returns One of three instructions for setting the new value: `T`, `null`,
- * or `undefined`.
- *
- * - `T` to set this function's returned value instead of `newValue`.
- *
- * - `null` to invoke `doValueInvalid_` and not set a value.
- *
- * - `undefined` to set `newValue` as is.
- */
-export type FieldAngleValidator = Blockly.FieldNumberValidator;
diff --git a/plugins/field-angle/src/index.ts b/plugins/field-angle/src/index.ts
deleted file mode 100644
index ab5c44770..000000000
--- a/plugins/field-angle/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field_angle';
diff --git a/plugins/field-angle/test/field_angle_test.mocha.js b/plugins/field-angle/test/field_angle_test.mocha.js
deleted file mode 100644
index 3b519343e..000000000
--- a/plugins/field-angle/test/field_angle_test.mocha.js
+++ /dev/null
@@ -1,328 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {FieldAngle, registerFieldAngle} = require('../src/index');
-const {assert} = require('chai');
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldAngle', function () {
- setup(function () {
- registerFieldAngle();
- });
-
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- {title: 'NaN', value: NaN},
- {title: 'Non-Parsable String', value: 'bad'},
- {title: 'Infinity', value: Infinity},
- {title: 'Negative Infinity', value: -Infinity},
- {title: 'Infinity String', value: 'Infinity'},
- {title: 'Negative Infinity String', value: '-Infinity'},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- {title: 'Integer', value: 16, expectedValue: 15},
- {title: 'Float', value: 14.5, expectedValue: 15},
- {title: 'Integer String', value: '30', expectedValue: 30},
- {title: 'Float String', value: '0.75', expectedValue: 0},
- {title: '> 360°', value: 360 + 16, expectedValue: 15},
- {title: '< 0°', value: -16, expectedValue: 360 - 15},
- ];
- const addArgsAndJson = function (testCase) {
- testCase.args = [testCase.value];
- testCase.json = {value: testCase.value};
- };
- invalidValueTestCases.forEach(addArgsAndJson);
- validValueTestCases.forEach(addArgsAndJson);
-
- /**
- * The expected default value for the field being tested.
- * @type {*}
- */
- const defaultFieldValue = 0;
- /**
- * Asserts that the field property values are set to default.
- * @param {FieldAngle} field The field to check.
- */
- const assertFieldDefault = function (field) {
- assertFieldValue(field, defaultFieldValue);
- };
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldAngle} field The field to check.
- * @param {!FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertFieldValue(field, testCase.expectedValue);
- };
-
- runConstructorSuiteTests(
- FieldAngle,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldAngle,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- suite('setValue', function () {
- /**
- * Create a mock block that may be used as the source block for a field.
- * @returns {!Object} Mock block.
- */
- function createBlockMock() {
- return {
- id: 'test',
- rendered: false,
- workspace: {
- rendered: false,
- },
- renameVarById: Blockly.Block.prototype.renameVarById,
- updateVarName: Blockly.Block.prototype.updateVarName,
- isShadow: () => false,
- isDeadOrDying: () => false,
- };
- }
-
- suite('Empty -> New Value', function () {
- setup(function () {
- this.field = new FieldAngle();
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- defaultFieldValue,
- );
- test('With source block', function () {
- this.field.setSourceBlock(createBlockMock());
- this.field.setValue(12.5);
- assertFieldValue(this.field, 15);
- });
- });
- suite('Value -> New Value', function () {
- setup(function () {
- this.field = new FieldAngle(12.5);
- });
- runSetValueTests(validValueTestCases, invalidValueTestCases, 15);
- test('With source block', function () {
- this.field.setSourceBlock(createBlockMock());
- this.field.setValue(-15);
- assertFieldValue(this.field, 360 - 15);
- });
- });
- });
-
- suite('Validators', function () {
- setup(function () {
- this.field = new FieldAngle(15);
- });
- const testSuites = [
- {
- title: 'Null Validator',
- validator: function () {
- return null;
- },
- value: 30,
- expectedValue: 15,
- },
- {
- title: 'Force multiple of 90 Validator',
- validator: function (newValue) {
- return Math.round(newValue / 90) * 90;
- },
- value: 60,
- expectedValue: 90,
- },
- {
- title: 'Returns Undefined Validator',
- validator: function () {},
- value: 30,
- expectedValue: 30,
- },
- ];
- testSuites.forEach(function (suiteInfo) {
- suite(suiteInfo.title, function () {
- setup(function () {
- this.field.setValidator(suiteInfo.validator);
- });
- test('New Value', function () {
- this.field.setValue(suiteInfo.value);
- assertFieldValue(
- this.field,
- suiteInfo.expectedValue,
- suiteInfo.expectedText,
- );
- });
- });
- });
- });
-
- suite('Customizations', function () {
- suite('Clockwise', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- clockwise: true,
- });
- assert.isTrue(field.clockwise);
- });
- test('JSON Definition', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- clockwise: true,
- });
- assert.isTrue(field.clockwise);
- });
- });
-
- suite('Offset', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- offset: 90,
- });
- assert.equal(field.offset, 90);
- });
- test('JSON Definition', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- offset: 90,
- });
- assert.equal(field.offset, 90);
- });
- });
-
- suite('Min/Max', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- min: -180,
- max: 180,
- });
- assert.equal(field.getMin(), -180);
- assert.equal(field.getMax(), 180);
- });
- test('JSON Definition', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- min: -180,
- max: 180,
- });
- assert.equal(field.getMin(), -180);
- assert.equal(field.getMax(), 180);
- });
- });
-
- suite('Precision', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- precision: 30,
- });
- assert.equal(field.getPrecision(), 30);
- });
- test('JSON Definition', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- precision: 30,
- });
- assert.equal(field.getPrecision(), 30);
- });
- });
-
- suite('Mode', function () {
- suite('Compass', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- mode: 'compass',
- });
- assert.equal(field.offset, 90);
- assert.isTrue(field.clockwise);
- });
- test('JS Configuration', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- mode: 'compass',
- });
- assert.equal(field.offset, 90);
- assert.isTrue(field.clockwise);
- });
- });
- suite('Protractor', function () {
- test('JS Configuration', function () {
- const field = new FieldAngle(0, null, {
- mode: 'protractor',
- });
- assert.equal(field.offset, 0);
- assert.isFalse(field.clockwise);
- });
- test('JS Configuration', function () {
- const field = FieldAngle.fromJson({
- value: 0,
- mode: 'protractor',
- });
- assert.equal(field.offset, 0);
- assert.isFalse(field.clockwise);
- });
- });
- });
- });
-
- suite('Serialization', function () {
- setup(function () {
- this.workspace = new Blockly.Workspace();
- Blockly.defineBlocksWithJsonArray([
- {
- type: 'row_block',
- message0: '%1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- output: null,
- },
- ]);
-
- this.assertValue = (value) => {
- const block = this.workspace.newBlock('row_block');
- const field = new FieldAngle(value);
- block.getInput('INPUT').appendField(field, 'ANGLE');
- const jso = Blockly.serialization.blocks.save(block);
- assert.deepEqual(jso['fields'], {ANGLE: value});
- };
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Simple', function () {
- this.assertValue(90);
- });
- });
-});
diff --git a/plugins/field-angle/test/index.html b/plugins/field-angle/test/index.html
deleted file mode 100644
index c6879bd86..000000000
--- a/plugins/field-angle/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Angle Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/field-angle/test/index.ts b/plugins/field-angle/test/index.ts
deleted file mode 100644
index 643a45a4d..000000000
--- a/plugins/field-angle/test/index.ts
+++ /dev/null
@@ -1,332 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Angle field test playground.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import {registerFieldAngle} from '../src/index';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the angle field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- value: 50,
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_compass',
- message0: 'compass %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- mode: 'compass',
- value: 90,
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_protractor',
- message0: 'protractor %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- mode: 'protractor',
- value: 90,
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_round',
- message0: 'round %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- precision: 0.1,
- value: 123,
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_radians',
- message0: 'radians %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- precision: 0.1,
- clockwise: true,
- value: 0,
- min: 0,
- max: Math.PI,
- displayMin: -Math.PI,
- displayMax: Math.PI,
- minorTick: Math.PI / 8,
- majorTick: Math.PI,
- symbol: ' rad',
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_quadrant',
- message0: 'quadrant %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- precision: 1,
- value: 0,
- min: 0,
- max: 2,
- displayMin: 0,
- displayMax: 8,
- minorTick: 0,
- majorTick: 1,
- symbol: '',
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_angle',
- name: 'FIELDNAME',
- value: 50,
- alt: {
- type: 'field_label',
- text: `No field_angle`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the angle field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_compass',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_protractor',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_round',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_radians',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_quadrant',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- ],
-};
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- registerFieldAngle();
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox: jsonToolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-angle/tsconfig.json b/plugins/field-angle/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-angle/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-bitmap/CHANGELOG.md b/plugins/field-bitmap/CHANGELOG.md
deleted file mode 100644
index 0cd07ce51..000000000
--- a/plugins/field-bitmap/CHANGELOG.md
+++ /dev/null
@@ -1,699 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Features
-
-* **field-bitmap:** make the bitmap editor keyboard and screen-reader accessible ([#2754](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2754))
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-bitmap@6.0.8...@blockly/field-bitmap@6.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-bitmap@6.0.7...@blockly/field-bitmap@6.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-bitmap@6.0.6...@blockly/field-bitmap@6.0.7) (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))
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.5...@blockly/field-bitmap@6.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.4...@blockly/field-bitmap@6.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.3...@blockly/field-bitmap@6.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.2...@blockly/field-bitmap@6.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.1...@blockly/field-bitmap@6.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@6.0.0...@blockly/field-bitmap@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.17...@blockly/field-bitmap@6.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))
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.16...@blockly/field-bitmap@5.0.17) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.15...@blockly/field-bitmap@5.0.16) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.14...@blockly/field-bitmap@5.0.15) (2025-02-27)
-
-
-### Bug Fixes
-
-* [#2463](https://github.com/google/blockly-samples/issues/2463) update event handling for field-bitmap to support touch ([c105002](https://github.com/google/blockly-samples/commit/c1050025e41dd456c822301555b1b3a20577d03e))
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.13...@blockly/field-bitmap@5.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.12...@blockly/field-bitmap@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.11...@blockly/field-bitmap@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.10...@blockly/field-bitmap@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.9...@blockly/field-bitmap@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.8...@blockly/field-bitmap@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.7...@blockly/field-bitmap@5.0.8) (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))
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.6...@blockly/field-bitmap@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.5...@blockly/field-bitmap@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.4...@blockly/field-bitmap@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.3...@blockly/field-bitmap@5.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)
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.2...@blockly/field-bitmap@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.1...@blockly/field-bitmap@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@5.0.0...@blockly/field-bitmap@5.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))
-* update pixel with new values ([#2373](https://github.com/google/blockly-samples/issues/2373)) ([d387b9e](https://github.com/google/blockly-samples/commit/d387b9ebcd0b42275231815fa18f61f61eeb04e4))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.1.1...@blockly/field-bitmap@5.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))
-* 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))
-* remove some uses of generateFieldTextBlocks ([#2357](https://github.com/google/blockly-samples/issues/2357)) ([53b3fa4](https://github.com/google/blockly-samples/commit/53b3fa4604aabb1fc5240d41c8d1d389d4b15301))
-
-
-
-## [4.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.1.0...@blockly/field-bitmap@4.1.1) (2024-05-20)
-
-
-### Bug Fixes
-
-* improve bitmap field editor styles for large images and/or no buttons ([#2360](https://github.com/google/blockly-samples/issues/2360)) ([4cc25b3](https://github.com/google/blockly-samples/commit/4cc25b3a1374936fdc8eff56d14d3f9429c56504))
-
-
-
-## [4.1.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.18...@blockly/field-bitmap@4.1.0) (2024-05-16)
-
-
-### Features
-
-* Allow configuration of buttons, pixel colors, and fixed field height for Bitmap field ([#2351](https://github.com/google/blockly-samples/issues/2351)) ([432e277](https://github.com/google/blockly-samples/commit/432e277687bc0883806302164054f0a7b9ac3484))
-
-
-
-## [4.0.18](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.17...@blockly/field-bitmap@4.0.18) (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))
-
-
-
-## [4.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.16...@blockly/field-bitmap@4.0.17) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.15...@blockly/field-bitmap@4.0.16) (2024-04-18)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.14...@blockly/field-bitmap@4.0.15) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.13...@blockly/field-bitmap@4.0.14) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.12...@blockly/field-bitmap@4.0.13) (2024-02-29)
-
-
-### Bug Fixes
-
-* Fix but preventing clearing/randomizing nonsquare bitmap fields. ([#2226](https://github.com/google/blockly-samples/issues/2226)) ([c32266b](https://github.com/google/blockly-samples/commit/c32266b2b7685c0d4d6646e5bcedb085c435e0b2))
-
-
-
-## [4.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.11...@blockly/field-bitmap@4.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.10...@blockly/field-bitmap@4.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.9...@blockly/field-bitmap@4.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.8...@blockly/field-bitmap@4.0.9) (2023-11-16)
-
-
-### Bug Fixes
-
-* resolved 15 ESLint warnings ([#2065](https://github.com/google/blockly-samples/issues/2065)) ([2436337](https://github.com/google/blockly-samples/commit/243633746542bb1518fe2893c0421a5a6f79fd32))
-
-
-
-## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.7...@blockly/field-bitmap@4.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.6...@blockly/field-bitmap@4.0.7) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.5...@blockly/field-bitmap@4.0.6) (2023-10-30)
-
-
-### Bug Fixes
-
-* progress for Have field-bitmap fire intermediate change events ([#2012](https://github.com/google/blockly-samples/issues/2012)) ([7050875](https://github.com/google/blockly-samples/commit/7050875971ebb038702232c5bb642a0393592ab7))
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.4...@blockly/field-bitmap@4.0.5) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.3...@blockly/field-bitmap@4.0.4) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.2...@blockly/field-bitmap@4.0.3) (2023-07-27)
-
-
-### Bug Fixes
-
-* Use the normal, non-drag cursor when hovering over a bitmap field. ([#1810](https://github.com/google/blockly-samples/issues/1810)) ([a4f8e8d](https://github.com/google/blockly-samples/commit/a4f8e8d1c22e38fa00a27bbeaca3ef9f637cbe82))
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.1...@blockly/field-bitmap@4.0.2) (2023-07-24)
-
-
-### Bug Fixes
-
-* Fix the positioning of the dropdown div relative to the bitmap field. ([#1809](https://github.com/google/blockly-samples/issues/1809)) ([54a6ee6](https://github.com/google/blockly-samples/commit/54a6ee64ff03b6cb11e070d130a88d656aeced22))
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@4.0.0...@blockly/field-bitmap@4.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@3.0.1...@blockly/field-bitmap@4.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@3.0.0...@blockly/field-bitmap@3.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.19...@blockly/field-bitmap@3.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))
-
-
-
-## [2.0.19](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.18...@blockly/field-bitmap@2.0.19) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.18](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.17...@blockly/field-bitmap@2.0.18) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.16...@blockly/field-bitmap@2.0.17) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.15...@blockly/field-bitmap@2.0.16) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.14...@blockly/field-bitmap@2.0.15) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.13...@blockly/field-bitmap@2.0.14) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.12...@blockly/field-bitmap@2.0.13) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.11...@blockly/field-bitmap@2.0.12) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.10...@blockly/field-bitmap@2.0.11) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [2.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.9...@blockly/field-bitmap@2.0.10) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.8...@blockly/field-bitmap@2.0.9) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.7...@blockly/field-bitmap@2.0.8) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.6...@blockly/field-bitmap@2.0.7) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.5...@blockly/field-bitmap@2.0.6) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.4...@blockly/field-bitmap@2.0.5) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.3...@blockly/field-bitmap@2.0.4) (2022-12-01)
-
-
-### Bug Fixes
-
-* **field-bitmap:** Fix crash when dismissing FieldBitmap dropdown ([#1394](https://github.com/google/blockly-samples/issues/1394)) ([9a2ea9c](https://github.com/google/blockly-samples/commit/9a2ea9cfe43bd7d87b809c0b0dc8a807e958630d)), closes [#1386](https://github.com/google/blockly-samples/issues/1386)
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.2...@blockly/field-bitmap@2.0.3) (2022-11-10)
-
-
-### Bug Fixes
-
-* field-bitmap now serializing correctly ([#1361](https://github.com/google/blockly-samples/issues/1361)) ([304a875](https://github.com/google/blockly-samples/commit/304a875648bac4c7d78747a298dc8b2a1d28ba5b))
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.1...@blockly/field-bitmap@2.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@2.0.0...@blockly/field-bitmap@2.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-bitmap@1.0.7...@blockly/field-bitmap@2.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* 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))
-
-
-
-## 1.0.7 (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.0.6 (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.0.4 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/field-bitmap
-
-
-
-
-
-## 1.0.3 (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.0.2 (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.0.1 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/field-bitmap
diff --git a/plugins/field-bitmap/README.md b/plugins/field-bitmap/README.md
deleted file mode 100644
index 3b8cee4ef..000000000
--- a/plugins/field-bitmap/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# @blockly/field-bitmap [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) field that allows for user-inputted pixel grids. The image value is stored as a 2D array of 1s and 0s, and supports any size. The user can paint over pixels with their mouse, or randomize the grid.
-
-Note: this field does not support serialization to XML.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-bitmap
-```
-
-### npm
-
-```
-npm install @blockly/field-bitmap --save
-```
-
-## Usage
-
-This field accepts up to 6 parameters:
-
-- `"value"` to specify an initial value. Must be a 2D rectangular array of 1s and 0s.
- If not provided, the default is an empty grid of the specified size.
-- `"width"` to specify an initial width, if there is no initial value.
- If not provided, the default is a width of 5.
-- `"height"` to specify an initial height, if there is no initial value.
- If not provided, the default is a height of 5.
-- `fieldHeight"` to specify a static field height. If provided, the individual pixels
- will be resized to fit inside the field. This only affects the field as it is
- seen on a block and not the pop-up editor. Good for larger images. (_Note: If this
- results in fractional pixel sizes, the overall field height may not exactly match
- the specified value on all browsers._)
-- `"colours"` to override the default colours, Default values:
- `{filled: '#363d80', empty: '#fff'}`
-- `"buttons"` to show or hide the "Randomize" and/or "Clear" buttons. If either is
- omitted, the button will be shown. Default values:
- `{randomize: true, clear: true}`
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldBitmap} from 'blockly-field-bitmap';
-Blockly.Blocks["test_field_bitmap"] = {
- init: function () {
- this.appendDummyInput()
- .appendField("bitmap: ")
- .appendField(new FieldBitmap(...), "FIELDNAME");
- }
-};
-```
-
-### JSON
-
-Example with default value:
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-bitmap';
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_field_bitmap',
- message0: 'bitmap: %1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- value: [
- [0, 0, 0, 0, 0, 0, 0],
- [0, 1, 1, 0, 1, 1, 0],
- [0, 0, 0, 0, 0, 0, 0],
- [0, 1, 1, 1, 1, 1, 0],
- [0, 1, 0, 0, 0, 1, 0],
- [0, 0, 1, 1, 1, 0, 0],
- [0, 0, 0, 0, 0, 0, 0],
- ],
- },
- ],
- },
-]);
-```
-
-Example with width and height:
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-bitmap';
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_field_bitmap',
- message0: 'bitmap: %1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- width: 8,
- height: 8,
- },
- ],
- },
-]);
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-bitmap/package.json b/plugins/field-bitmap/package.json
deleted file mode 100644
index f4c37cd28..000000000
--- a/plugins/field-bitmap/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "name": "@blockly/field-bitmap",
- "version": "13.2.0",
- "description": "A field that lets users input a pixel grid with their mouse.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "module": "./src/index.js",
- "unpkg": "./dist/index.js",
- "author": "",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "blockly-field",
- "bitmap"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/field-bitmap#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "field-bitmap"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "mocha": "^11.7.6",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-bitmap/src/field-bitmap.ts b/plugins/field-bitmap/src/field-bitmap.ts
deleted file mode 100644
index a39737977..000000000
--- a/plugins/field-bitmap/src/field-bitmap.ts
+++ /dev/null
@@ -1,1006 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as Blockly from 'blockly/core';
-
-export const DEFAULT_HEIGHT = 5;
-export const DEFAULT_WIDTH = 5;
-const DEFAULT_PIXEL_SIZE = 15;
-const DEFAULT_PIXEL_COLOURS: PixelColours = {
- empty: '#fff',
- filled: '#363d80',
-};
-const DEFAULT_BUTTONS: Buttons = {
- randomize: true,
- clear: true,
-};
-
-/**
- * Field for inputting a small bitmap image.
- * Includes a grid of clickable pixels that's exported as a bitmap.
- */
-export class FieldBitmap extends Blockly.Field {
- private initialValue: number[][] | null = null;
- private imgHeight: number;
- private imgWidth: number;
- /**
- * Array holding info needed to unbind events.
- * Used for disposing.
- */
- private boundEvents: Blockly.browserEvents.Data[] = [];
- /** References to UI elements */
- private pixelGrid: HTMLDivElement | null = null;
- private editorPixels: HTMLButtonElement[][] | null = null;
- private blockDisplayPixels: SVGElement[][] | null = null;
- /** Index of the keyboard-focused pixel in row-major order, or -1. */
- private focusedPixelIndex = -1;
- /** Stateful variables */
- private pointerIsDown = false;
- private valToPaintWith?: number;
- buttonOptions: Buttons;
- pixelSize: number;
- pixelColours: {empty: string; filled: string};
- fieldHeight?: number;
-
- protected override ariaTypeName = Blockly.Msg['ARIA_TYPE_FIELD_BITMAP'];
-
- /**
- * Constructor for the bitmap field.
- *
- * @param value 2D rectangular array of 1s and 0s.
- * @param validator A function that is called to validate.
- * @param config Config A map of options used to configure the field.
- */
- constructor(
- value: number[][] | typeof Blockly.Field.SKIP_SETUP,
- validator?: Blockly.FieldValidator,
- config?: FieldBitmapFromJsonConfig,
- ) {
- super(value, validator, config);
-
- this.SERIALIZABLE = true;
- this.buttonOptions = {...DEFAULT_BUTTONS, ...config?.buttons};
- this.pixelColours = {...DEFAULT_PIXEL_COLOURS, ...config?.colours};
-
- // Configure value, height, and width
- const currentValue = this.getValue();
- if (currentValue !== null) {
- this.imgHeight = currentValue.length;
- this.imgWidth = currentValue[0].length || 0;
- } else {
- this.imgHeight = config?.height ?? DEFAULT_HEIGHT;
- this.imgWidth = config?.width ?? DEFAULT_WIDTH;
- // Set a default empty value
- this.setValue(this.getEmptyArray());
- }
- this.fieldHeight = config?.fieldHeight;
- if (this.fieldHeight) {
- this.pixelSize = this.fieldHeight / this.imgHeight;
- } else {
- this.pixelSize = DEFAULT_PIXEL_SIZE;
- }
- }
-
- /**
- * Constructs a FieldBitmap from a JSON arg object.
- *
- * @param options A JSON object with options.
- * @returns The new field instance.
- */
- static fromJson(options: FieldBitmapFromJsonConfig) {
- // `this` might be a subclass of FieldBitmap if that class doesn't override the static fromJson method.
- return new this(
- options.value ?? Blockly.Field.SKIP_SETUP,
- undefined,
- options,
- );
- }
-
- /**
- * Returns the width of the image in pixels.
- *
- * @returns The width in pixels.
- */
- getImageWidth() {
- return this.imgWidth;
- }
-
- /**
- * Returns the height of the image in pixels.
- *
- * @returns The height in pixels.
- */
- getImageHeight() {
- return this.imgHeight;
- }
-
- /**
- * Updates the ARIA roles and label for this field.
- */
- override recomputeAriaContext(): boolean {
- const shouldCustomize = super.recomputeAriaContext();
- if (!shouldCustomize) return false;
- const focusableElement = this.getFocusableElement();
- Blockly.utils.aria.setState(
- focusableElement,
- Blockly.utils.aria.State.HASPOPUP,
- 'grid',
- );
- Blockly.utils.aria.setState(
- focusableElement,
- Blockly.utils.aria.State.EXPANDED,
- !!this.pixelGrid,
- );
- return true;
- }
-
- /**
- * Validates that a new value meets the requirements for a valid bitmap array.
- *
- * @param newValue The new value to be tested.
- * @returns The new value if it's valid, or null.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue: number[][],
- ): number[][] | null | undefined;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue?: number[][],
- ): number[][] | null;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue?: number[][],
- ): number[][] | null | undefined {
- if (!newValue) {
- return null;
- }
- // Check if the new value is an array
- if (!Array.isArray(newValue)) {
- return null;
- }
- const newHeight = newValue.length;
- // The empty list is not an acceptable bitmap
- if (newHeight == 0) {
- return null;
- }
-
- // Check that the width matches the existing width of the image if it
- // already has a value.
- const newWidth = newValue[0].length;
- for (const row of newValue) {
- if (!Array.isArray(row)) {
- return null;
- }
- if (row.length !== newWidth) {
- return null;
- }
- }
-
- // Check if all contents of the arrays are either 0 or 1
- for (const row of newValue) {
- for (const cell of row) {
- if (cell !== 0 && cell !== 1) {
- return null;
- }
- }
- }
- return newValue;
- }
-
- /**
- * Called when a new value has been validated and is about to be set.
- *
- * @param newValue The value that's about to be set.
- */
- // eslint-disable-next-line
- protected override doValueUpdate_(newValue: number[][]) {
- super.doValueUpdate_(newValue);
- if (newValue) {
- this.imgHeight = newValue.length;
- this.imgWidth = newValue[0] ? newValue[0].length : 0;
- // If the field height is static, adjust the pixel size to fit.
- if (this.fieldHeight) {
- this.pixelSize = this.fieldHeight / this.imgHeight;
- } else {
- this.pixelSize = DEFAULT_PIXEL_SIZE;
- }
- }
- this.recomputeAriaContext();
- }
-
- /**
- * Show the bitmap editor dialog.
- *
- * @param e Optional mouse event that triggered the field to open, or
- * undefined if triggered programmatically.
- */
- // eslint-disable-next-line
- protected override showEditor_(e?: Event) {
- const editor = this.dropdownCreate();
- Blockly.DropDownDiv.getContentDiv().appendChild(editor);
- Blockly.DropDownDiv.showPositionedByField(
- this,
- this.dropdownDispose.bind(this),
- );
- this.focusPixelAt(0);
- this.recomputeAriaContext();
- }
-
- /**
- * Updates the block display and editor dropdown when the field re-renders.
- */
- // eslint-disable-next-line
- protected override render_() {
- super.render_();
-
- if (!this.getValue()) {
- return;
- }
-
- if (this.blockDisplayPixels) {
- const display = this.blockDisplayPixels;
- this.forAllCells((r, c) => {
- const pixel = this.getPixel(r, c);
- display[r][c].style.fill = pixel
- ? this.pixelColours.filled
- : this.pixelColours.empty;
- });
- }
- if (this.editorPixels) {
- this.forAllCells((r, c) => {
- this.updateEditorPixelDisplay(r, c, this.getPixel(r, c));
- });
- }
- }
-
- override getAriaValue(): string | null {
- // Get a label for the bitmap's dimensions and the number of pixels that are on.
- const value = this.getValue();
- if (!value) {
- return null;
- }
- const height = value.length;
- const width = value[0].length;
- let onCount = 0;
- for (const row of value) {
- for (const cell of row) {
- if (cell === 1) {
- onCount++;
- }
- }
- }
-
- return (Blockly.Msg['FIELD_BITMAP_ARIA_VALUE'] ?? '%1 by %2, %3 pixels on')
- .replace('%1', String(width))
- .replace('%2', String(height))
- .replace('%3', String(onCount));
- }
-
- /**
- * Determines whether the field is editable.
- *
- * @returns True since it is always editable.
- */
- override updateEditable() {
- const editable = super.updateEditable();
- // Blockly.Field's implementation sets these classes as appropriate, but
- // since this field has no text they just mess up the rendering of the grid
- // lines.
- const svgRoot = this.getSvgRoot();
- if (svgRoot) {
- Blockly.utils.dom.removeClass(svgRoot, 'blocklyNonEditableField');
- Blockly.utils.dom.removeClass(svgRoot, 'blocklyEditableField');
- }
- return editable;
- }
-
- /**
- * Gets the rectangle built out of dimensions matching SVG's element.
- *
- * @returns The newly created rectangle of same size as the SVG element.
- */
- override getScaledBBox() {
- const boundingBox = this.getSvgRoot()?.getBoundingClientRect();
- if (!boundingBox) {
- throw new Error('Tried to retrieve a bounding box without a rect');
- }
- return new Blockly.utils.Rect(
- boundingBox.top,
- boundingBox.bottom,
- boundingBox.left,
- boundingBox.right,
- );
- }
-
- /**
- * Creates the bitmap editor and add event listeners.
- *
- * @returns The newly created dropdown menu.
- */
- private dropdownCreate() {
- const dropdownEditor = this.createElementWithClassname(
- 'div',
- 'dropdownEditor',
- );
- if (this.buttonOptions.randomize || this.buttonOptions.clear) {
- dropdownEditor.classList.add('has-buttons');
- }
-
- // This prevents the normal max-height from adding a scroll bar for large images.
- Blockly.DropDownDiv.getContentDiv().classList.add('contains-bitmap-editor');
-
- this.bindEvent(dropdownEditor, 'pointermove', this.onPointerMove);
- this.bindEvent(dropdownEditor, 'pointerup', this.onPointerEnd);
- this.bindEvent(dropdownEditor, 'pointerleave', this.onPointerEnd);
- this.bindEvent(dropdownEditor, 'pointerdown', this.onPointerStart);
- this.bindEvent(dropdownEditor, 'pointercancel', this.onPointerEnd);
- // Stop the browser from handling touch events and cancelling the event.
- this.bindEvent(dropdownEditor, 'touchmove', (e: Event) => {
- e.preventDefault();
- });
-
- const rtl = !!this.getSourceBlock()?.workspace.RTL;
- this.pixelGrid = this.createPixelGrid(rtl);
- dropdownEditor.appendChild(this.pixelGrid);
-
- // Add control buttons below the pixel grid
- if (this.buttonOptions.randomize) {
- this.addControlButton(
- dropdownEditor,
- // For backwards compatibility, use the old message if it exists, otherwise use the new message.
- Blockly.Msg['BUTTON_LABEL_RANDOMIZE'] ??
- Blockly.Msg['FIELD_BITMAP_BUTTON_LABEL_RANDOMIZE'],
- this.randomizePixels,
- );
- }
- if (this.buttonOptions.clear) {
- this.addControlButton(
- dropdownEditor,
- // For backwards compatibility, use the old message if it exists, otherwise use the new message.
- Blockly.Msg['BUTTON_LABEL_CLEAR'] ??
- Blockly.Msg['FIELD_BITMAP_BUTTON_LABEL_CLEAR'],
- this.clearPixels,
- );
- }
-
- // Store the initial value at the start of the edit.
- this.initialValue = this.getValue();
-
- return dropdownEditor;
- }
-
- /**
- * Builds the accessible pixel grid DOM.
- *
- * @param rtl Whether the workspace is RTL.
- * @returns The grid root element.
- */
- private createPixelGrid(rtl: boolean): HTMLDivElement {
- const grid = document.createElement('div');
- grid.className = 'bitmapPixelGrid';
- grid.tabIndex = 0;
- Blockly.utils.aria.setRole(grid, Blockly.utils.aria.Role.GRID);
- grid.style.setProperty('--bitmap-columns', `${this.imgWidth}`);
-
- this.boundEvents.push(
- Blockly.browserEvents.bind(grid, 'keydown', this, (e: KeyboardEvent) => {
- this.onPixelGridKeyDown(e, rtl);
- }),
- );
-
- this.editorPixels = [];
- for (let r = 0; r < this.imgHeight; r++) {
- const row = document.createElement('div');
- row.className = 'bitmapPixelRow';
- Blockly.utils.aria.setRole(row, Blockly.utils.aria.Role.ROW);
- grid.appendChild(row);
-
- this.editorPixels.push([]);
- for (let c = 0; c < this.imgWidth; c++) {
- const cell = document.createElement('div');
- Blockly.utils.aria.setRole(cell, Blockly.utils.aria.Role.GRIDCELL);
-
- const button = document.createElement('button');
- button.type = 'button';
- button.id = Blockly.utils.idGenerator.getNextUniqueId();
- button.className = 'pixelButton';
- button.setAttribute('data-row', r.toString());
- button.setAttribute('data-col', c.toString());
- // Keyboard activation is handled on the grid; avoid a second toggle
- // from the native button click after pointer paint.
- button.addEventListener('click', (e) => e.preventDefault());
-
- cell.appendChild(button);
- row.appendChild(cell);
- this.editorPixels[r].push(button);
- this.updateEditorPixelDisplay(r, c, this.getPixel(r, c));
- }
- }
- return grid;
- }
-
- /**
- * Handles keyboard navigation and activation inside the pixel grid.
- *
- * @param e The keydown event.
- * @param rtl Whether the workspace is RTL.
- */
- private onPixelGridKeyDown(e: KeyboardEvent, rtl: boolean) {
- if (
- !this.editorPixels ||
- e.shiftKey ||
- e.ctrlKey ||
- e.metaKey ||
- e.altKey
- ) {
- return;
- }
-
- const length = this.imgWidth * this.imgHeight;
- if (!length) return;
-
- if (this.focusedPixelIndex < 0) {
- this.focusedPixelIndex = 0;
- }
-
- switch (e.key) {
- case 'ArrowUp':
- case 'ArrowDown':
- case 'ArrowLeft':
- case 'ArrowRight': {
- const next = this.getNextPixelIndex(this.focusedPixelIndex, e.key, rtl);
- if (next === null) {
- (this.getSourceBlock()?.workspace as Blockly.WorkspaceSvg | null)
- ?.getAudioManager()
- .playErrorBeep();
- e.preventDefault();
- e.stopPropagation();
- return;
- }
- this.focusPixelAt(next);
- break;
- }
- case 'PageUp':
- case 'Home':
- this.focusPixelAt(0);
- break;
- case 'PageDown':
- case 'End':
- this.focusPixelAt(length - 1);
- break;
- case 'Enter':
- case ' ':
- case 'Space': {
- const [r, c] = this.indexToCoords(this.focusedPixelIndex);
- this.togglePixel(r, c);
- e.preventDefault();
- e.stopPropagation();
- return;
- }
- default:
- return;
- }
- e.preventDefault();
- e.stopPropagation();
- }
-
- /**
- * Returns the next pixel index for an arrow key, or null at hard edges.
- *
- * @param current Current focused index.
- * @param key Arrow key.
- * @param rtl Whether the workspace is RTL.
- * @returns Next index, or null if navigation should no-op.
- */
- private getNextPixelIndex(
- current: number,
- key: string,
- rtl: boolean,
- ): number | null {
- const col = current % this.imgWidth;
- const row = Math.floor(current / this.imgWidth);
- const length = this.imgWidth * this.imgHeight;
-
- let effectiveKey = key;
- if (rtl) {
- if (key === 'ArrowLeft') effectiveKey = 'ArrowRight';
- else if (key === 'ArrowRight') effectiveKey = 'ArrowLeft';
- }
-
- switch (effectiveKey) {
- case 'ArrowLeft':
- return col > 0 ? current - 1 : null;
- case 'ArrowRight':
- return col < this.imgWidth - 1 && current + 1 < length
- ? current + 1
- : null;
- case 'ArrowUp':
- return row > 0 ? current - this.imgWidth : null;
- case 'ArrowDown':
- return current + this.imgWidth < length
- ? current + this.imgWidth
- : null;
- default:
- return null;
- }
- }
-
- /**
- * Focuses the pixel button at the given row-major index.
- *
- * @param index Pixel index.
- */
- private focusPixelAt(index: number) {
- if (!this.editorPixels || !this.pixelGrid) return;
- const length = this.imgWidth * this.imgHeight;
- if (index < 0 || index >= length) return;
-
- this.focusedPixelIndex = index;
- const [r, c] = this.indexToCoords(index);
- const button = this.editorPixels[r][c];
- button.focus({preventScroll: true});
- Blockly.utils.aria.setState(
- this.pixelGrid,
- Blockly.utils.aria.State.ACTIVEDESCENDANT,
- button.id,
- );
- }
-
- /**
- * Converts a pixel index to coordinates.
- *
- * @param index Pixel index.
- * @returns Row and column.
- */
- private indexToCoords(index: number): [number, number] {
- return [Math.floor(index / this.imgWidth), index % this.imgWidth];
- }
-
- /**
- * Builds an accessible label for a pixel cell.
- *
- * @param r Row index (0-based).
- * @param c Column index (0-based).
- * @param pixelValue Pixel value (0 or 1).
- * @returns Localized aria label.
- */
- private getPixelAriaLabel(r: number, c: number, pixelValue: number): string {
- const state = pixelValue
- ? (Blockly.Msg['FIELD_BITMAP_PIXEL_ON'] ?? 'on')
- : (Blockly.Msg['FIELD_BITMAP_PIXEL_OFF'] ?? 'off');
- return (Blockly.Msg['FIELD_BITMAP_PIXEL_LABEL'] ?? '%1, row %2, column %3')
- .replace('%1', state)
- .replace('%2', String(r + 1))
- .replace('%3', String(c + 1));
- }
-
- /**
- * Toggles a pixel and updates the editor presentation.
- *
- * @param r Row index.
- * @param c Column index.
- * @returns The new pixel value.
- */
- private togglePixel(r: number, c: number): number {
- const newPixelValue = 1 - this.getPixel(r, c);
- this.setPixel(r, c, newPixelValue);
- return newPixelValue;
- }
-
- /**
- * Syncs one editor pixel's colour, pressed state, and aria label.
- *
- * @param r Row index.
- * @param c Column index.
- * @param pixelValue Pixel value (0 or 1).
- */
- private updateEditorPixelDisplay(r: number, c: number, pixelValue: number) {
- const button = this.editorPixels?.[r]?.[c];
- if (!button) return;
- button.style.background = pixelValue
- ? this.pixelColours.filled
- : this.pixelColours.empty;
- button.setAttribute('aria-pressed', String(!!pixelValue));
- Blockly.utils.aria.setState(
- button,
- Blockly.utils.aria.State.LABEL,
- this.getPixelAriaLabel(r, c, pixelValue),
- );
- }
-
- /**
- * Initializes the on-block display.
- */
- override initView() {
- this.createBorderRect_();
- // Invisible fill so the rect only provides keyboard-nav focus stroke.
- this.getBorderRect().style.fill = 'none';
- // Don't intercept clicks meant for the pixel rects beneath.
- this.getBorderRect().style.pointerEvents = 'none';
- if (this.fieldGroup_) {
- Blockly.utils.dom.addClass(this.fieldGroup_, 'blocklyField');
- }
- this.blockDisplayPixels = [];
- for (let r = 0; r < this.imgHeight; r++) {
- const row = [];
- for (let c = 0; c < this.imgWidth; c++) {
- const square = Blockly.utils.dom.createSvgElement(
- 'rect',
- {
- x: c * this.pixelSize,
- y: r * this.pixelSize,
- width: this.pixelSize,
- height: this.pixelSize,
- fill: this.pixelColours.empty,
- fill_opacity: 1, // eslint-disable-line
- },
- this.getSvgRoot(),
- );
- row.push(square);
- }
- this.blockDisplayPixels.push(row);
- }
- // SVG strokes are centered on the path; paint the border above the
- // pixels so the inner half of the focus ring isn't covered.
- this.getSvgRoot()?.appendChild(this.getBorderRect());
- this.recomputeAriaContext();
- }
-
- /**
- * Updates the size of the block based on the size of the underlying image.
- */
- // eslint-disable-next-line
- protected override updateSize_() {
- {
- const newWidth = this.pixelSize * this.imgWidth;
- const newHeight = this.pixelSize * this.imgHeight;
- if (this.borderRect_) {
- this.borderRect_.setAttribute('width', String(newWidth));
- this.borderRect_.setAttribute('height', String(newHeight));
- }
-
- this.size_.width = newWidth;
- this.size_.height = newHeight;
- }
- }
-
- /**
- * Create control button.
- *
- * @param parent Parent HTML element to which control button will be added.
- * @param buttonText Text of the control button.
- * @param onClick Callback that will be attached to the control button.
- */
- private addControlButton(
- parent: HTMLElement,
- buttonText: string,
- onClick: () => void,
- ) {
- const button = this.createElementWithClassname('button', 'controlButton');
- button.innerText = buttonText;
- parent.appendChild(button);
- this.bindEvent(button, 'click', onClick);
- }
-
- /**
- * Disposes of events belonging to the bitmap editor.
- */
- private dropdownDispose() {
- if (
- this.getSourceBlock() &&
- this.initialValue !== null &&
- this.initialValue !== this.getValue()
- ) {
- Blockly.Events.fire(
- new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(
- this.sourceBlock_,
- 'field',
- this.name || null,
- this.initialValue,
- this.getValue(),
- ),
- );
- }
-
- for (const event of this.boundEvents) {
- Blockly.browserEvents.unbind(event);
- }
- this.boundEvents.length = 0;
- // Keep aria-expanded accurate on later recomputes.
- this.pixelGrid = null;
- this.editorPixels = null;
- this.focusedPixelIndex = -1;
- this.pointerIsDown = false;
- this.valToPaintWith = undefined;
- this.initialValue = null;
-
- Blockly.DropDownDiv.getContentDiv().classList.remove(
- 'contains-bitmap-editor',
- );
- this.recomputeAriaContext();
- }
-
- /**
- * Constructs an array of zeros with the specified width and height.
- *
- * @returns The new value.
- */
- private getEmptyArray(): number[][] {
- const newVal: number[][] = [];
- for (let r = 0; r < this.imgHeight; r++) {
- newVal.push([]);
- for (let c = 0; c < this.imgWidth; c++) {
- newVal[r].push(0);
- }
- }
- return newVal;
- }
-
- /**
- * Toggles the pixel under the pointer and starts a drag-paint gesture.
- *
- * @param e The down event.
- */
- private onPointerStart(e: PointerEvent) {
- if (e.button !== 0) return;
- const pixelCoords = this.getPixelCoordsFromElement(e.target as Element);
- if (pixelCoords) {
- const newPixelValue = this.togglePixel(pixelCoords.r, pixelCoords.c);
- this.pointerIsDown = true;
- this.valToPaintWith = newPixelValue;
- this.focusPixelAt(pixelCoords.r * this.imgWidth + pixelCoords.c);
- // Keep receiving move/up outside the editor so drag-paint can continue
- // (and pointerleave does not end the gesture).
- (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);
- e.preventDefault();
- }
- }
-
- /**
- * Moves focus (and paints when dragging) as the pointer moves over pixels.
- *
- * @param e The move event.
- */
- private onPointerMove(e: PointerEvent) {
- // Same guard as field-grid-dropdown: ignore moves with no pointer delta
- // (e.g. content scrolled under a still pointer).
- if (!(e.movementX || e.movementY)) {
- return;
- }
- const currentElement = document.elementFromPoint(e.clientX, e.clientY);
- const pixelCoords = this.getPixelCoordsFromElement(currentElement);
- if (pixelCoords) {
- this.focusPixelAt(pixelCoords.r * this.imgWidth + pixelCoords.c);
- if (this.pointerIsDown) {
- this.updatePixelValue(pixelCoords.r, pixelCoords.c);
- }
- }
- if (this.pointerIsDown) {
- e.preventDefault();
- }
- }
-
- /**
- * Reads row/column indices from a pixel button or a descendant.
- *
- * @param element Element under the pointer.
- * @returns Row and column, or null if not a pixel.
- */
- private getPixelCoordsFromElement(
- element: Element | null,
- ): {r: number; c: number} | null {
- const pixelButton = element?.closest('.pixelButton');
- const rowIndex = pixelButton?.getAttribute('data-row');
- const colIndex = pixelButton?.getAttribute('data-col');
- if (rowIndex == null || colIndex == null) {
- return null;
- }
- return {r: parseInt(rowIndex), c: parseInt(colIndex)};
- }
-
- /**
- * Sets the specified pixel in the editor to the current value being painted.
- *
- * @param r Row number of grid.
- * @param c Column number of grid.
- */
- private updatePixelValue(r: number, c: number) {
- if (
- this.valToPaintWith !== undefined &&
- this.getPixel(r, c) !== this.valToPaintWith
- ) {
- this.setPixel(r, c, this.valToPaintWith);
- }
- }
-
- /**
- * Resets pointer state (e.g. After either a pointerup event or if the
- * gesture is canceled).
- *
- * @param e The pointer event that ended the gesture, when available.
- */
- private onPointerEnd(e?: PointerEvent) {
- if (
- e &&
- e.currentTarget instanceof HTMLElement &&
- e.currentTarget.hasPointerCapture?.(e.pointerId)
- ) {
- e.currentTarget.releasePointerCapture(e.pointerId);
- }
- this.pointerIsDown = false;
- this.valToPaintWith = undefined;
- }
-
- /**
- * Sets all the pixels in the image to a random value.
- */
- private randomizePixels() {
- const getRandBinary = () => Math.floor(Math.random() * 2);
- this.forAllCells((r, c) => {
- this.setPixel(r, c, getRandBinary());
- });
- }
-
- /**
- * Sets all the pixels to 0.
- */
- private clearPixels() {
- const cleared = this.getEmptyArray();
- this.fireIntermediateChangeEvent(cleared);
- this.setValue(cleared, false);
- this.forAllCells((r, c) => {
- this.updateEditorPixelDisplay(r, c, 0);
- });
- }
-
- /**
- * Sets the value of a particular pixel.
- *
- * @param r Row number of grid.
- * @param c Column number of grid.
- * @param newValue Value of the pixel.
- */
- private setPixel(r: number, c: number, newValue: number) {
- const newGrid = JSON.parse(JSON.stringify(this.getValue()));
- newGrid[r][c] = newValue;
- this.fireIntermediateChangeEvent(newGrid);
- this.setValue(newGrid, false);
- this.updateEditorPixelDisplay(r, c, newValue);
- }
-
- private getPixel(row: number, column: number): number {
- const value = this.getValue();
- if (!value) {
- throw new Error(
- 'Attempted to retrieve a pixel value when no value is set',
- );
- }
-
- return value[row][column];
- }
-
- /**
- * Calls a given function for all cells in the image, with the cell
- * coordinates as the arguments.
- *
- * @param func A function to be applied.
- */
- private forAllCells(func: (row: number, col: number) => void) {
- for (let r = 0; r < this.imgHeight; r++) {
- for (let c = 0; c < this.imgWidth; c++) {
- func(r, c);
- }
- }
- }
-
- /**
- * Creates a new element with the specified type and class.
- *
- * @param elementType Type of html element.
- * @param className ClassName of html element.
- * @returns The created element.
- */
- private createElementWithClassname(elementType: string, className: string) {
- const newElt = document.createElement(elementType);
- newElt.className = className;
- return newElt;
- }
-
- /**
- * Binds an event listener to the specified element.
- *
- * @param element Specified element.
- * @param eventName Name of the event to bind.
- * @param callback Function to be called on specified event.
- */
- private bindEvent(
- element: HTMLElement,
- eventName: string,
- callback: (e: PointerEvent) => void,
- ) {
- this.boundEvents.push(
- Blockly.browserEvents.bind(element, eventName, this, callback),
- );
- }
-
- private fireIntermediateChangeEvent(newValue: number[][]) {
- if (this.getSourceBlock()) {
- Blockly.Events.fire(
- new (Blockly.Events.get(
- Blockly.Events.BLOCK_FIELD_INTERMEDIATE_CHANGE,
- ))(this.getSourceBlock(), this.name || null, this.getValue(), newValue),
- );
- }
- }
-}
-
-interface Buttons {
- readonly randomize: boolean;
- readonly clear: boolean;
-}
-interface PixelColours {
- readonly empty: string;
- readonly filled: string;
-}
-
-export interface FieldBitmapFromJsonConfig extends Blockly.FieldConfig {
- value?: number[][];
- width?: number;
- height?: number;
- buttons?: Buttons;
- fieldHeight?: number;
- colours?: PixelColours;
-}
-
-Blockly.fieldRegistry.register('field_bitmap', FieldBitmap);
-
-/**
- * CSS for bitmap field.
- */
-Blockly.Css.register(`
-.dropdownEditor {
- align-items: center;
- flex-direction: column;
- display: flex;
- justify-content: center;
-}
-.dropdownEditor.has-buttons {
- margin-bottom: 20px;
-}
-.bitmapPixelGrid {
- display: grid;
- margin: 20px;
- grid-template-columns: repeat(var(--bitmap-columns), min-content);
-}
-.bitmapPixelRow {
- display: contents;
-}
-.bitmapPixelGrid [role="gridcell"] {
- padding: 0;
- margin: 0;
- line-height: 0;
-}
-.pixelButton {
- width: ${DEFAULT_PIXEL_SIZE}px;
- height: ${DEFAULT_PIXEL_SIZE}px;
- border: 1px solid #000;
- cursor: pointer;
-}
-.pixelButton:focus {
- outline: var(--blockly-selection-width) solid var(--blockly-active-node-color);
- outline-offset: -2px;
- box-shadow: none;
- position: relative;
- z-index: 1;
-}
-.controlButton {
- margin: 5px 0;
-}
-.blocklyDropDownContent.contains-bitmap-editor {
- max-height: none;
-}
-`);
diff --git a/plugins/field-bitmap/src/index.ts b/plugins/field-bitmap/src/index.ts
deleted file mode 100644
index 1e196ea9b..000000000
--- a/plugins/field-bitmap/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field-bitmap';
diff --git a/plugins/field-bitmap/test/field_test.mocha.js b/plugins/field-bitmap/test/field_test.mocha.js
deleted file mode 100644
index d809bb21b..000000000
--- a/plugins/field-bitmap/test/field_test.mocha.js
+++ /dev/null
@@ -1,215 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {assert} = require('chai');
-const {FieldBitmap, DEFAULT_HEIGHT, DEFAULT_WIDTH} = require('../src/index');
-
-/**
- * Helper method to reformat raw test cases to a format that the
- * various tests can use.
- * @param {!Array} testCases raw testcases that
- * need to be reformatted
- * @returns {!Array} the reformatted test cases
- * that can be used by various tests
- */
-function processTestCases(testCases) {
- return testCases.map((x) => ({
- title: x.title,
- value: x.value,
- args: [x.value, null, {}],
- json: {value: x.value},
- }));
-}
-
-const {
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
-} = testHelpers;
-
-suite('FieldBitmap', function () {
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = processTestCases([
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- {title: 'NaN', value: NaN},
- {title: 'Non-Parsable String', value: 'bad'},
- {title: 'Not an array', value: 1},
- {title: 'Not a 2D array', value: [0, 1, 0, 1]},
- {
- title: 'Not a rectangle',
- value: [
- [1, 1, 1],
- [1, 1, 1, 1, 1, 1],
- [1, 1, 1],
- ],
- },
- {
- title: 'Contains non-binary number',
- value: [
- [1, 99, 1],
- [1, 1, 1],
- [1, 1, 1],
- ],
- },
- {
- title: 'Contains bad value',
- value: [
- [1, 'b', 1],
- [1, 1, 1],
- [1, 1, 1],
- ],
- },
- ]);
-
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = processTestCases([
- {
- title: '3x3 solid',
- value: [
- [1, 1, 1],
- [1, 1, 1],
- [1, 1, 1],
- ],
- },
- {
- title: '4x4 solid',
- value: [
- [1, 1, 1, 1],
- [1, 1, 1, 1],
- [1, 1, 1, 1],
- [1, 1, 1, 1],
- ],
- },
- {
- title: '3x3 checkerboard',
- value: [
- [1, 0, 1],
- [0, 1, 0],
- [1, 0, 1],
- ],
- },
- {
- title: '4x4 empty',
- value: [
- [0, 0, 0, 0],
- [0, 0, 0, 0],
- [0, 0, 0, 0],
- [0, 0, 0, 0],
- ],
- },
- ]);
-
- /**
- * The expected default value for the field being tested.
- * @type {*}
- */
- const defaultFieldValue = [
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0],
- ];
- /**
- * Asserts that the field property values are set to default.
- * @param {FieldBitmap} field The field to check.
- */
- const assertFieldDefault = function (field) {
- assert.deepEqual(field.getValue(), defaultFieldValue);
- };
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldBitmap} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- const expectedValue = testCase.value;
- assert.deepEqual(field.getValue(), expectedValue);
- assert.equal(field.getImageHeight(), expectedValue.length);
- assert.equal(field.getImageWidth(), expectedValue[0].length);
- };
-
- /**
- * Reimplementation of the function from TestHelpers that supports array
- * equality testing.
- * @param {*} validValueTestCases test cases for valid field values
- * @param {*} invalidValueTestCases test cases for invalid field values
- */
- function runSetValueTests(validValueTestCases, invalidValueTestCases) {
- const createFieldForTestCase = (testCase) =>
- FieldBitmap.fromJson(`{
- width: ${
- Array.isArray(testCase.value) ? testCase.value.length : DEFAULT_WIDTH
- },
- height:${
- testCase.value && Array.isArray(testCase.value[0])
- ? testCase.value[0].length
- : DEFAULT_HEIGHT
- },
- }`);
-
- /**
- * Creates test callback for invalid setValue test.
- * @param {!FieldValueTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createInvalidSetValueTestCallback = (testCase) => {
- return function () {
- const field = createFieldForTestCase(testCase);
- field.setValue(testCase.value);
- assertFieldDefault(field);
- };
- };
- /**
- * Creates test callback for valid setValue test.
- * @param {!FieldValueTestCase} testCase The test case information.
- * @returns {!Function} The test callback.
- */
- const createValidSetValueTestCallback = (testCase) => {
- return function () {
- const field = createFieldForTestCase(testCase);
- field.setValue(testCase.value);
- validTestCaseAssertField(field, testCase);
- };
- };
-
- testHelpers.runTestCases(
- invalidValueTestCases,
- createInvalidSetValueTestCallback,
- );
- testHelpers.runTestCases(
- validValueTestCases,
- createValidSetValueTestCallback,
- );
- }
-
- runConstructorSuiteTests(
- FieldBitmap,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldBitmap,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runSetValueTests(validValueTestCases, invalidValueTestCases);
-});
diff --git a/plugins/field-bitmap/test/index.html b/plugins/field-bitmap/test/index.html
deleted file mode 100644
index 10cd0a0c1..000000000
--- a/plugins/field-bitmap/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Test
-
-
-
-
-
-
-
-
diff --git a/plugins/field-bitmap/test/index.js b/plugins/field-bitmap/test/index.js
deleted file mode 100644
index 8eef0a91a..000000000
--- a/plugins/field-bitmap/test/index.js
+++ /dev/null
@@ -1,336 +0,0 @@
-/**
- * @license
- * Copyright 2021 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Field test.
- */
-
-import '../src/field-bitmap';
-
-import {createPlayground} from '@blockly/dev-tools';
-import * as Blockly from 'blockly';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the bitmap field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_bitmap`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- value: [
- [1, 0, 1],
- [0, 1, 0],
- [0, 0, 0],
- ],
- width: 3,
- height: 3,
- alt: {
- type: 'field_label',
- text: `No field_bitmap`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_bitmap`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- value: [
- [1, 0, 1],
- [0, 1, 0],
- [0, 0, 0],
- ],
- width: 3,
- height: 3,
- alt: {
- type: 'field_label',
- text: `No field_bitmap`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_colours_no_buttons',
- message0: '%1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- value: [
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
- [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ],
- fieldHeight: 50,
- buttons: {
- randomize: false,
- clear: false,
- },
- colours: {
- filled: '#4888f4',
- empty: '#cad2dc',
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_colours_no_buttons_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_bitmap',
- name: 'FIELDNAME',
- value: [
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],
- [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
- [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ],
- fieldHeight: 50,
- buttons: {
- randomize: false,
- clear: false,
- },
- colours: {
- filled: '#4888f4',
- empty: '#cad2dc',
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the bitmap field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: Static field height, custom colours, no buttons',
- },
- {
- kind: 'block',
- type: 'test_custom_colours_no_buttons',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_colours_no_buttons',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_colours_no_buttons_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_colours_no_buttons_and_label',
- },
- },
- },
- },
- ],
-};
-
-/**
- * Create a workspace.
- * @param {HTMLElement} blocklyDiv The blockly container div.
- * @param {!Blockly.BlocklyOptions} options The Blockly options.
- * @returns {!Blockly.WorkspaceSvg} The created workspace.
- */
-function createWorkspace(blocklyDiv, options) {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions = {
- toolbox: jsonToolbox,
- };
- createPlayground(
- document.getElementById('root'),
- createWorkspace,
- defaultOptions,
- );
-});
diff --git a/plugins/field-bitmap/tsconfig.json b/plugins/field-bitmap/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-bitmap/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-colour-hsv-sliders/CHANGELOG.md b/plugins/field-colour-hsv-sliders/CHANGELOG.md
deleted file mode 100644
index 4786911b3..000000000
--- a/plugins/field-colour-hsv-sliders/CHANGELOG.md
+++ /dev/null
@@ -1,680 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Bug Fixes
-
-* Improve accessibility of colour slider plugin ([#2745](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2745))
-
-
-## [6.0.12](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.11...@blockly/field-colour-hsv-sliders@6.0.12) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.11](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.10...@blockly/field-colour-hsv-sliders@6.0.11) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.9...@blockly/field-colour-hsv-sliders@6.0.10) (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))
-
-
-
-## [6.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.8...@blockly/field-colour-hsv-sliders@6.0.9) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.7...@blockly/field-colour-hsv-sliders@6.0.8) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.6...@blockly/field-colour-hsv-sliders@6.0.7) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.5...@blockly/field-colour-hsv-sliders@6.0.6) (2025-10-30)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.4...@blockly/field-colour-hsv-sliders@6.0.5) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.3...@blockly/field-colour-hsv-sliders@6.0.4) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.2...@blockly/field-colour-hsv-sliders@6.0.3) (2025-07-03)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.1...@blockly/field-colour-hsv-sliders@6.0.2) (2025-06-19)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@6.0.0...@blockly/field-colour-hsv-sliders@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.19...@blockly/field-colour-hsv-sliders@6.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))
-
-
-
-## [5.0.19](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.18...@blockly/field-colour-hsv-sliders@5.0.19) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.18](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.17...@blockly/field-colour-hsv-sliders@5.0.18) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.16...@blockly/field-colour-hsv-sliders@5.0.17) (2025-05-08)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.15...@blockly/field-colour-hsv-sliders@5.0.16) (2025-03-27)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.14...@blockly/field-colour-hsv-sliders@5.0.15) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.13...@blockly/field-colour-hsv-sliders@5.0.14) (2025-01-23)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.12...@blockly/field-colour-hsv-sliders@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.11...@blockly/field-colour-hsv-sliders@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.10...@blockly/field-colour-hsv-sliders@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.9...@blockly/field-colour-hsv-sliders@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.8...@blockly/field-colour-hsv-sliders@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.7...@blockly/field-colour-hsv-sliders@5.0.8) (2024-08-22)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.6...@blockly/field-colour-hsv-sliders@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.5...@blockly/field-colour-hsv-sliders@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.4...@blockly/field-colour-hsv-sliders@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.3...@blockly/field-colour-hsv-sliders@5.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.2...@blockly/field-colour-hsv-sliders@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.1...@blockly/field-colour-hsv-sliders@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@5.0.0...@blockly/field-colour-hsv-sliders@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.7...@blockly/field-colour-hsv-sliders@5.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))
-* 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))
-* remove some uses of generateFieldTextBlocks ([#2357](https://github.com/google/blockly-samples/issues/2357)) ([53b3fa4](https://github.com/google/blockly-samples/commit/53b3fa4604aabb1fc5240d41c8d1d389d4b15301))
-
-
-
-## [4.2.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.6...@blockly/field-colour-hsv-sliders@4.2.7) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.5...@blockly/field-colour-hsv-sliders@4.2.6) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.4...@blockly/field-colour-hsv-sliders@4.2.5) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.3...@blockly/field-colour-hsv-sliders@4.2.4) (2024-04-11)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.2...@blockly/field-colour-hsv-sliders@4.2.3) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.1...@blockly/field-colour-hsv-sliders@4.2.2) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.2.0...@blockly/field-colour-hsv-sliders@4.2.1) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.2.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.9...@blockly/field-colour-hsv-sliders@4.2.0) (2024-02-01)
-
-
-### Features
-
-* Use intermediate change events for HSV sliders. ([#2173](https://github.com/google/blockly-samples/issues/2173)) ([ed56b79](https://github.com/google/blockly-samples/commit/ed56b79be5507790572000f028a49d7bf317896d))
-
-
-
-## [4.1.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.8...@blockly/field-colour-hsv-sliders@4.1.9) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.7...@blockly/field-colour-hsv-sliders@4.1.8) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.6...@blockly/field-colour-hsv-sliders@4.1.7) (2023-11-09)
-
-
-### Bug Fixes
-
-* add types for filed-colour-hsv-sliders ([#2063](https://github.com/google/blockly-samples/issues/2063)) ([e630704](https://github.com/google/blockly-samples/commit/e6307043f812624e00207084815554c5cebe4dc9))
-
-
-
-## [4.1.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.5...@blockly/field-colour-hsv-sliders@4.1.6) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.4...@blockly/field-colour-hsv-sliders@4.1.5) (2023-10-30)
-
-
-### Bug Fixes
-
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [4.1.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.3...@blockly/field-colour-hsv-sliders@4.1.4) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.2...@blockly/field-colour-hsv-sliders@4.1.3) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.1...@blockly/field-colour-hsv-sliders@4.1.2) (2023-08-31)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.1.0...@blockly/field-colour-hsv-sliders@4.1.1) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.1.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.0.2...@blockly/field-colour-hsv-sliders@4.1.0) (2023-08-03)
-
-
-### Features
-
-* Update the field-colour-hsv-sliders package to use the field-colour package. ([#1830](https://github.com/google/blockly-samples/issues/1830)) ([e756bf4](https://github.com/google/blockly-samples/commit/e756bf488c5cf094e6fd236b70482b6bc23cae4f))
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.0.1...@blockly/field-colour-hsv-sliders@4.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@4.0.0...@blockly/field-colour-hsv-sliders@4.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@3.0.1...@blockly/field-colour-hsv-sliders@4.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@3.0.0...@blockly/field-colour-hsv-sliders@3.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.5...@blockly/field-colour-hsv-sliders@3.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))
-
-
-### Bug Fixes
-
-* renaming build problems ([7087469](https://github.com/google/blockly-samples/commit/7087469ccdaf27e040cd67a386c9284aa6b1cd67))
-* update all usages of generators in script tags for blockly v10 ([#1734](https://github.com/google/blockly-samples/issues/1734)) ([19faf29](https://github.com/google/blockly-samples/commit/19faf29428e3903a60da7c2679818cf8c63b7309))
-
-
-
-## [2.1.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.4...@blockly/field-colour-hsv-sliders@2.1.5) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.1.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.3...@blockly/field-colour-hsv-sliders@2.1.4) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.1.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.2...@blockly/field-colour-hsv-sliders@2.1.3) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.1.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.1...@blockly/field-colour-hsv-sliders@2.1.2) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.1.0...@blockly/field-colour-hsv-sliders@2.1.1) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.1.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.12...@blockly/field-colour-hsv-sliders@2.1.0) (2023-03-23)
-
-
-### Features
-
-* Create plugin for dependent dropdown fields. ([#1555](https://github.com/google/blockly-samples/issues/1555)) ([1c473d6](https://github.com/google/blockly-samples/commit/1c473d6b2c4aa3754cf332c07585af60342537ef))
-
-
-
-## [2.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.11...@blockly/field-colour-hsv-sliders@2.0.12) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.10...@blockly/field-colour-hsv-sliders@2.0.11) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.9...@blockly/field-colour-hsv-sliders@2.0.10) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [2.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.8...@blockly/field-colour-hsv-sliders@2.0.9) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.7...@blockly/field-colour-hsv-sliders@2.0.8) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.6...@blockly/field-colour-hsv-sliders@2.0.7) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.5...@blockly/field-colour-hsv-sliders@2.0.6) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.4...@blockly/field-colour-hsv-sliders@2.0.5) (2023-01-12)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.3...@blockly/field-colour-hsv-sliders@2.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.2...@blockly/field-colour-hsv-sliders@2.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/field-colour-hsv-sliders
-
-
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.1...@blockly/field-colour-hsv-sliders@2.0.2) (2022-10-27)
-
-
-### Bug Fixes
-
-* disable eye dropper instead of using fallback ([#1337](https://github.com/google/blockly-samples/issues/1337)) ([7fb03d9](https://github.com/google/blockly-samples/commit/7fb03d94346ada497d0822df00364c38ea9bd4ff))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@2.0.0...@blockly/field-colour-hsv-sliders@2.0.1) (2022-10-13)
-
-
-### Bug Fixes
-
-* Reverting invalid changes to hsv slider css. ([#1329](https://github.com/google/blockly-samples/issues/1329)) ([925858d](https://github.com/google/blockly-samples/commit/925858dd1ab7befcf051bf64d045dc71ea4ed997))
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour-hsv-sliders@1.1.0...@blockly/field-colour-hsv-sliders@2.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* Added css documentation for workspace search plugin. ([#1282](https://github.com/google/blockly-samples/issues/1282)) ([5dd7d2d](https://github.com/google/blockly-samples/commit/5dd7d2d2bed3d1e4920e27b795a06fff08e85297))
-* 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))
-
-
-
-# 1.1.0 (2022-09-08)
-
-
-### Features
-
-* created plugin for colour hsv sliders field. ([#1234](https://github.com/google/blockly-samples/issues/1234)) ([d46f28e](https://github.com/google/blockly-samples/commit/d46f28e50200eb060d75171077262c071481580d))
diff --git a/plugins/field-colour-hsv-sliders/README.md b/plugins/field-colour-hsv-sliders/README.md
deleted file mode 100644
index 0c4c589e6..000000000
--- a/plugins/field-colour-hsv-sliders/README.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# @blockly/field-colour-hsv-sliders [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) colour field using HSV sliders for editing.
-
-
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-colour-hsv-sliders
-```
-
-### npm
-
-```
-npm install @blockly/field-colour-hsv-sliders --save
-```
-
-## Usage
-
-This plugin adds a field type `FieldColourHsvSliders` that is registered to the name `'field_colour_hsv_sliders'`. This field is an extension of the `Blockly.FieldColour` field and outputs values in the same hexadecimal string format `'#rrggbb'` even though the UI represents the colour in the HSV colour space. See the [Blockly.FieldColour documentation](https://www.npmjs.com/package/@blockly/field-colour#creation) on what parameters and configurations this field supports, although unlike `Blockly.FieldColour`, this field does not use colour swatches and thus ignores options related to the swatches such as `'colourOptions'`.
-
-The UI also provides an eye dropper button that can be used to take a colour from anywhere on the screen [on supported platforms](https://caniuse.com/?search=eyedropper). Chrome, Edge, and Opera support the eye dropper feature, except [on Chromebooks](https://bugs.chromium.org/p/chromium/issues/detail?id=1348921) and on mobile devices. There is also [a known bug in Chrome on some versions of Linux](https://bugs.chromium.org/p/chromium/issues/detail?id=1227633) where the eye dropper may be visible but does not work correctly.
-
-To use it, you'll need to add this field to a block type definition, and add that block to your toolbox. See below for an example of defining a block type that uses this field.
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-colour-hsv-sliders';
-import {javascriptGenerator, Order} from 'blockly/javascript';
-
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'colour_hsv_sliders',
- message0: 'hsv %1',
- args0: [
- {
- type: 'field_colour_hsv_sliders',
- name: 'COLOUR',
- colour: '#ff0000',
- },
- ],
- output: 'Colour',
- style: 'colour_blocks',
- },
-]);
-
-javascriptGenerator.forBlock['colour_hsv_sliders'] = function (
- block,
- generator,
-) {
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, Order.ATOMIC];
-};
-```
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldColourHsvSliders} from '@blockly/field-colour-hsv-sliders';
-import {javascriptGenerator, Order} from 'blockly/javascript';
-
-Blockly.Blocks['colour_hsv_sliders'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('hsv ')
- .appendField(new FieldColourHsvSliders('#ff0000'), 'COLOUR');
- this.setOutput(true, 'Colour');
- this.setStyle('colour_blocks');
- },
-};
-javascriptGenerator.forBlock['colour_hsv_sliders'] = function (
- block,
- generator,
-) {
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, Order.ATOMIC];
-};
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-colour-hsv-sliders/package.json b/plugins/field-colour-hsv-sliders/package.json
deleted file mode 100644
index 9d89b83db..000000000
--- a/plugins/field-colour-hsv-sliders/package.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "name": "@blockly/field-colour-hsv-sliders",
- "version": "13.2.0",
- "description": "A Blockly colour field using HSV sliders.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "colour",
- "field",
- "hsv",
- "slider"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-colour-hsv-sliders#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-colour-hsv-sliders"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "dependencies": {
- "@blockly/field-colour": "^6.0.12"
- },
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-colour-hsv-sliders/readme-media/hsv_sliders_screenshot.png b/plugins/field-colour-hsv-sliders/readme-media/hsv_sliders_screenshot.png
deleted file mode 100644
index 409e5c6b8..000000000
Binary files a/plugins/field-colour-hsv-sliders/readme-media/hsv_sliders_screenshot.png and /dev/null differ
diff --git a/plugins/field-colour-hsv-sliders/src/field_colour_hsv_sliders.ts b/plugins/field-colour-hsv-sliders/src/field_colour_hsv_sliders.ts
deleted file mode 100644
index 2d6b8195f..000000000
--- a/plugins/field-colour-hsv-sliders/src/field_colour_hsv_sliders.ts
+++ /dev/null
@@ -1,864 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Colour input field with HSV sliders.
- */
-
-import * as Blockly from 'blockly/core';
-import {FieldColour} from '@blockly/field-colour';
-
-// Experimental API: https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper
-declare interface EyeDropper {
- open: () => Promise<{sRGBHex: string}>;
-}
-declare global {
- interface Window {
- EyeDropper?: {new (): EyeDropper};
- }
-}
-
-/**
- * A structure with three properties r, g, and b, representing the amount of
- * red, green, and blue light in the sRGB colour space where 1 is the maximum
- * amount of light that can be displayed.
- */
-class RgbColour {
- /** The red component of the colour, ranging from 0 to 1. */
- r: number;
-
- /** The green component of the colour, ranging from 0 to 1. */
- g: number;
-
- /** The blue component of the colour, ranging from 0 to 1. */
- b: number;
-
- /**
- * The RgbColour constructor.
- *
- * @param r The initial amount of red. Defaults to 0.
- * @param g The initial amount of green. Defaults to 0.
- * @param b The initial amount of blue. Defaults to 0.
- */
- constructor(r = 0, g = 0, b = 0) {
- this.r = r;
- this.g = g;
- this.b = b;
- }
-
- /**
- * Given a number from 0 to 1, returns a two-digit hexadecimal string from
- * '00' to 'ff'.
- *
- * @param x The amount of light in a component from 0 to 1.
- * @returns A hexadecimal representation from '00' to 'ff'.
- */
- static componentToHex(x: number): string {
- if (x <= 0) return '00';
- if (x >= 1) return 'ff';
- return ('0' + ((x * 255 + 0.5) >>> 0).toString(16)).slice(-2);
- }
-
- /**
- * Returns a hexadecimal string in the format #rrggbb representing the colour.
- *
- * @returns A hexadecimal representation of this colour.
- */
- toHex(): string {
- return (
- '#' +
- RgbColour.componentToHex(this.r) +
- RgbColour.componentToHex(this.g) +
- RgbColour.componentToHex(this.b)
- );
- }
-
- /**
- * Updates the properties of this instance to represent the same colour as the
- * provided string in the hexadecimal format #rrggbb.
- *
- * @param hex A hexadecimal string in the format '#rrggbb'.
- * @returns This instance after updating it.
- */
- loadFromHex(hex: string): RgbColour {
- this.r = parseInt(hex.slice(1, 3), 16) / 255;
- this.g = parseInt(hex.slice(3, 5), 16) / 255;
- this.b = parseInt(hex.slice(5, 7), 16) / 255;
- return this;
- }
-
- /**
- * Updates the properties of this instance to represent the same colour as the
- * provided HsvColour but in the sRGB colour space.
- *
- * @param hsv An HSV representation of a colour to copy.
- * @returns This instance after updating it.
- */
- loadFromHsv(hsv: HsvColour): RgbColour {
- const hue: number = (hsv.h - Math.floor(hsv.h)) * 6;
- this.r =
- hsv.v * (1 - hsv.s * Math.max(0, Math.min(1, 2 - Math.abs(hue - 3))));
- this.g =
- hsv.v * (1 - hsv.s * Math.max(0, Math.min(1, Math.abs(hue - 2) - 1)));
- this.b =
- hsv.v * (1 - hsv.s * Math.max(0, Math.min(1, Math.abs(hue - 4) - 1)));
- return this;
- }
-}
-
-/**
- * A structure with three properties h, s, and v, representing the hue,
- * saturation, and brightness in a colour. All three properties range from 0
- * to 1.
- */
-class HsvColour {
- /** The hue of the colour, ranging from 0 to 1. */
- h: number;
-
- /** The saturation of the colour, ranging from 0 to 1. */
- s: number;
-
- /** The brightness of the colour, ranging from 0 to 1. */
- v: number;
-
- /**
- * The HsvColour constructor.
- *
- * @param h The initial hue of the colour. Defaults to 0.
- * @param s The initial amount of saturation. Defaults to 0.
- * @param v The initial amount of brightness. Defaults to 0.
- */
- constructor(h = 0, s = 0, v = 0) {
- this.h = h;
- this.s = s;
- this.v = v;
- }
-
- /**
- * Updates the properties of this instance to represent the same colour as the
- * provided RgbColour but in the HSV colour space.
- *
- * @param rgb An RGB representation of a colour to copy.
- * @returns This instance after updating it.
- */
- loadFromRgb(rgb: RgbColour): HsvColour {
- const max: number = Math.max(Math.max(rgb.r, rgb.g), rgb.b);
- const min: number = Math.min(Math.min(rgb.r, rgb.g), rgb.b);
- this.v = max;
- if (min === max) {
- this.h = 0;
- this.s = 0;
- return this;
- }
-
- const delta: number = max - min;
- this.s = delta / max;
-
- let hue: number;
- if (rgb.r === max) {
- hue = (rgb.g - rgb.b) / delta;
- } else if (rgb.g === max) {
- hue = 2 + (rgb.b - rgb.r) / delta;
- } else {
- hue = 4 + (rgb.r - rgb.g) / delta;
- }
- hue /= 6;
- this.h = hue - Math.floor(hue);
- return this;
- }
-
- /**
- * Updates the properties of this instance to copy the provided HsvColour.
- *
- * @param other An HSV representation of a colour to copy.
- * @returns This instance after updating it.
- */
- copy(other: HsvColour): HsvColour {
- this.h = other.h;
- this.s = other.s;
- this.v = other.v;
- return this;
- }
-}
-
-/**
- * Class for a colour input field that displays HSV slider widgets when clicked.
- */
-export class FieldColourHsvSliders extends FieldColour {
- /** The maximum value of the hue slider range. */
- private static readonly HUE_SLIDER_MAX = 360;
-
- /** The maximum value of the saturation slider range. */
- private static readonly SATURATION_SLIDER_MAX = 100;
-
- /** The maximum value of the brightness slider range. */
- private static readonly BRIGHTNESS_SLIDER_MAX = 100;
-
- /**
- * The gradient control point positions should align with the center of the
- * slider thumb when the corresponding colour is selected. When the slider
- * is at the minimum or maximum value, the distance of center of the thumb
- * from the edge of the track will be the thumb's radius, so that's how far
- * the minimum and maximum control points should be.
- */
- static readonly THUMB_RADIUS = 12;
-
- /** Helper colour structures to allow manipulation in the HSV colour space. */
- private static readonly helperHsv: HsvColour = new HsvColour();
-
- /** Helper colour structures to support conversion to the RGB colour space. */
- private static readonly helperRgb: RgbColour = new RgbColour();
-
- /**
- * The intial value of the field when the user opened an editor to change its
- * value. When the editor is disposed, an event will be fired that uses this
- * as the event's oldValue.
- */
- protected valueWhenEditorWasOpened: string | null = null;
-
- /** Array holding info needed to unbind events. Used for disposing. */
- private hsvBoundEvents: Blockly.browserEvents.Data[] = [];
-
- /** HTML span element to display the current hue. */
- private hueReadout: HTMLSpanElement | null = null;
-
- /** HTML range input element for editing hue. */
- private hueSlider: HTMLInputElement | null = null;
-
- /** HTML span element to display the current saturation. */
- private saturationReadout: HTMLSpanElement | null = null;
-
- /** HTML range input element for editing saturation. */
- private saturationSlider: HTMLInputElement | null = null;
-
- /** HTML span element to display the current brightness. */
- private brightnessReadout: HTMLSpanElement | null = null;
-
- /** HTML range input element for editing brightness. */
- private brightnessSlider: HTMLInputElement | null = null;
-
- /** HTML div element containing all the labels and sliders. */
- private dropdownContainer: HTMLDivElement | null = null;
-
- /* eslint-disable @typescript-eslint/naming-convention */
- /**
- * Create and show the colour field's editor.
- *
- * @override
- */
- protected showEditor_(): void {
- /* eslint-enable @typescript-eslint/naming-convention */
- this.createDropdownSliders();
- if (!this.dropdownContainer || !this.hueSlider) {
- throw new Error('Failed to initialize the HSV sliders.');
- }
- Blockly.DropDownDiv.getContentDiv().appendChild(this.dropdownContainer);
-
- Blockly.DropDownDiv.showPositionedByField(
- this,
- this.dropdownDisposeSliders.bind(this),
- );
-
- this.valueWhenEditorWasOpened = this.value_;
-
- // Focus so we can start receiving keyboard events.
- setTimeout(() => {
- this.hueSlider?.focus({preventScroll: true});
- }, 250);
- }
-
- /**
- * Creates a row with a slider label and a readout to display the slider
- * value, appends it to the provided container, and returns the readout.
- *
- * @param name The display name of the slider.
- * @param container Where the row will be inserted.
- * @returns The readout, so that it can be updated.
- */
- private static createLabelInContainer(
- name: string,
- container: HTMLElement,
- ): HTMLSpanElement {
- const label: HTMLDivElement = document.createElement('div');
- const labelText: HTMLSpanElement = document.createElement('span');
- const readout: HTMLSpanElement = document.createElement('span');
- label.classList.add('fieldColourSliderLabel');
- labelText.textContent = name;
- label.appendChild(labelText);
- label.appendChild(readout);
- container.appendChild(label);
- return readout;
- }
-
- /**
- * Creates a slider, appends it to the provided container, and returns it.
- *
- * @param max The maximum value of the slider.
- * @param step The minimum step size of the slider.
- * @param container Where the row slider be inserted.
- * @returns The slider.
- */
- private createSliderInContainer(
- max: number,
- step: number,
- container: HTMLElement,
- ): HTMLInputElement {
- const slider: HTMLInputElement = document.createElement('input');
- slider.classList.add('fieldColourSlider');
- slider.type = 'range';
- slider.min = String(0);
- slider.max = String(max);
- slider.step = String(step);
- slider.addEventListener('keydown', (e) => {
- if (e.key === 'Enter' || e.key === ' ') {
- Blockly.DropDownDiv.hideIfOwner(this);
- Blockly.getFocusManager().focusNode(this);
- } else if (e.key === 'Escape') {
- this.setValue(this.valueWhenEditorWasOpened);
- }
- });
- container.appendChild(slider);
- return slider;
- }
-
- /** Creates the colour picker slider editor and adds event listeners. */
- private createDropdownSliders(): void {
- const container: HTMLDivElement = document.createElement('div');
- container.classList.add('fieldColourSliderContainer');
-
- this.hueReadout = FieldColourHsvSliders.createLabelInContainer(
- 'Hue',
- container,
- );
- this.hueSlider = this.createSliderInContainer(
- FieldColourHsvSliders.HUE_SLIDER_MAX,
- 2,
- container,
- );
- Blockly.utils.aria.setState(
- this.hueSlider,
- Blockly.utils.aria.State.LABEL,
- 'Hue',
- );
- this.saturationReadout = FieldColourHsvSliders.createLabelInContainer(
- 'Saturation',
- container,
- );
- this.saturationSlider = this.createSliderInContainer(
- FieldColourHsvSliders.SATURATION_SLIDER_MAX,
- 1,
- container,
- );
- Blockly.utils.aria.setState(
- this.saturationSlider,
- Blockly.utils.aria.State.LABEL,
- 'Saturation',
- );
- this.brightnessReadout = FieldColourHsvSliders.createLabelInContainer(
- 'Brightness',
- container,
- );
- this.brightnessSlider = this.createSliderInContainer(
- FieldColourHsvSliders.BRIGHTNESS_SLIDER_MAX,
- 1,
- container,
- );
- Blockly.utils.aria.setState(
- this.brightnessSlider,
- Blockly.utils.aria.State.LABEL,
- 'Brightness',
- );
-
- this.hsvBoundEvents.push(
- Blockly.browserEvents.conditionalBind(
- this.hueSlider,
- 'input',
- this,
- this.onSliderChange,
- ),
- );
- this.hsvBoundEvents.push(
- Blockly.browserEvents.conditionalBind(
- this.saturationSlider,
- 'input',
- this,
- this.onSliderChange,
- ),
- );
- this.hsvBoundEvents.push(
- Blockly.browserEvents.conditionalBind(
- this.brightnessSlider,
- 'input',
- this,
- this.onSliderChange,
- ),
- );
-
- if (window.EyeDropper) {
- // If the browser supports the eyedropper API, create a button for it.
- const button: HTMLButtonElement = document.createElement('button');
- button.classList.add('fieldColourEyedropper');
- button.addEventListener('keydown', (e) => {
- if (e.key === 'Escape') {
- this.setValue(this.valueWhenEditorWasOpened);
- }
- });
- container.appendChild(document.createElement('hr'));
- container.appendChild(button);
- this.hsvBoundEvents.push(
- Blockly.browserEvents.conditionalBind(
- button,
- 'click',
- this,
- this.onEyedropperEvent,
- ),
- );
- }
-
- this.dropdownContainer = container;
-
- this.updateSliderValues();
- }
-
- /**
- * Updates the ARIA roles and label for this field.
- */
- override recomputeAriaContext(): boolean {
- const shouldCustomize = super.recomputeAriaContext();
- if (!shouldCustomize) return false;
- Blockly.utils.aria.setState(
- this.getFocusableElement(),
- Blockly.utils.aria.State.HASPOPUP,
- 'menu',
- );
- return true;
- }
-
- /** Disposes of events and DOM-references belonging to the colour editor. */
- private dropdownDisposeSliders(): void {
- for (const event of this.hsvBoundEvents) {
- Blockly.browserEvents.unbind(event);
- }
- this.hsvBoundEvents.length = 0;
- this.hueReadout = null;
- this.hueSlider = null;
- this.saturationReadout = null;
- this.saturationSlider = null;
- this.brightnessReadout = null;
- this.brightnessSlider = null;
- this.dropdownContainer = null;
-
- if (
- this.sourceBlock_ &&
- Blockly.Events.isEnabled() &&
- this.valueWhenEditorWasOpened !== null &&
- this.valueWhenEditorWasOpened !== this.value_
- ) {
- // When closing a field input widget, fire an event indicating that the
- // user has completed a sequence of changes. The value may have changed
- // multiple times while the editor was open, but this will fire an event
- // containing the value when the editor was opened as well as the new one.
- Blockly.Events.fire(
- new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(
- this.sourceBlock_,
- 'field',
- this.name || null,
- this.valueWhenEditorWasOpened,
- this.value_,
- ),
- );
- this.valueWhenEditorWasOpened = null;
- }
- }
-
- /**
- * A helper function that converts a colour, specified by the provided hue,
- * saturation, and brightness parameters, into a hexadecimal string in the
- * format "#rrggbb".
- *
- * @param hue The hue of the colour.
- * @param saturation The saturation of the colour.
- * @param brightness The brightness of the colour.
- * @returns A hexadecimal representation of the colour in the format "#rrggbb"
- */
- private static hsvToHex(
- hue: number,
- saturation: number,
- brightness: number,
- ): string {
- FieldColourHsvSliders.helperHsv.h = hue;
- FieldColourHsvSliders.helperHsv.s = saturation;
- FieldColourHsvSliders.helperHsv.v = brightness;
- return FieldColourHsvSliders.helperRgb
- .loadFromHsv(FieldColourHsvSliders.helperHsv)
- .toHex();
- }
-
- /**
- * Updates the value of this field based on the editor sliders.
- *
- * @param event Unused.
- */
- private onSliderChange(event?: Event): void {
- if (!this.hueSlider || !this.saturationSlider || !this.brightnessSlider) {
- throw new Error('The HSV sliders are missing.');
- }
- const hue: number =
- parseFloat(this.hueSlider.value) / FieldColourHsvSliders.HUE_SLIDER_MAX;
- const saturation: number =
- parseFloat(this.saturationSlider.value) /
- FieldColourHsvSliders.SATURATION_SLIDER_MAX;
- const brightness: number =
- parseFloat(this.brightnessSlider.value) /
- FieldColourHsvSliders.BRIGHTNESS_SLIDER_MAX;
- this.setIntermediateValue(
- FieldColourHsvSliders.hsvToHex(hue, saturation, brightness),
- );
- this.renderSliders();
- }
-
- /**
- * Updates the value of this field and editor sliders using an eyedropper.
- *
- * @param event Unused.
- */
- private onEyedropperEvent(event?: Event): void {
- if (window.EyeDropper) {
- const eyeDropper: EyeDropper = new window.EyeDropper();
- eyeDropper.open().then(
- (result) => {
- this.setIntermediateValue(result.sRGBHex);
- this.updateSliderValues();
- },
- // Prevent throwing by handling promise rejection and doing nothing.
- () => {},
- );
- }
- }
-
- private setIntermediateValue(value: string): void {
- // Intermediate value changes from user input are not confirmed until the
- // user closes the editor, and may be numerous. Inhibit reporting these as
- // normal block change events, and instead report them as special
- // intermediate changes that do not get recorded in undo history.
- const oldValue = this.value_;
- // Change the field's value without firing the normal change event.
- this.setValue(value, false);
- if (
- this.sourceBlock_ &&
- Blockly.Events.isEnabled() &&
- this.value_ !== oldValue
- ) {
- // Fire a special event indicating that the value changed but the change
- // isn't complete yet and normal field change listeners can wait.
- Blockly.Events.fire(
- new (Blockly.Events.get(
- Blockly.Events.BLOCK_FIELD_INTERMEDIATE_CHANGE,
- ))(this.sourceBlock_, this.name || null, oldValue, this.value_),
- );
- }
- }
-
- /**
- * Updates the gradient backgrounds of the slider tracks and readouts based
- * on the slider values.
- */
- private renderSliders(): void {
- if (
- !this.hueSlider ||
- !this.hueReadout ||
- !this.saturationSlider ||
- !this.saturationReadout ||
- !this.brightnessSlider ||
- !this.brightnessReadout
- ) {
- throw new Error('The HSV sliders are missing.');
- }
- this.hueReadout.textContent = this.hueSlider.value;
- this.saturationReadout.textContent = this.saturationSlider.value;
- this.brightnessReadout.textContent = this.brightnessSlider.value;
-
- const h: number =
- parseFloat(this.hueSlider.value) / FieldColourHsvSliders.HUE_SLIDER_MAX;
- const s: number =
- parseFloat(this.saturationSlider.value) /
- FieldColourHsvSliders.SATURATION_SLIDER_MAX;
- const v: number =
- parseFloat(this.brightnessSlider.value) /
- FieldColourHsvSliders.BRIGHTNESS_SLIDER_MAX;
-
- // The hue slider needs intermediate gradient control points to include all
- // colours of the rainbow.
- let hueGradient = 'linear-gradient(to right, ';
- hueGradient +=
- FieldColourHsvSliders.hsvToHex(0 / 6, s, v) +
- ` ${FieldColourHsvSliders.THUMB_RADIUS}px, `;
- hueGradient += FieldColourHsvSliders.hsvToHex(1 / 6, s, v) + ', ';
- hueGradient += FieldColourHsvSliders.hsvToHex(2 / 6, s, v) + ', ';
- hueGradient += FieldColourHsvSliders.hsvToHex(3 / 6, s, v) + ', ';
- hueGradient += FieldColourHsvSliders.hsvToHex(4 / 6, s, v) + ', ';
- hueGradient += FieldColourHsvSliders.hsvToHex(5 / 6, s, v) + ', ';
- hueGradient +=
- FieldColourHsvSliders.hsvToHex(6 / 6, s, v) +
- ` calc(100% - ${FieldColourHsvSliders.THUMB_RADIUS}px))`;
- this.hueSlider.style.setProperty('--slider-track-background', hueGradient);
-
- // The saturation slider only needs gradient control points at each end.
- let saturationGradient = 'linear-gradient(to right, ';
- saturationGradient +=
- FieldColourHsvSliders.hsvToHex(h, 0, v) +
- ` ${FieldColourHsvSliders.THUMB_RADIUS}px, `;
- saturationGradient +=
- FieldColourHsvSliders.hsvToHex(h, 1, v) +
- ` calc(100% - ${FieldColourHsvSliders.THUMB_RADIUS}px))`;
- this.saturationSlider.style.setProperty(
- '--slider-track-background',
- saturationGradient,
- );
-
- // The brightness slider only needs gradient control points at each end.
- let brightnessGradient = 'linear-gradient(to right, ';
- brightnessGradient +=
- FieldColourHsvSliders.hsvToHex(h, s, 0) +
- ` ${FieldColourHsvSliders.THUMB_RADIUS}px, `;
- brightnessGradient +=
- FieldColourHsvSliders.hsvToHex(h, s, 1) +
- ` calc(100% - ${FieldColourHsvSliders.THUMB_RADIUS}px))`;
- this.brightnessSlider.style.setProperty(
- '--slider-track-background',
- brightnessGradient,
- );
- }
-
- /** Updates slider values based on the current value of the field. */
- private updateSliderValues(): void {
- if (!this.hueSlider || !this.saturationSlider || !this.brightnessSlider) {
- return;
- }
-
- const hsv: HsvColour = FieldColourHsvSliders.helperHsv.loadFromRgb(
- FieldColourHsvSliders.helperRgb.loadFromHex(this.getValue() ?? ''),
- );
-
- this.hueSlider.value = String(hsv.h * FieldColourHsvSliders.HUE_SLIDER_MAX);
- this.saturationSlider.value = String(
- hsv.s * FieldColourHsvSliders.SATURATION_SLIDER_MAX,
- );
- this.brightnessSlider.value = String(
- hsv.v * FieldColourHsvSliders.BRIGHTNESS_SLIDER_MAX,
- );
-
- this.renderSliders();
- }
-
- override getAriaValue() {
- const hsv: HsvColour = FieldColourHsvSliders.helperHsv.loadFromRgb(
- FieldColourHsvSliders.helperRgb.loadFromHex(this.getValue() ?? ''),
- );
-
- const components = [];
- const brightness = hsv.v * 100;
- if (brightness === 0) {
- return 'black';
- } else if (brightness <= 25) {
- components.push('very dark');
- } else if (brightness < 75) {
- components.push('dark');
- }
-
- const saturation = hsv.s * 100;
- if (saturation === 0) {
- if (brightness === 100) {
- return 'white';
- }
- components.push('grey');
- return components.join(' ');
- } else if (saturation <= 30) {
- components.push(brightness <= 60 ? 'greyish' : 'pale');
- } else if (saturation >= 75) {
- components.push('vibrant');
- }
-
- const hue = hsv.h * 360;
- if (hue >= 330 || hue <= 10) {
- components.push('red');
- } else if (hue <= 45) {
- components.push('orange');
- } else if (hue <= 65) {
- components.push('yellow');
- } else if (hue <= 160) {
- components.push('green');
- } else if (hue <= 190) {
- components.push('cyan');
- } else if (hue <= 260) {
- components.push('blue');
- } else if (hue <= 290) {
- components.push('purple');
- } else {
- components.push('fuchsia');
- }
-
- return components.join(' ');
- }
-}
-
-Blockly.fieldRegistry.register(
- 'field_colour_hsv_sliders',
- FieldColourHsvSliders,
-);
-
-// CSS for colour slider fields.
-Blockly.Css.register(`
-.fieldColourSliderContainer {
- padding: 4px;
- font-family: Roboto, Arial, sans-serif;
- color: #5c5c5c;
-}
-.fieldColourSliderContainer hr {
- border: none;
- border-top: 1px solid #bbb;
-}
-.fieldColourSliderLabel {
- display: flex;
- justify-content: space-between;
-}
-.fieldColourEyedropper {
- appearance: none;
- position: relative;
- border: none;
- border-radius: 4px;
- background: transparent;
- font: inherit;
- color: inherit;
- cursor: pointer;
- width: 100%;
- margin: 0;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-.fieldColourEyedropper:hover {
- background: rgba(0,0,0,0.1)
-}
-.fieldColourEyedropper input {
- opacity: 0;
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
-}
-.fieldColourEyedropper::before {
- content: "Eyedropper";
-}
-.fieldColourEyedropper::after {
- content: "";
- margin-left: 8px;
- width: 24px;
- height: 24px;
- background: currentColor;
- pointer-events: none;
- -webkit-mask-image: var(--customize-dial-symbol);
- -webkit-mask-repeat: no-repeat;
- -webkit-mask-position: center;
- mask-image: var(--customize-dial-symbol);
- mask-repeat: no-repeat;
- mask-position: center;
- --customize-dial-symbol: url('data:image/svg+xml,\
- \
- \
- \
- ');
-}
-.blocklyKeyboardNavigation .fieldColourEyedropper:focus {
- outline: none;
- border: var(--blockly-selection-width) solid var(--blockly-active-node-color);
- border-radius: 4px;
-}
-.fieldColourSlider {
- -webkit-appearance: none;
- width: 150px;
- height: 24px;
- margin: 4px 8px 24px 8px;
- padding: 0;
-}
-.fieldColourSlider:last-child {
- margin-bottom: 4px;
-}
-.fieldColourSlider:focus {
- outline: none;
-}
-/* Webkit */
-.fieldColourSlider::-webkit-slider-runnable-track {
- background: var(--slider-track-background);
- border-radius: 8px;
- height: 16px;
-}
-.fieldColourSlider::-webkit-slider-thumb {
- -webkit-appearance: none;
- background: #fff;
- border-radius: 50%;
- box-shadow: 0 0 0 4px rgba(0,0,0,.15);
- cursor: pointer;
- width: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
- height: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
- margin-top: -4px;
-}
-/* Firefox */
-.fieldColourSlider::-moz-range-track {
- background: var(--slider-track-background);
- border-radius: 8px;
- height: 16px;
-}
-.fieldColourSlider::-moz-range-thumb {
- background: #fff;
- border: none;
- border-radius: 50%;
- box-shadow: 0 0 0 4px rgba(0,0,0,.15);
- cursor: pointer;
- width: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
- height: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
-}
-.fieldColourSlider::-moz-focus-outer {
- /* override the focus border style */
- border: 0;
-}
-/* IE */
-.fieldColourSlider::-ms-track {
- background: var(--slider-track-background);
- border-radius: 12px;
- width: 100%;
- height: 24px;
- /* remove default tick marks */
- color: transparent;
-}
-.fieldColourSlider::-ms-fill-lower {
- background: transparent;
-}
-.fieldColourSlider::-ms-fill-upper {
- background: transparent;
-}
-.fieldColourSlider::-ms-thumb {
- background: #fff;
- border: none;
- border-radius: 50%;
- box-shadow: 0 0 0 4px rgba(0,0,0,.15);
- cursor: pointer;
- width: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
- height: ${FieldColourHsvSliders.THUMB_RADIUS * 2}px;
-}
-.blocklyKeyboardNavigation .fieldColourSlider:focus {
- border: var(--blockly-selection-width) solid var(--blockly-active-node-color);
- border-radius: 16px;
- padding: 1px;
-}
-`);
diff --git a/plugins/field-colour-hsv-sliders/src/index.ts b/plugins/field-colour-hsv-sliders/src/index.ts
deleted file mode 100644
index b5899eff3..000000000
--- a/plugins/field-colour-hsv-sliders/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field_colour_hsv_sliders';
diff --git a/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test.mocha.js b/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test.mocha.js
deleted file mode 100644
index 352aa2744..000000000
--- a/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test.mocha.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {
- assertColourHsvSlidersField,
- assertColourHsvSlidersFieldDefault,
-} = require('./field_colour_hsv_sliders_test_helpers.mocha');
-const {testHelpers} = require('@blockly/dev-tools');
-const {FieldColourHsvSliders} = require('../src/index');
-
-const {
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldColourHsvSliders', function () {
- setup(function () {
- this.jsdomCleanup = require('jsdom-global')(
- '
',
- );
- this.field = new FieldColourHsvSliders();
- });
-
- teardown(function () {
- this.jsdomCleanup();
- });
-
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- {title: 'NaN', value: NaN},
- {title: 'Non-Parsable String', value: 'wrong'},
- {title: 'Integer', value: 1},
- {title: 'Float', value: 1.5},
- {title: 'Integer String', value: '1'},
- {title: 'Float String', value: '1.5'},
- {title: 'Infinity', value: Infinity},
- {title: 'Negative Infinity', value: -Infinity},
- {title: 'Infinity String', value: 'Infinity'},
- {title: 'Negative Infinity String', value: '-Infinity'},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- {
- title: 'Red',
- value: '#ff0000',
- expectedValue: '#ff0000',
- expectedText: '#f00',
- },
- {
- title: 'Black',
- value: '#000000',
- expectedValue: '#000000',
- expectedText: '#000',
- },
- {
- title: 'White',
- value: '#ffffff',
- expectedValue: '#ffffff',
- expectedText: '#fff',
- },
- {
- title: 'Gray',
- value: '#7f7f7f',
- expectedValue: '#7f7f7f',
- expectedText: '#7f7f7f',
- },
- {
- title: 'Shortened String',
- value: 'bad',
- expectedValue: '#bbaadd',
- expectedText: '#bad',
- },
- ];
- const addArgsAndJson = function (testCase) {
- testCase.args = [testCase.value];
- testCase.json = {colour: testCase.value};
- };
- invalidValueTestCases.forEach(addArgsAndJson);
- validValueTestCases.forEach(addArgsAndJson);
-
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldColourHsvSliders} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertColourHsvSlidersField(
- field,
- testCase.expectedValue,
- testCase.expectedText,
- );
- };
-
- runConstructorSuiteTests(
- FieldColourHsvSliders,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertColourHsvSlidersFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldColourHsvSliders,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertColourHsvSlidersFieldDefault,
- );
-
- suite('setValue', function () {
- suite('Empty -> New Value', function () {
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- '#ffffff',
- '#fff',
- );
- });
- suite('Value -> New Value', function () {
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- '#ffffff',
- '#fff',
- );
- });
- });
-});
diff --git a/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test_helpers.mocha.js b/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test_helpers.mocha.js
deleted file mode 100644
index 74e5f80df..000000000
--- a/plugins/field-colour-hsv-sliders/test/field_colour_hsv_sliders_test_helpers.mocha.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {assertFieldValue} = require('@blockly/dev-tools').testHelpers;
-const {FieldColourHsvSliders} = require('../src/index');
-
-/**
- * Assert the colour hsv sliders field options.
- * @param {FieldColourHsvSliders} colourHsvSlidersField The colour hsv sliders
- * field.
- * @param {string} expectedValue The expected value.
- * @param {string} expectedText The expected text.
- */
-function assertColourHsvSlidersField(
- colourHsvSlidersField,
- expectedValue,
- expectedText,
-) {
- assertFieldValue(colourHsvSlidersField, expectedValue, expectedText);
-}
-
-/**
- * Assert the slider field's value is the default value.
- * @param {FieldColourHsvSliders} colourHsvSlidersField The slider field.
- */
-function assertColourHsvSlidersFieldDefault(colourHsvSlidersField) {
- assertColourHsvSlidersField(colourHsvSlidersField, '#ffffff', '#fff');
-}
-
-module.exports = {
- assertColourHsvSlidersField,
- assertColourHsvSlidersFieldDefault,
-};
diff --git a/plugins/field-colour-hsv-sliders/test/index.html b/plugins/field-colour-hsv-sliders/test/index.html
deleted file mode 100644
index e80b2952a..000000000
--- a/plugins/field-colour-hsv-sliders/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Colour HSV Sliders Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/field-colour-hsv-sliders/test/index.ts b/plugins/field-colour-hsv-sliders/test/index.ts
deleted file mode 100644
index 0be3ab2d7..000000000
--- a/plugins/field-colour-hsv-sliders/test/index.ts
+++ /dev/null
@@ -1,206 +0,0 @@
-/**
- * @license
- * Copyright 2022 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Colour HSV Sliders field test playground.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the HSV slider field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_colour_hsv_sliders',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_colour_hsv_sliders`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_colour_hsv_sliders',
- name: 'FIELDNAME',
- colour: '#ff0000',
- alt: {
- type: 'field_label',
- text: `No field_colour_hsv_sliders`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_colour_hsv_sliders',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_colour_hsv_sliders`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_colour_hsv_sliders',
- name: 'FIELDNAME',
- colour: '#ff0000',
- alt: {
- type: 'field_label',
- text: `No field_colour_hsv_sliders`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the colour field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- ],
-};
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox: jsonToolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-colour-hsv-sliders/tsconfig.json b/plugins/field-colour-hsv-sliders/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-colour-hsv-sliders/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-colour/CHANGELOG.md b/plugins/field-colour/CHANGELOG.md
deleted file mode 100644
index 9ac7ff77c..000000000
--- a/plugins/field-colour/CHANGELOG.md
+++ /dev/null
@@ -1,552 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Bug Fixes
-
-* Fix positioning of dropdown on full-block color fields ([#2747](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2747))
-
-
-## [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
-
-* Improve accessibility of grid and colour fields ([#2724](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2724))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.12](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour@6.0.11...@blockly/field-colour@6.0.12) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.11](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour@6.0.10...@blockly/field-colour@6.0.11) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-colour@6.0.9...@blockly/field-colour@6.0.10) (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))
-
-
-
-## [6.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.8...@blockly/field-colour@6.0.9) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.7...@blockly/field-colour@6.0.8) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.6...@blockly/field-colour@6.0.7) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.5...@blockly/field-colour@6.0.6) (2025-10-30)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.4...@blockly/field-colour@6.0.5) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.3...@blockly/field-colour@6.0.4) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.2...@blockly/field-colour@6.0.3) (2025-07-03)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.1...@blockly/field-colour@6.0.2) (2025-06-19)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@6.0.0...@blockly/field-colour@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.19...@blockly/field-colour@6.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))
-
-
-
-## [5.0.19](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.18...@blockly/field-colour@5.0.19) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.18](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.17...@blockly/field-colour@5.0.18) (2025-05-15)
-
-
-### Reverts
-
-* Revert "fix: Add `getClass()` to `FieldColour`. (#2506)" ([144b6d0](https://github.com/google/blockly-samples/commit/144b6d0c4b939e1f329986220e30ebdfcf93453c)), closes [#2506](https://github.com/google/blockly-samples/issues/2506)
-
-
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.16...@blockly/field-colour@5.0.17) (2025-05-08)
-
-
-### Bug Fixes
-
-* Add `getClass()` to `FieldColour`. ([#2506](https://github.com/google/blockly-samples/issues/2506)) ([f5a577b](https://github.com/google/blockly-samples/commit/f5a577b8fe25b6fbf1502ca85902c22777fd8270))
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.15...@blockly/field-colour@5.0.16) (2025-03-27)
-
-
-### Bug Fixes
-
-* Don't call blur() when mouse leaves the colour picker. ([#2499](https://github.com/google/blockly-samples/issues/2499)) ([e8d4a87](https://github.com/google/blockly-samples/commit/e8d4a874c44cdb0e1ad05b08122251b9e758655c))
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.14...@blockly/field-colour@5.0.15) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.13...@blockly/field-colour@5.0.14) (2025-01-23)
-
-
-### Bug Fixes
-
-* Fix bug that prevented keyboard navigation of color swatches. ([#2479](https://github.com/google/blockly-samples/issues/2479)) ([5945e7c](https://github.com/google/blockly-samples/commit/5945e7c0412faedc08c422f9f538ef22193cc659))
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.12...@blockly/field-colour@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.11...@blockly/field-colour@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.10...@blockly/field-colour@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.9...@blockly/field-colour@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.8...@blockly/field-colour@5.0.9) (2024-08-29)
-
-
-### Bug Fixes
-
-* add documentation about locales for colour blocks ([#2452](https://github.com/google/blockly-samples/issues/2452)) ([e06f13d](https://github.com/google/blockly-samples/commit/e06f13de06cb1bea9358ad46306051f4eb1bd05a))
-* predeploy plugins ([#2449](https://github.com/google/blockly-samples/issues/2449)) ([6b36d8b](https://github.com/google/blockly-samples/commit/6b36d8b344a969f79d89bbc7dcee29ae554759f9))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.7...@blockly/field-colour@5.0.8) (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))
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.6...@blockly/field-colour@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.5...@blockly/field-colour@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.4...@blockly/field-colour@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.3...@blockly/field-colour@5.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)
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.2...@blockly/field-colour@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.1...@blockly/field-colour@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@5.0.0...@blockly/field-colour@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@4.0.4...@blockly/field-colour@5.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))
-* 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))
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour@4.0.3...@blockly/field-colour@4.0.4) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour@4.0.2...@blockly/field-colour@4.0.3) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour@4.0.1...@blockly/field-colour@4.0.2) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@4.0.0...@blockly/field-colour@4.0.1) (2024-04-11)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.13...@blockly/field-colour@4.0.0) (2024-04-04)
-
-
-### ⚠ BREAKING CHANGES
-
-* The multiline text input field no longer registers itself on load. The developer must either manually register the field or install blocks, which will install the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-* The angle field no longer registers itself on load. The developer must manually register the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-
-### Features
-
-* add block definitions to fields ([#2299](https://github.com/google/blockly-samples/issues/2299)) ([c197af6](https://github.com/google/blockly-samples/commit/c197af6c67bc989bbdb4e83a62abc08167bcbbfe)), closes [#2162](https://github.com/google/blockly-samples/issues/2162) [#2202](https://github.com/google/blockly-samples/issues/2202) [#2221](https://github.com/google/blockly-samples/issues/2221) [#2211](https://github.com/google/blockly-samples/issues/2211) [#2220](https://github.com/google/blockly-samples/issues/2220) [#2232](https://github.com/google/blockly-samples/issues/2232) [#2233](https://github.com/google/blockly-samples/issues/2233) [#2296](https://github.com/google/blockly-samples/issues/2296)
-
-
-
-## [3.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.12...@blockly/field-colour@3.0.13) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.11...@blockly/field-colour@3.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.10...@blockly/field-colour@3.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.9...@blockly/field-colour@3.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.8...@blockly/field-colour@3.0.9) (2023-11-09)
-
-
-### Bug Fixes
-
-* zelos full block colour field rendering incorrectly ([#1932](https://github.com/google/blockly-samples/issues/1932)) ([49fe34f](https://github.com/google/blockly-samples/commit/49fe34fa887af1c6295fbcd294839d20fb86b0c8))
-
-
-
-## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.7...@blockly/field-colour@3.0.8) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.6...@blockly/field-colour@3.0.7) (2023-10-30)
-
-
-### Bug Fixes
-
-* Field Colour Plugin types ([#1964](https://github.com/google/blockly-samples/issues/1964)) ([8aee09e](https://github.com/google/blockly-samples/commit/8aee09e9375cbcff65cc7b39530daaa3bdf84182))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.5...@blockly/field-colour@3.0.6) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.4...@blockly/field-colour@3.0.5) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.3...@blockly/field-colour@3.0.4) (2023-08-31)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.2...@blockly/field-colour@3.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.1...@blockly/field-colour@3.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@3.0.0...@blockly/field-colour@3.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@2.0.1...@blockly/field-colour@3.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@2.0.0...@blockly/field-colour@2.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@1.2.1...@blockly/field-colour@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))
-
-
-
-## [1.2.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@1.2.0...@blockly/field-colour@1.2.1) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## [1.2.0](https://github.com/google/blockly-samples/compare/@blockly/field-colour@1.1.1...@blockly/field-colour@1.2.0) (2023-05-25)
-
-
-### Features
-
-* Revise fields ([#1700](https://github.com/google/blockly-samples/issues/1700)) ([c326f7b](https://github.com/google/blockly-samples/commit/c326f7b1ef54fe45387046c693ebd5afe2b2c571))
-
-
-
-## [1.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-colour@1.1.0...@blockly/field-colour@1.1.1) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-colour
-
-
-
-
-
-## 1.1.0 (2023-05-11)
-
-
-### Features
-
-* Add angle, colour, and multiline fields. (Rebase of [#1674](https://github.com/google/blockly-samples/issues/1674)) ([#1693](https://github.com/google/blockly-samples/issues/1693)) ([1b447f4](https://github.com/google/blockly-samples/commit/1b447f41d6293f14e846b8a4d82d289a5637a99a))
diff --git a/plugins/field-colour/README.md b/plugins/field-colour/README.md
deleted file mode 100644
index 1fb1f42fb..000000000
--- a/plugins/field-colour/README.md
+++ /dev/null
@@ -1,308 +0,0 @@
-# @blockly/field-colour [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) field and blocks for
-choosing and combining colours.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-colour
-```
-
-### npm
-
-```
-npm install @blockly/field-colour --save
-```
-
-## Usage
-
-If you want to use this field in a block definition, you must install it by
-calling `registerFieldColour` before instantiating your blocks. If another
-field is registered under the same name (`field_colour`), this field will
-overwrite it.
-
-If you [install the blocks](#blocks) in this package, the field will
-automatically be installed.
-
-### Field
-
-The colour field stores a string as its `value`, and a string as its `text`. Its
-`value` is a string with the format `#rrggbb`, while its `text` may be a string
-with the format `#rgb` if possible.
-
-#### Colour field
-
-
-
-#### Colour field with editor open
-
-
-
-#### Colour field on collapsed block
-
-
-
-### Creation
-
-#### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldColour} from '@blockly/field-colour';
-
-registerFieldColour();
-Blockly.Blocks['test_field_colour'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('colour: ')
- .appendField(
- new FieldColour('#ff4040', null, {
- colourOptions: [
- '#ff4040',
- '#ff8080',
- '#ffc0c0',
- '#4040ff',
- '#8080ff',
- '#c0c0ff',
- ],
- colourTitles: [
- 'dark pink',
- 'pink',
- 'light pink',
- 'dark blue',
- 'blue',
- 'light blue',
- ],
- columns: 3,
- }),
- 'FIELDNAME',
- );
- },
-};
-```
-
-#### JSON
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldColour} from '@blockly/field-colour';
-
-registerFieldColour();
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_field_colour',
- message0: 'colour: %1',
- args0: [
- {
- type: 'field_colour',
- name: 'FIELDNAME',
- colour: '#ff4040',
- colourOptions: [
- '#ff4040',
- '#ff8080',
- '#ffc0c0',
- '#4040ff',
- '#8080ff',
- '#c0c0ff',
- ],
- colourTitles: [
- 'dark pink',
- 'pink',
- 'light pink',
- 'dark blue',
- 'blue',
- 'light blue',
- ],
- columns: 3,
- },
- ],
- },
-]);
-```
-
-The colour constructor takes in the following:
-
-- an optional `value`
-- an optional [validator](#creating-a-colour-validator)
-- an optional map of options, including:
- - `colourOptions`
- - `colourTitles`
- - `columns`
-
-The `value` should be a string in the format `#rrggbb`. If no `value`
-is given or the given `value` is invalid, the first entry in the
-default colours array will be used.
-
-The following options can also be set in JSON:
-
-- `colourOptions`
-- `colourTitles`
-- `columns`
-
-Or they can be set using [JavaScript hooks](#editor-options).
-
-## Customization
-
-### Editor options
-
-The `setColours`
-function can be used to set the colour options of a colour field. It takes in an
-array of colour strings, which must be defined in `#rrggbb` format, and an
-optional array of tooltips. If the tooltip array is not provided, the default
-tooltip array will be used.
-
-Tooltips and colours are matched based on array index, not based on value. If
-the colours array is longer than the tooltip array, the tooltips for the extra
-colours will be their `#rrggbb` value.
-
-The setColumns function sets the number of columns in the colour picker.
-
-#### JSON
-
-```js
-{
- "type": "example_colour",
- "message0": "colour: %1",
- "args0": [
- {
- "type": "field_colour",
- "name": "COLOUR",
- "colour": "#ff4040"
- }
- ],
- "extensions": ["set_colours_extension"]
-}
-```
-
-```js
-Blockly.Extensions.register('set_colours_extension', function () {
- var field = this.getField('COLOUR');
- field.setColours(
- ['#ff4040', '#ff8080', '#ffc0c0', '#4040ff', '#8080ff', '#c0c0ff'],
- ['dark pink', 'pink', 'light pink', 'dark blue', 'blue', 'light blue'],
- );
- field.setColumns(3);
-});
-```
-
-This is done using a JSON
-[extension](https://developers.google.com/blockly/guides/create-custom-blocks/define/extensions).
-
-#### JavaScript
-
-```js
-Blockly.Blocks['example_colour'] = {
- init: function () {
- var field = new Blockly.FieldColour('#ff4040');
- field.setColours(
- ['#ff4040', '#ff8080', '#ffc0c0', '#4040ff', '#8080ff', '#c0c0ff'],
- ['dark pink', 'pink', 'light pink', 'dark blue', 'blue', 'light blue'],
- );
- field.setColumns(3);
- this.appendDummyInput().appendField('colour:').appendField(field, 'COLOUR');
- },
-};
-```
-
-
-
-#### Creating a colour validator
-
-Note: For information on validators in general see [Validators](https://developers.google.com/blockly/guides/create-custom-blocks/fields/validators).
-
-A colour field's value is a `#rrggbb` format string, so any validators must
-accept a `#rrggbb` format string, and return a `#rrggbb` format string, `null`,
-or `undefined`.
-
-Here is an example of a validator that changes the colour of the block to match
-the colour of the field.
-
-```
-function(newValue) {
- this.getSourceBlock().setColour(newValue);
- return newValue;
-}
-```
-
-#### Block changing colour based on its colour field
-
-
-
-### Blocks
-
-This package also provides four blocks related to the colour field. Each block
-has generators in JavaScript, Python, PHP, Lua, and Dart.
-
-- "colour_blend" takes in two colours and a ratio and outputs a single colour.
-- "colour_picker" is a simple block with just the colour field and an output.
-- "colour_random" generates a random colour.
-- "colour_rgb" generates a colour based on red, green, and blue values.
-
-You can install all four blocks by calling `installAllBlocks`. This will
-install the blocks and all of their dependencies, including the colour field.
-When calling `installAllBlocks`—or any of the individual `installSomeBlock`
-functions—you can supply one or more `CodeGenerator` instances (e.g.
-`javascriptGenerator`), and the install function will also install the correct
-generator function for each block for the corresponding language(s).
-
-```js
-import {javascriptGenerator} from 'blockly/javascript';
-import {dartGenerator} from 'blockly/dart';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-import {luaGenerator} from 'blockly/lua';
-import {installAllBlocks as installColourBlocks} from '@blockly/field-colour';
-
-// Installs all four blocks, the colour field, and all language generators.
-installColourBlocks({
- javascript: javascriptGenerator,
- dart: dartGenerator,
- lua: luaGenerator,
- python: pythonGenerator,
- php: phpGenerator,
-});
-```
-
-If you only want to install a single block, you can call that block's
-`installBlock` function. The `generators` parameter is the same.
-
-```js
-import {javascriptGenerator} from 'blockly/javascript';
-import {colourBlend} from '@blockly/field-colour';
-
-// Installs the colour_blend block, the colour field,
-// and the generator for colour_blend in JavaScript.
-colourBlend.installBlock({
- javascript: javascriptGenerator,
-});
-```
-
-#### Message files and locales
-
-The blocks in this package contain text that can be localized into multiple
-languages. As of August 2024, the relevant messages are included in the core
-Blockly language files. For information on Blockly's approach to localization,
-see [Localization](https://developers.google.com/blockly/guides/configure/web/translations)
-in the developer's guide.
-
-If your blocks show `%{BKY_COLOUR_BLEND_TITLE}` or similar text instead
-of the expected text, make sure that you either:
-
-- Import the default Blockly modules, which includes the English langfiles, or
-- Explicitly import a language and call `setLocale` before using these blocks.
-
-For more information, see [Load a Blockly localization
-table](https://developers.google.com/blockly/guides/configure/web/translations#load-blockly).
-
-### API Reference
-
-- `setColours`: Sets the colour options, and optionally the titles for the
- options. The colours should be an array of `#rrggbb` strings.
-- `setColumns`: Sets the number of columns the dropdown should have.
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-colour/package.json b/plugins/field-colour/package.json
deleted file mode 100644
index 869ab4789..000000000
--- a/plugins/field-colour/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "name": "@blockly/field-colour",
- "version": "13.2.0",
- "description": "A Blockly colour field.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "field",
- "colour"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-colour#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-colour"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "@typescript-eslint/parser": "^8.61.1",
- "chai": "^6.2.2",
- "jsdom": "^29.1.1",
- "jsdom-global": "^3.0.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- },
- "dependencies": {
- "@blockly/field-grid-dropdown": "^13.2.0"
- }
-}
diff --git a/plugins/field-colour/readme-media/collapsed.png b/plugins/field-colour/readme-media/collapsed.png
deleted file mode 100644
index 3787dc73a..000000000
Binary files a/plugins/field-colour/readme-media/collapsed.png and /dev/null differ
diff --git a/plugins/field-colour/readme-media/customized.png b/plugins/field-colour/readme-media/customized.png
deleted file mode 100644
index 161860b9d..000000000
Binary files a/plugins/field-colour/readme-media/customized.png and /dev/null differ
diff --git a/plugins/field-colour/readme-media/on_block.png b/plugins/field-colour/readme-media/on_block.png
deleted file mode 100644
index ee3a66d96..000000000
Binary files a/plugins/field-colour/readme-media/on_block.png and /dev/null differ
diff --git a/plugins/field-colour/readme-media/validator.gif b/plugins/field-colour/readme-media/validator.gif
deleted file mode 100644
index bfcd87d72..000000000
Binary files a/plugins/field-colour/readme-media/validator.gif and /dev/null differ
diff --git a/plugins/field-colour/readme-media/with_editor.png b/plugins/field-colour/readme-media/with_editor.png
deleted file mode 100644
index 8a88f57ae..000000000
Binary files a/plugins/field-colour/readme-media/with_editor.png and /dev/null differ
diff --git a/plugins/field-colour/src/blocks/colourBlend.ts b/plugins/field-colour/src/blocks/colourBlend.ts
deleted file mode 100644
index 78237c85a..000000000
--- a/plugins/field-colour/src/blocks/colourBlend.ts
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {Block, common as BlocklyCommon} from 'blockly/core';
-import {
- JavascriptGenerator,
- Order as JavascriptOrder,
-} from 'blockly/javascript';
-import {DartGenerator, Order as DartOrder} from 'blockly/dart';
-import {LuaGenerator, Order as LuaOrder} from 'blockly/lua';
-import {PhpGenerator, Order as PhpOrder} from 'blockly/php';
-import {PythonGenerator, Order as PythonOrder} from 'blockly/python';
-import {registerFieldColour} from '../field_colour';
-import {Generators} from './generatorsType';
-
-/** The name this block is registered under. */
-export const BLOCK_NAME = 'colour_blend';
-
-// Block for blending two colours together.
-const jsonDefinition = {
- type: BLOCK_NAME,
- message0:
- '%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} ' +
- '%1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3',
- args0: [
- {
- type: 'input_value',
- name: 'COLOUR1',
- check: 'Colour',
- align: 'RIGHT',
- },
- {
- type: 'input_value',
- name: 'COLOUR2',
- check: 'Colour',
- align: 'RIGHT',
- },
- {
- type: 'input_value',
- name: 'RATIO',
- check: 'Number',
- align: 'RIGHT',
- },
- ],
- output: 'Colour',
- helpUrl: '%{BKY_COLOUR_BLEND_HELPURL}',
- style: 'colour_blocks',
- tooltip: '%{BKY_COLOUR_BLEND_TOOLTIP}',
-};
-
-/**
- * Javascript block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The JavascriptGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toJavascript(
- block: Block,
- generator: JavascriptGenerator,
-): [string, JavascriptOrder] {
- // Blend two colours together.
- const colour1 =
- generator.valueToCode(block, 'COLOUR1', JavascriptOrder.NONE) ||
- "'#000000'";
- const colour2 =
- generator.valueToCode(block, 'COLOUR2', JavascriptOrder.NONE) ||
- "'#000000'";
- const ratio =
- generator.valueToCode(block, 'RATIO', JavascriptOrder.NONE) || 0.5;
- const functionName = generator.provideFunction_(
- 'colourBlend',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}(c1, c2, ratio) {
- ratio = Math.max(Math.min(Number(ratio), 1), 0);
- var r1 = parseInt(c1.substring(1, 3), 16);
- var g1 = parseInt(c1.substring(3, 5), 16);
- var b1 = parseInt(c1.substring(5, 7), 16);
- var r2 = parseInt(c2.substring(1, 3), 16);
- var g2 = parseInt(c2.substring(3, 5), 16);
- var b2 = parseInt(c2.substring(5, 7), 16);
- var r = Math.round(r1 * (1 - ratio) + r2 * ratio);
- var g = Math.round(g1 * (1 - ratio) + g2 * ratio);
- var b = Math.round(b1 * (1 - ratio) + b2 * ratio);
- r = ('0' + (r || 0).toString(16)).slice(-2);
- g = ('0' + (g || 0).toString(16)).slice(-2);
- b = ('0' + (b || 0).toString(16)).slice(-2);
- return '#' + r + g + b;
-}
-`,
- );
- const code = `${functionName}(${colour1}, ${colour2}, ${ratio})`;
- return [code, JavascriptOrder.FUNCTION_CALL];
-}
-
-/**
- * Dart block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The DartGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toDart(
- block: Block,
- generator: DartGenerator,
-): [string, DartOrder] {
- // Blend two colours together.
- const colour1 =
- generator.valueToCode(block, 'COLOUR1', DartOrder.NONE) || "'#000000'";
- const colour2 =
- generator.valueToCode(block, 'COLOUR2', DartOrder.NONE) || "'#000000'";
- const ratio = generator.valueToCode(block, 'RATIO', DartOrder.NONE) || 0.5;
-
- // TODO(#7600): find better approach than casting to any to override
- // CodeGenerator declaring .definitions protected.
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (generator as any).definitions_['import_dart_math'] =
- "import 'dart:math' as Math;";
- const functionName = generator.provideFunction_(
- 'colour_blend',
- `
-String ${generator.FUNCTION_NAME_PLACEHOLDER_}(String c1, String c2, num ratio) {
- ratio = Math.max(Math.min(ratio, 1), 0);
- int r1 = int.parse('0x\${c1.substring(1, 3)}');
- int g1 = int.parse('0x\${c1.substring(3, 5)}');
- int b1 = int.parse('0x\${c1.substring(5, 7)}');
- int r2 = int.parse('0x\${c2.substring(1, 3)}');
- int g2 = int.parse('0x\${c2.substring(3, 5)}');
- int b2 = int.parse('0x\${c2.substring(5, 7)}');
- num rn = (r1 * (1 - ratio) + r2 * ratio).round();
- String rs = rn.toInt().toRadixString(16);
- num gn = (g1 * (1 - ratio) + g2 * ratio).round();
- String gs = gn.toInt().toRadixString(16);
- num bn = (b1 * (1 - ratio) + b2 * ratio).round();
- String bs = bn.toInt().toRadixString(16);
- rs = '0$rs';
- rs = rs.substring(rs.length - 2);
- gs = '0$gs';
- gs = gs.substring(gs.length - 2);
- bs = '0$bs';
- bs = bs.substring(bs.length - 2);
- return '#$rs$gs$bs';
-}
-`,
- );
- const code = `${functionName}(${colour1}, ${colour2}, ${ratio})`;
- return [code, DartOrder.UNARY_POSTFIX];
-}
-
-/**
- * Lua generator definition.
- *
- * @param block The Block instance to generate code for.
- * @param generator The LuaGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toLua(
- block: Block,
- generator: LuaGenerator,
-): [string, LuaOrder] {
- // Blend two colours together.
- const functionName = generator.provideFunction_(
- 'colour_blend',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}(colour1, colour2, ratio)
- local r1 = tonumber(string.sub(colour1, 2, 3), 16)
- local r2 = tonumber(string.sub(colour2, 2, 3), 16)
- local g1 = tonumber(string.sub(colour1, 4, 5), 16)
- local g2 = tonumber(string.sub(colour2, 4, 5), 16)
- local b1 = tonumber(string.sub(colour1, 6, 7), 16)
- local b2 = tonumber(string.sub(colour2, 6, 7), 16)
- local ratio = math.min(1, math.max(0, ratio))
- local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)
- local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)
- local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)
- return string.format("#%02x%02x%02x", r, g, b)
-end
-`,
- );
- const colour1 =
- generator.valueToCode(block, 'COLOUR1', LuaOrder.NONE) || "'#000000'";
- const colour2 =
- generator.valueToCode(block, 'COLOUR2', LuaOrder.NONE) || "'#000000'";
- const ratio = generator.valueToCode(block, 'RATIO', LuaOrder.NONE) || 0;
- const code = `${functionName}(${colour1}, ${colour2}, ${ratio})`;
- return [code, LuaOrder.HIGH];
-}
-
-/**
- * PHP generator definition.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PhpGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPhp(
- block: Block,
- generator: PhpGenerator,
-): [string, PhpOrder] {
- // Blend two colours together.
- const colour1 =
- generator.valueToCode(block, 'COLOUR1', PhpOrder.NONE) || "'#000000'";
- const colour2 =
- generator.valueToCode(block, 'COLOUR2', PhpOrder.NONE) || "'#000000'";
- const ratio = generator.valueToCode(block, 'RATIO', PhpOrder.NONE) || 0.5;
- const functionName = generator.provideFunction_(
- 'colour_blend',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}($c1, $c2, $ratio) {
- $ratio = max(min($ratio, 1), 0);
- $r1 = hexdec(substr($c1, 1, 2));
- $g1 = hexdec(substr($c1, 3, 2));
- $b1 = hexdec(substr($c1, 5, 2));
- $r2 = hexdec(substr($c2, 1, 2));
- $g2 = hexdec(substr($c2, 3, 2));
- $b2 = hexdec(substr($c2, 5, 2));
- $r = round($r1 * (1 - $ratio) + $r2 * $ratio);
- $g = round($g1 * (1 - $ratio) + $g2 * $ratio);
- $b = round($b1 * (1 - $ratio) + $b2 * $ratio);
- $hex = '#';
- $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
- return $hex;
-}
-`,
- );
- const code = `${functionName}(${colour1}, ${colour2}, ${ratio})`;
- return [code, PhpOrder.FUNCTION_CALL];
-}
-
-/**
- * Python generator definition.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PythonGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPython(
- block: Block,
- generator: PythonGenerator,
-): [string, PythonOrder] {
- // Blend two colours together.
- const functionName = generator.provideFunction_(
- 'colour_blend',
- `
-def ${generator.FUNCTION_NAME_PLACEHOLDER_}(colour1, colour2, ratio):
- r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)
- g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)
- b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)
- ratio = min(1, max(0, ratio))
- r = round(r1 * (1 - ratio) + r2 * ratio)
- g = round(g1 * (1 - ratio) + g2 * ratio)
- b = round(b1 * (1 - ratio) + b2 * ratio)
- return '#%02x%02x%02x' % (r, g, b)
-`,
- );
- const colour1 =
- generator.valueToCode(block, 'COLOUR1', PythonOrder.NONE) || "'#000000'";
- const colour2 =
- generator.valueToCode(block, 'COLOUR2', PythonOrder.NONE) || "'#000000'";
- const ratio = generator.valueToCode(block, 'RATIO', PythonOrder.NONE) || 0;
- const code = `${functionName}(${colour1}, ${colour2}, ${ratio})`;
- return [code, PythonOrder.FUNCTION_CALL];
-}
-
-const definitionsDict = BlocklyCommon.createBlockDefinitionsFromJsonArray([
- jsonDefinition,
-]);
-
-/** The colour_blend BlockDefinition. */
-export const blockDefinition = definitionsDict[BLOCK_NAME];
-
-/**
- * Install the `colour_blend` block and all of its dependencies.
- *
- * @param gens The CodeGenerators to install per-block
- * generators on.
- */
-export function installBlock(gens: Generators = {}) {
- registerFieldColour();
- BlocklyCommon.defineBlocks(definitionsDict);
- if (gens.javascript) gens.javascript.forBlock[BLOCK_NAME] = toJavascript;
- if (gens.dart) {
- gens.dart.forBlock[BLOCK_NAME] = toDart;
- gens.dart.addReservedWords('Math');
- }
- if (gens.lua) gens.lua.forBlock[BLOCK_NAME] = toLua;
- if (gens.php) gens.php.forBlock[BLOCK_NAME] = toPhp;
- if (gens.python) gens.python.forBlock[BLOCK_NAME] = toPython;
-}
diff --git a/plugins/field-colour/src/blocks/colourPicker.ts b/plugins/field-colour/src/blocks/colourPicker.ts
deleted file mode 100644
index 23c6fcc95..000000000
--- a/plugins/field-colour/src/blocks/colourPicker.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {Block, common as BlocklyCommon} from 'blockly/core';
-import {
- JavascriptGenerator,
- Order as JavascriptOrder,
-} from 'blockly/javascript';
-import {DartGenerator, Order as DartOrder} from 'blockly/dart';
-import {LuaGenerator, Order as LuaOrder} from 'blockly/lua';
-import {PhpGenerator, Order as PhpOrder} from 'blockly/php';
-import {PythonGenerator, Order as PythonOrder} from 'blockly/python';
-import {registerFieldColour} from '../field_colour';
-import {Generators} from './generatorsType';
-
-/** The name this block is registered under. */
-export const BLOCK_NAME = 'colour_picker';
-
-// Block for colour picker.
-const jsonDefinition = {
- type: BLOCK_NAME,
- message0: '%1',
- args0: [
- {
- type: 'field_colour',
- name: 'COLOUR',
- colour: '#ff0000',
- },
- ],
- output: 'Colour',
- helpUrl: '%{BKY_COLOUR_PICKER_HELPURL}',
- style: 'colour_blocks',
- tooltip: '%{BKY_COLOUR_PICKER_TOOLTIP}',
- extensions: ['parent_tooltip_when_inline'],
-};
-
-/**
- * Javascript block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The JavascriptGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toJavascript(
- block: Block,
- generator: JavascriptGenerator,
-): [string, JavascriptOrder] {
- // Colour picker.
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, JavascriptOrder.ATOMIC];
-}
-
-/**
- * Dart block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The DartGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toDart(
- block: Block,
- generator: DartGenerator,
-): [string, DartOrder] {
- // Colour picker.
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, DartOrder.ATOMIC];
-}
-
-/**
- * Lua block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The LuaGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toLua(
- block: Block,
- generator: LuaGenerator,
-): [string, LuaOrder] {
- // Colour picker.
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, LuaOrder.ATOMIC];
-}
-
-/**
- * PHP block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PhpGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPhp(
- block: Block,
- generator: PhpGenerator,
-): [string, PhpOrder] {
- // Colour picker.
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, PhpOrder.ATOMIC];
-}
-
-/**
- * Python block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PythonGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPython(
- block: Block,
- generator: PythonGenerator,
-): [string, PythonOrder] {
- // Colour picker.
- const code = generator.quote_(block.getFieldValue('COLOUR'));
- return [code, PythonOrder.ATOMIC];
-}
-
-const definitionsDict = BlocklyCommon.createBlockDefinitionsFromJsonArray([
- jsonDefinition,
-]);
-
-/** The colour_picker BlockDefinition. */
-export const blockDefinition = definitionsDict[BLOCK_NAME];
-
-/**
- * Install the `colour_picker` block and all of its dependencies.
- *
- * @param gens The CodeGenerators to install per-block
- * generators on.
- */
-export function installBlock(gens: Generators = {}) {
- registerFieldColour();
- BlocklyCommon.defineBlocks(definitionsDict);
- if (gens.javascript) gens.javascript.forBlock[BLOCK_NAME] = toJavascript;
- if (gens.dart) gens.dart.forBlock[BLOCK_NAME] = toDart;
- if (gens.lua) gens.lua.forBlock[BLOCK_NAME] = toLua;
- if (gens.php) gens.php.forBlock[BLOCK_NAME] = toPhp;
- if (gens.python) gens.python.forBlock[BLOCK_NAME] = toPython;
-}
diff --git a/plugins/field-colour/src/blocks/colourRandom.ts b/plugins/field-colour/src/blocks/colourRandom.ts
deleted file mode 100644
index 687ab0216..000000000
--- a/plugins/field-colour/src/blocks/colourRandom.ts
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {Block, common as BlocklyCommon} from 'blockly/core';
-import {
- JavascriptGenerator,
- Order as JavascriptOrder,
-} from 'blockly/javascript';
-import {DartGenerator, Order as DartOrder} from 'blockly/dart';
-import {LuaGenerator, Order as LuaOrder} from 'blockly/lua';
-import {PhpGenerator, Order as PhpOrder} from 'blockly/php';
-import {PythonGenerator, Order as PythonOrder} from 'blockly/python';
-import {registerFieldColour} from '../field_colour';
-import {Generators} from './generatorsType';
-
-/** The name this block is registered under. */
-export const BLOCK_NAME = 'colour_random';
-
-// Block for random colour.
-const jsonDefinition = {
- type: BLOCK_NAME,
- message0: '%{BKY_COLOUR_RANDOM_TITLE}',
- output: 'Colour',
- helpUrl: '%{BKY_COLOUR_RANDOM_HELPURL}',
- style: 'colour_blocks',
- tooltip: '%{BKY_COLOUR_RANDOM_TOOLTIP}',
-};
-
-/**
- * Javascript block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The JavascriptGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toJavascript(
- block: Block,
- generator: JavascriptGenerator,
-): [string, JavascriptOrder] {
- // Generate a random colour.
- const functionName = generator.provideFunction_(
- 'colourRandom',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}() {
- var num = Math.floor(Math.random() * 0x1000000);
- return '#' + ('00000' + num.toString(16)).substr(-6);
-}
-`,
- );
- const code = functionName + '()';
- return [code, JavascriptOrder.FUNCTION_CALL];
-}
-
-/**
- * Dart block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The DartGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toDart(
- block: Block,
- generator: DartGenerator,
-): [string, DartOrder] {
- // Generate a random colour.
- // TODO(#7600): find better approach than casting to any to override
- // CodeGenerator declaring .definitions protected.
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (generator as any).definitions_['import_dart_math'] =
- "import 'dart:math' as Math;";
- const functionName = generator.provideFunction_(
- 'colour_random',
- `
-String ${generator.FUNCTION_NAME_PLACEHOLDER_}() {
- String hex = '0123456789abcdef';
- var rnd = new Math.Random();
- return '#\${hex[rnd.nextInt(16)]}\${hex[rnd.nextInt(16)]}'
- '\${hex[rnd.nextInt(16)]}\${hex[rnd.nextInt(16)]}'
- '\${hex[rnd.nextInt(16)]}\${hex[rnd.nextInt(16)]}';
-}
-`,
- );
- const code = functionName + '()';
- return [code, DartOrder.UNARY_POSTFIX];
-}
-
-/**
- * Lua block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The LuaGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toLua(
- block: Block,
- generator: LuaGenerator,
-): [string, LuaOrder] {
- // Generate a random colour.
- const code = 'string.format("#%06x", math.random(0, 2^24 - 1))';
- return [code, LuaOrder.HIGH];
-}
-
-/**
- * PHP block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PhpGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPhp(
- block: Block,
- generator: PhpGenerator,
-): [string, PhpOrder] {
- // Generate a random colour.
- const functionName = generator.provideFunction_(
- 'colour_random',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}() {
- return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
-}
-`,
- );
- const code = functionName + '()';
- return [code, PhpOrder.FUNCTION_CALL];
-}
-
-/**
- * Python block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PythonGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPython(
- block: Block,
- generator: PythonGenerator,
-): [string, PythonOrder] {
- // Generate a random colour.
- // TODO(#7600): find better approach than casting to any to override
- // CodeGenerator declaring .definitions protected.
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (generator as any).definitions_['import_random'] = 'import random';
- const code = "'#%06x' % random.randint(0, 2**24 - 1)";
- return [code, PythonOrder.FUNCTION_CALL];
-}
-
-const definitionsDict = BlocklyCommon.createBlockDefinitionsFromJsonArray([
- jsonDefinition,
-]);
-
-/** The colour_random BlockDefinition. */
-export const blockDefinition = definitionsDict[BLOCK_NAME];
-
-/**
- * Install the `colour_picker` block and all of its dependencies.
- *
- * @param gens The CodeGenerators to install per-block
- * generators on.
- */
-export function installBlock(gens: Generators = {}) {
- registerFieldColour();
- BlocklyCommon.defineBlocks(definitionsDict);
- if (gens.javascript) gens.javascript.forBlock[BLOCK_NAME] = toJavascript;
- if (gens.dart) gens.dart.forBlock[BLOCK_NAME] = toDart;
- if (gens.lua) gens.lua.forBlock[BLOCK_NAME] = toLua;
- if (gens.php) gens.php.forBlock[BLOCK_NAME] = toPhp;
- if (gens.python) gens.python.forBlock[BLOCK_NAME] = toPython;
-}
diff --git a/plugins/field-colour/src/blocks/colourRgb.ts b/plugins/field-colour/src/blocks/colourRgb.ts
deleted file mode 100644
index 46ee55045..000000000
--- a/plugins/field-colour/src/blocks/colourRgb.ts
+++ /dev/null
@@ -1,249 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {Block, common as BlocklyCommon} from 'blockly/core';
-import {
- JavascriptGenerator,
- Order as JavascriptOrder,
-} from 'blockly/javascript';
-import {DartGenerator, Order as DartOrder} from 'blockly/dart';
-import {LuaGenerator, Order as LuaOrder} from 'blockly/lua';
-import {PhpGenerator, Order as PhpOrder} from 'blockly/php';
-import {PythonGenerator, Order as PythonOrder} from 'blockly/python';
-import {registerFieldColour} from '../field_colour';
-import {Generators} from './generatorsType';
-
-/** The name this block is registered under. */
-export const BLOCK_NAME = 'colour_rgb';
-
-// Block for composing a colour from RGB components.
-const jsonDefinition = {
- type: BLOCK_NAME,
- message0:
- '%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3',
- args0: [
- {
- type: 'input_value',
- name: 'RED',
- check: 'Number',
- align: 'RIGHT',
- },
- {
- type: 'input_value',
- name: 'GREEN',
- check: 'Number',
- align: 'RIGHT',
- },
- {
- type: 'input_value',
- name: 'BLUE',
- check: 'Number',
- align: 'RIGHT',
- },
- ],
- output: 'Colour',
- helpUrl: '%{BKY_COLOUR_RGB_HELPURL}',
- style: 'colour_blocks',
- tooltip: '%{BKY_COLOUR_RGB_TOOLTIP}',
-};
-
-/**
- * Javascript block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The JavascriptGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toJavascript(
- block: Block,
- generator: JavascriptGenerator,
-): [string, JavascriptOrder] {
- // Compose a colour from RGB components expressed as percentages.
- const red = generator.valueToCode(block, 'RED', JavascriptOrder.NONE) || 0;
- const green =
- generator.valueToCode(block, 'GREEN', JavascriptOrder.NONE) || 0;
- const blue = generator.valueToCode(block, 'BLUE', JavascriptOrder.NONE) || 0;
- const functionName = generator.provideFunction_(
- 'colourRgb',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}(r, g, b) {
- r = Math.max(Math.min(Number(r), 100), 0) * 2.55;
- g = Math.max(Math.min(Number(g), 100), 0) * 2.55;
- b = Math.max(Math.min(Number(b), 100), 0) * 2.55;
- r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);
- g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);
- b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);
- return '#' + r + g + b;
-}
-`,
- );
- const code = `${functionName}(${red}, ${green}, ${blue})`;
- return [code, JavascriptOrder.FUNCTION_CALL];
-}
-
-/**
- * Dart block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The DartGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toDart(
- block: Block,
- generator: DartGenerator,
-): [string, DartOrder] {
- // Compose a colour from RGB components expressed as percentages.
- const red = generator.valueToCode(block, 'RED', DartOrder.NONE) || 0;
- const green = generator.valueToCode(block, 'GREEN', DartOrder.NONE) || 0;
- const blue = generator.valueToCode(block, 'BLUE', DartOrder.NONE) || 0;
-
- // TODO(#7600): find better approach than casting to any to override
- // CodeGenerator declaring .definitions protected.
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- (generator as any).definitions_['import_dart_math'] =
- "import 'dart:math' as Math;";
- const functionName = generator.provideFunction_(
- 'colour_rgb',
- `
-String ${generator.FUNCTION_NAME_PLACEHOLDER_}(num r, num g, num b) {
- num rn = (Math.max(Math.min(r, 100), 0) * 2.55).round();
- String rs = rn.toInt().toRadixString(16);
- rs = '0$rs';
- rs = rs.substring(rs.length - 2);
- num gn = (Math.max(Math.min(g, 100), 0) * 2.55).round();
- String gs = gn.toInt().toRadixString(16);
- gs = '0$gs';
- gs = gs.substring(gs.length - 2);
- num bn = (Math.max(Math.min(b, 100), 0) * 2.55).round();
- String bs = bn.toInt().toRadixString(16);
- bs = '0$bs';
- bs = bs.substring(bs.length - 2);
- return '#$rs$gs$bs';
-}
-`,
- );
- const code = `${functionName}(${red}, ${green}, ${blue})`;
- return [code, DartOrder.UNARY_POSTFIX];
-}
-
-/**
- * Lua block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The LuaGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toLua(
- block: Block,
- generator: LuaGenerator,
-): [string, LuaOrder] {
- // Compose a colour from RGB components expressed as percentages.
- const functionName = generator.provideFunction_(
- 'colour_rgb',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}(r, g, b)
- r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)
- g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)
- b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)
- return string.format("#%02x%02x%02x", r, g, b)
-end
-`,
- );
- const red = generator.valueToCode(block, 'RED', LuaOrder.NONE) || 0;
- const green = generator.valueToCode(block, 'GREEN', LuaOrder.NONE) || 0;
- const blue = generator.valueToCode(block, 'BLUE', LuaOrder.NONE) || 0;
- const code = `${functionName}(${red}, ${green}, ${blue})`;
- return [code, LuaOrder.HIGH];
-}
-
-/**
- * PHP block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PhpGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPhp(
- block: Block,
- generator: PhpGenerator,
-): [string, PhpOrder] {
- // Compose a colour from RGB components expressed as percentages.
- const red = generator.valueToCode(block, 'RED', PhpOrder.NONE) || 0;
- const green = generator.valueToCode(block, 'GREEN', PhpOrder.NONE) || 0;
- const blue = generator.valueToCode(block, 'BLUE', PhpOrder.NONE) || 0;
- const functionName = generator.provideFunction_(
- 'colour_rgb',
- `
-function ${generator.FUNCTION_NAME_PLACEHOLDER_}($r, $g, $b) {
- $r = round(max(min($r, 100), 0) * 2.55);
- $g = round(max(min($g, 100), 0) * 2.55);
- $b = round(max(min($b, 100), 0) * 2.55);
- $hex = '#';
- $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
- return $hex;
-}
-`,
- );
- const code = `${functionName}(${red}, ${green}, ${blue})`;
- return [code, PhpOrder.FUNCTION_CALL];
-}
-
-/**
- * Python block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PythonGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPython(
- block: Block,
- generator: PythonGenerator,
-): [string, PythonOrder] {
- // Compose a colour from RGB components expressed as percentages.
- const functionName = generator.provideFunction_(
- 'colour_rgb',
- `
-def ${generator.FUNCTION_NAME_PLACEHOLDER_}(r, g, b):
- r = round(min(100, max(0, r)) * 2.55)
- g = round(min(100, max(0, g)) * 2.55)
- b = round(min(100, max(0, b)) * 2.55)
- return '#%02x%02x%02x' % (r, g, b)
-`,
- );
- const r = generator.valueToCode(block, 'RED', PythonOrder.NONE) || 0;
- const g = generator.valueToCode(block, 'GREEN', PythonOrder.NONE) || 0;
- const b = generator.valueToCode(block, 'BLUE', PythonOrder.NONE) || 0;
- const code = functionName + '(' + r + ', ' + g + ', ' + b + ')';
- return [code, PythonOrder.FUNCTION_CALL];
-}
-
-const definitionsDict = BlocklyCommon.createBlockDefinitionsFromJsonArray([
- jsonDefinition,
-]);
-
-/** The colour_rgb BlockDefinition. */
-export const blockDefinition = definitionsDict[BLOCK_NAME];
-
-/**
- * Install the `colour_rgb` block and all of its dependencies.
- *
- * @param gens The CodeGenerators to install per-block
- * generators on.
- */
-export function installBlock(gens: Generators = {}) {
- registerFieldColour();
- BlocklyCommon.defineBlocks(definitionsDict);
- if (gens.javascript) gens.javascript.forBlock[BLOCK_NAME] = toJavascript;
- if (gens.dart) {
- gens.dart.forBlock[BLOCK_NAME] = toDart;
- gens.dart.addReservedWords('Math');
- }
- if (gens.lua) gens.lua.forBlock[BLOCK_NAME] = toLua;
- if (gens.php) gens.php.forBlock[BLOCK_NAME] = toPhp;
- if (gens.python) gens.python.forBlock[BLOCK_NAME] = toPython;
-}
diff --git a/plugins/field-colour/src/blocks/generatorsType.ts b/plugins/field-colour/src/blocks/generatorsType.ts
deleted file mode 100644
index e9d2df460..000000000
--- a/plugins/field-colour/src/blocks/generatorsType.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import type {JavascriptGenerator} from 'blockly/javascript';
-import type {DartGenerator} from 'blockly/dart';
-import type {LuaGenerator} from 'blockly/lua';
-import type {PhpGenerator} from 'blockly/php';
-import type {PythonGenerator} from 'blockly/python';
-
-/**
- * An object containing zero or more generators. This is passed
- * to block installation functions so that they may install
- * per-block generators on any languages they support.
- */
-export interface Generators {
- javascript?: JavascriptGenerator;
- dart?: DartGenerator;
- lua?: LuaGenerator;
- php?: PhpGenerator;
- python?: PythonGenerator;
-}
diff --git a/plugins/field-colour/src/field_colour.ts b/plugins/field-colour/src/field_colour.ts
deleted file mode 100644
index adb3396de..000000000
--- a/plugins/field-colour/src/field_colour.ts
+++ /dev/null
@@ -1,524 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Colour input field.
- */
-
-import * as Blockly from 'blockly/core';
-import {
- FieldGridDropdown,
- FieldGridDropdownConfig,
- FieldGridDropdownFromJsonConfig,
-} from '@blockly/field-grid-dropdown';
-
-/* eslint-disable @typescript-eslint/naming-convention */
-/**
- * An array of colour strings for the palette.
- * Copied from goog.ui.ColorPicker.SIMPLE_GRID_COLORS
- */
-const DEFAULT_COLOURS: Record = {
- // greys
- '#ffffff': 'White',
- '#cccccc': 'Light Grey',
- '#c0c0c0': 'Silver',
- '#999999': 'Grey',
- '#666666': 'Dark Grey',
- '#333333': 'Charcoal',
- '#000000': 'Black',
- // reds
- '#ffcccc': 'Pale Red',
- '#ff6666': 'Light Red',
- '#ff0000': 'Red',
- '#cc0000': 'Dark Red',
- '#990000': 'Darker Red',
- '#660000': 'Maroon',
- '#330000': 'Darkest Red',
- // oranges
- '#ffcc99': 'Peach',
- '#ff9966': 'Light Orange',
- '#ff9900': 'Orange',
- '#ff6600': 'Bright Orange',
- '#cc6600': 'Dark Orange',
- '#993300': 'Rust',
- '#663300': 'Brown',
- // yellows
- '#ffff99': 'Light Yellow',
- '#ffff66': 'Pale Yellow',
- '#ffcc66': 'Light Gold',
- '#ffcc33': 'Gold',
- '#cc9933': 'Goldenrod',
- '#996633': 'Light Brown',
- '#663333': 'Dark Brown',
- // olives
- '#ffffcc': 'Cream',
- '#ffff33': 'Bright Yellow',
- '#ffff00': 'Yellow',
- '#ffcc00': 'Amber',
- '#999900': 'Olive',
- '#666600': 'Dark Olive',
- '#333300': 'Darkest Olive',
- // greens
- '#99ff99': 'Light Green',
- '#66ff99': 'Mint',
- '#33ff33': 'Bright Green',
- '#33cc00': 'Green',
- '#009900': 'Dark Green',
- '#006600': 'Darker Green',
- '#003300': 'Darkest Green',
- // turquoises
- '#99ffff': 'Pale Cyan',
- '#33ffff': 'Bright Cyan',
- '#66cccc': 'Light Teal',
- '#00cccc': 'Turquoise',
- '#339999': 'Teal',
- '#336666': 'Dark Teal',
- '#003333': 'Darkest Teal',
- // blues
- '#ccffff': 'Pale Aqua',
- '#66ffff': 'Light Cyan',
- '#33ccff': 'Sky Blue',
- '#3366ff': 'Blue',
- '#3333ff': 'Bright Blue',
- '#000099': 'Dark Blue',
- '#000066': 'Navy',
- // purples
- '#ccccff': 'Pale Periwinkle',
- '#9999ff': 'Periwinkle',
- '#6666cc': 'Slate Blue',
- '#6633ff': 'Violet',
- '#6600cc': 'Purple',
- '#333399': 'Indigo',
- '#330099': 'Dark Indigo',
- // violets
- '#ffccff': 'Pale Magenta',
- '#ff99ff': 'Light Magenta',
- '#cc66cc': 'Orchid',
- '#cc33cc': 'Magenta',
- '#993399': 'Dark Magenta',
- '#663366': 'Plum',
- '#330033': 'Darkest Purple',
-};
-/* eslint-enable @typescript-eslint/naming-convention */
-
-/**
- * Class for a colour input field.
- */
-export class FieldColour extends FieldGridDropdown {
- /**
- * Used to tell if the field needs to be rendered the next time the block is
- * rendered. Colour fields are statically sized, and only need to be
- * rendered at initialization.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override isDirty_ = false;
-
- protected override ariaTypeName = Blockly.Msg['ARIA_TYPE_FIELD_COLOUR'];
-
- /**
- * @param value The initial value of the field. Should be in '#rrggbb'
- * format. Defaults to the first value in the default colour array. Also
- * accepts Field.SKIP_SETUP if you wish to skip setup (only used by
- * subclasses that want to handle configuration and setting the field
- * value after their own constructors have run).
- * @param validator A function that is called to validate changes to the
- * field's value. Takes in a colour string & returns a validated colour
- * string ('#rrggbb' format), or null to abort the change.
- * @param config A map of options used to configure the field.
- * See the [field creation documentation]{@link
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/colour}
- * for a list of properties this parameter supports.
- */
- constructor(
- value?: string | typeof Blockly.Field.SKIP_SETUP,
- validator?: FieldColourValidator,
- config?: FieldColourConfig,
- ) {
- const swatches = makeSwatches(
- config?.colourOptions ?? Object.keys(DEFAULT_COLOURS),
- config?.colourTitles,
- );
- super(swatches, validator, {...config, columns: config?.columns ?? 7});
-
- if (value === Blockly.Field.SKIP_SETUP) return;
- this.setValue(value);
- }
-
- /**
- * FieldDropdown has complex behaviors for normalizing options that aren't
- * applicable here. Instead, just return the options as-is.
- *
- * @param options The options (colour swatches) to normalize.
- * @returns The colour swatches as-is.
- */
- protected override trimOptions(options: Blockly.MenuOption[]) {
- return {options};
- }
-
- /**
- * Configure the field based on the given map of options.
- *
- * @param config A map of options to configure the field based on.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override configure_(config: FieldColourConfig) {
- super.configure_(config);
- if (config.colourOptions) {
- this.setColours(config.colourOptions, config.colourTitles);
- }
- }
-
- /**
- * Create the block UI for this colour field.
- *
- * @internal
- */
- override initView() {
- const constants = this.getConstants();
- // This can't happen, but TypeScript thinks it can and lint forbids `!.`.
- if (!constants) throw Error('Constants not found');
- this.size_ = new Blockly.utils.Size(
- constants.FIELD_COLOUR_DEFAULT_WIDTH,
- constants.FIELD_COLOUR_DEFAULT_HEIGHT,
- );
- if (this.isFullBlockField()) {
- this.clickTarget_ = (this.sourceBlock_ as Blockly.BlockSvg).getSvgRoot();
- } else {
- this.createBorderRect_();
- this.getBorderRect().style['fillOpacity'] = '1';
- }
-
- if (this.fieldGroup_) {
- this.fieldGroup_.classList.add('blocklyField');
- }
-
- this.recomputeAriaContext();
- }
-
- /**
- * Shows the colour picker dropdown attached to the field.
- *
- * @param e The event that triggered display of the colour picker dropdown.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override showEditor_(e?: MouseEvent) {
- super.showEditor_(e);
- Blockly.DropDownDiv.getContentDiv().classList.add('blocklyFieldColour');
- Blockly.DropDownDiv.repositionForWindowResize();
- }
-
- /**
- * Defines whether this field should take up the full block or not.
- *
- * @returns True if this field should take up the full block. False otherwise.
- */
- override isFullBlockField(): boolean {
- const block = this.getSourceBlock();
- if (!block) throw new Blockly.UnattachedFieldError();
-
- const constants = this.getConstants();
- return (
- this.blockIsSimpleReporter() &&
- Boolean(constants?.FIELD_COLOUR_FULL_BLOCK)
- );
- }
-
- /**
- * @returns True if the source block is a value block with a single editable
- * field.
- * @internal
- */
- blockIsSimpleReporter(): boolean {
- const block = this.getSourceBlock();
- if (!block) throw new Blockly.UnattachedFieldError();
-
- if (!block.outputConnection) return false;
-
- for (const input of block.inputList) {
- if (input.connection || input.fieldRow.length > 1) return false;
- }
- return true;
- }
-
- /**
- * Updates text field to match the colour/style of the block.
- *
- * @internal
- */
- override applyColour() {
- const block = this.getSourceBlock() as Blockly.BlockSvg | null;
- if (!block) throw new Blockly.UnattachedFieldError();
-
- if (!this.fieldGroup_) return;
-
- const borderRect = this.borderRect_;
-
- if (!this.isFullBlockField()) {
- if (!borderRect) {
- throw new Error('The border rect has not been initialized');
- }
- borderRect.style.display = 'block';
- borderRect.style.fill = this.getValue() as string;
- } else {
- // In general, do *not* let fields control the color of blocks. Having the
- // field control the color is unexpected, and could have performance
- // impacts.
- block.pathObject.svgPath.setAttribute('fill', this.getValue() as string);
- }
- this.recomputeAriaContext();
- }
-
- /**
- * Returns the height and width of the field.
- *
- * This should *in general* be the only place render_ gets called from.
- *
- * @returns Height and width.
- */
- override getSize(): Blockly.utils.Size {
- if (this.getConstants()?.FIELD_COLOUR_FULL_BLOCK) {
- // In general, do *not* let fields control the color of blocks. Having the
- // field control the color is unexpected, and could have performance
- // impacts.
- // Full block fields have more control of the block than they should
- // (i.e. updating fill colour) so they always need to be rerendered.
- this.render_();
- this.isDirty_ = false;
- }
- return super.getSize();
- }
-
- /**
- * Updates the colour of the block to reflect whether this is a full
- * block field or not.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override render_() {
- this.updateSize_();
-
- const block = this.getSourceBlock() as Blockly.BlockSvg | null;
- if (!block) throw new Blockly.UnattachedFieldError();
- // Calling applyColour updates the UI (full-block vs non-full-block) for the
- // colour field, and the colour of the field/block.
- block.applyColour();
- }
-
- /**
- * Updates the size of the field based on whether it is a full block field
- * or not.
- *
- * @param margin margin to use when positioning the field.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected updateSize_(margin?: number) {
- const constants = this.getConstants();
- if (!constants) return;
- let totalWidth;
- let totalHeight;
- if (this.isFullBlockField()) {
- const xOffset = margin ?? 0;
- totalWidth = xOffset * 2;
- totalHeight = constants.FIELD_TEXT_HEIGHT;
- } else {
- totalWidth = constants.FIELD_COLOUR_DEFAULT_WIDTH;
- totalHeight = constants.FIELD_COLOUR_DEFAULT_HEIGHT;
- }
-
- this.size_.height = totalHeight;
- this.size_.width = totalWidth;
-
- this.positionBorderRect_();
- }
-
- /**
- * Ensure that the input value is a valid colour.
- *
- * @param newValue The input value.
- * @returns A valid colour, or null if invalid.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue: string,
- ): string | null | undefined;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(newValue?: string): string | null;
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doClassValidation_(
- newValue?: string,
- ): string | null | undefined {
- if (typeof newValue !== 'string') {
- return null;
- }
- return Blockly.utils.colour.parse(newValue);
- }
-
- /**
- * Get the text for this field. Used when the block is collapsed.
- *
- * @returns Text representing the value of this field.
- */
- override getText(): string {
- let colour = this.value_ as string;
- // Try to use #rgb format if possible, rather than #rrggbb.
- if (/^#(.)\1(.)\2(.)\3$/.test(colour)) {
- colour = '#' + colour[1] + colour[3] + colour[5];
- }
- return colour;
- }
-
- /**
- * Set a custom colour grid for this field.
- *
- * @param colours Array of colours for this block, or null to use default
- * (FieldColour.COLOURS).
- * @param titles Optional array of colour tooltips, or null to use default
- * (FieldColour.TITLES).
- * @returns Returns itself (for method chaining).
- */
- setColours(colours: string[], titles?: string[]): FieldColour {
- const swatches = makeSwatches(colours, titles);
- this.setOptions(swatches);
- return this;
- }
-
- /**
- * Construct a FieldColour from a JSON arg object.
- *
- * @param options A JSON object with options (colour).
- * @returns The new field instance.
- * @nocollapse
- * @internal
- */
- static fromJson(options: FieldColourFromJsonConfig): FieldColour {
- // `this` might be a subclass of FieldColour if that class doesn't override
- // the static fromJson method.
- return new this(options.colour, undefined, options);
- }
-}
-
-/**
- * Creates a set of divs representing colour swatches for use in the picker.
- *
- * @param colours An array of colours to create swatches for. The colours must
- * be any legal CSS colour specifier.
- * @param titles A corresponding array of titles to be displayed as tooltips on
- * the colour swatches.
- * @returns An array of pairs of DOM elements representing colour swatches and
- * their corresponding colour.
- */
-function makeSwatches(
- colours: string[],
- titles?: string[],
-): Blockly.MenuOption[] {
- return colours.map((colour, index) => {
- const swatch = document.createElement('div');
- swatch.className = 'blocklyColourSwatch';
- swatch.style.backgroundColor = colour;
-
- if (titles && index < titles.length) {
- swatch.title = titles[index];
- }
- return [swatch, colour, titles?.[index] ?? DEFAULT_COLOURS[colour]];
- });
-}
-
-/** The default value for this field. */
-FieldColour.prototype.DEFAULT_VALUE = '#ffffff';
-
-/**
- * Register the field and any dependencies.
- */
-export function registerFieldColour() {
- Blockly.fieldRegistry.register('field_colour', FieldColour);
-}
-
-/**
- * CSS for colour picker.
- */
-Blockly.Css.register(`
-.blocklyFieldColour .blocklyFieldGridItemSelected,
-.blocklyFieldGridItemSelected:hover {
- border-color: #eee !important;
- outline: 1px solid #333;
- position: relative;
-}
-
-.blocklyColourSwatch {
- width: 20px;
- height: 20px;
-}
-
-.blocklyGridContainer {
- padding: 0px;
-}
-
-.blocklyFieldColour .blocklyFieldGrid {
- grid-gap: 0px;
- row-gap: 4px;
-}
-
-.blocklyFieldColour .blocklyFieldGrid .blocklyGridItem {
- border-radius: 0;
- padding: 0;
- border: 0.5px solid #888;
- cursor: pointer;
-}
-
-.blocklyFieldColour .blocklyFieldGrid .blocklyFieldGridItem {
- border: 0.5px solid #888;
- padding: 0;
- margin: 0;
- border-radius: 0;
-}
-
-.blocklyFieldColour .blocklyFieldGrid .blocklyFieldGridItem:focus {
- border-color: #eee;
- box-shadow: 2px 2px 7px 2px rgba(0, 0, 0, 0.3);
- position: relative;
- border-radius: 0;
- outline: none;
-}
-
-.blocklyKeyboardNavigation .blocklyFieldColour .blocklyFieldGrid .blocklyFieldGridItem:focus {
- outline: var(--blockly-selection-width) solid var(--blockly-active-node-color);
- outline-offset: -2px;
- border: none;
- box-shadow: none;
- border-radius: 4px;
-}
-`);
-
-/**
- * Config options for the colour field.
- */
-export interface FieldColourConfig extends FieldGridDropdownConfig {
- colourOptions?: string[];
- colourTitles?: string[];
-}
-
-/**
- * fromJson config options for the colour field.
- */
-export interface FieldColourFromJsonConfig extends FieldGridDropdownFromJsonConfig {
- colour?: string;
-}
-
-/**
- * A function that is called to validate changes to the field's value before
- * they are set.
- *
- * @see {@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/validators#return_values}
- * @param newValue The value to be validated.
- * @returns One of three instructions for setting the new value: `T`, `null`,
- * or `undefined`.
- *
- * - `T` to set this function's returned value instead of `newValue`.
- *
- * - `null` to invoke `doValueInvalid_` and not set a value.
- *
- * - `undefined` to set `newValue` as is.
- */
-export type FieldColourValidator = Blockly.FieldValidator;
diff --git a/plugins/field-colour/src/index.ts b/plugins/field-colour/src/index.ts
deleted file mode 100644
index b0474b0b4..000000000
--- a/plugins/field-colour/src/index.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field_colour';
-
-import * as colourPicker from './blocks/colourPicker';
-import * as colourRandom from './blocks/colourRandom';
-import * as colourRgb from './blocks/colourRgb';
-import * as colourBlend from './blocks/colourBlend';
-import {Generators} from './blocks/generatorsType';
-
-// Re-export all parts of the definition.
-export * as colourPicker from './blocks/colourPicker';
-export * as colourRandom from './blocks/colourRandom';
-export * as colourRgb from './blocks/colourRgb';
-export * as colourBlend from './blocks/colourBlend';
-
-/**
- * Install all of the blocks defined in this file and all of their
- * dependencies.
- *
- * @param generators The CodeGenerators to install per-block
- * generators on.
- */
-export function installAllBlocks(generators: Generators = {}) {
- colourPicker.installBlock(generators);
- colourRgb.installBlock(generators);
- colourRandom.installBlock(generators);
- colourBlend.installBlock(generators);
-}
diff --git a/plugins/field-colour/test/blocks_test.mocha.js b/plugins/field-colour/test/blocks_test.mocha.js
deleted file mode 100644
index fea374f6e..000000000
--- a/plugins/field-colour/test/blocks_test.mocha.js
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import fs from 'fs';
-import * as Blockly from 'blockly/core';
-import 'blockly/blocks';
-
-import {javascriptGenerator} from 'blockly/javascript';
-import {dartGenerator} from 'blockly/dart';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-import {luaGenerator} from 'blockly/lua';
-import {installAllBlocks} from '../src/index';
-import {assert} from 'chai';
-
-const blockJson = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'colour_picker',
- x: 13,
- y: 13,
- fields: {
- COLOUR: '#ff0000',
- },
- },
- {
- type: 'colour_random',
- x: 13,
- y: 113,
- },
- {
- type: 'colour_rgb',
- x: 13,
- y: 263,
- inputs: {
- RED: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 0,
- },
- },
- },
- GREEN: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 1,
- },
- },
- },
- BLUE: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 20,
- },
- },
- },
- },
- },
- {
- type: 'colour_blend',
- x: 13,
- y: 363,
- inputs: {
- COLOUR1: {
- shadow: {
- type: 'colour_picker',
- fields: {
- COLOUR: '#ff0000',
- },
- },
- },
- COLOUR2: {
- shadow: {
- type: 'colour_picker',
- fields: {
- COLOUR: '#3333ff',
- },
- },
- },
- RATIO: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 0.5,
- },
- },
- },
- },
- },
- {
- type: 'colour_picker',
- x: 13,
- y: 63,
- fields: {
- COLOUR: '#3333ff',
- },
- },
- {
- type: 'colour_rgb',
- x: 13,
- y: 163,
- inputs: {
- RED: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 100,
- },
- },
- },
- GREEN: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 50,
- },
- },
- },
- BLUE: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 0,
- },
- },
- },
- },
- },
- {
- type: 'colour_blend',
- x: 13,
- y: 463,
- inputs: {
- COLOUR1: {
- shadow: {
- type: 'colour_picker',
- fields: {
- COLOUR: '#000000',
- },
- },
- },
- COLOUR2: {
- shadow: {
- type: 'colour_picker',
- fields: {
- COLOUR: '#ffffff',
- },
- },
- },
- RATIO: {
- shadow: {
- type: 'math_number',
- fields: {
- NUM: 0.3,
- },
- },
- },
- },
- },
- ],
- },
-};
-
-/**
- * Assert that the generated code matches the golden code for the specified
- * language.
- * @param {string} suffix The suffix of the golden file.
- * @param {string} generated The generated code to compare against the
- * golden file.
- */
-function checkResult(suffix, generated) {
- const fileName = `test/golden/golden.${suffix}`;
- const goldenContents = fs.readFileSync(fileName);
- // Normalize the line feeds.
- const normalized = goldenContents.toString().replace(/(?:\r\n|\r|\n)/g, '\n');
- assert.equal(generated, normalized);
-}
-
-suite('Colour Block Generators', function () {
- suiteSetup(function () {
- installAllBlocks({
- javascript: javascriptGenerator,
- dart: dartGenerator,
- lua: luaGenerator,
- python: pythonGenerator,
- php: phpGenerator,
- });
- });
- setup(function () {
- this.jsdomCleanup = require('jsdom-global')(
- '
',
- );
- this.workspace = new Blockly.Workspace();
- Blockly.serialization.workspaces.load(blockJson, this.workspace);
- });
- test('JavaScript', function () {
- const generated = javascriptGenerator.workspaceToCode(this.workspace);
- checkResult('js', generated);
- });
- test('Dart', function () {
- const generated = dartGenerator.workspaceToCode(this.workspace);
- checkResult('dart', generated);
- });
- test('Lua', function () {
- const generated = luaGenerator.workspaceToCode(this.workspace);
- checkResult('lua', generated);
- });
- test('Python', function () {
- const generated = pythonGenerator.workspaceToCode(this.workspace);
- checkResult('py', generated);
- });
- test('PHP', function () {
- const generated = phpGenerator.workspaceToCode(this.workspace);
- checkResult('php', generated);
- });
- teardown(function () {
- this.jsdomCleanup();
- this.workspace.dispose();
- });
-});
diff --git a/plugins/field-colour/test/field_colour_test.mocha.js b/plugins/field-colour/test/field_colour_test.mocha.js
deleted file mode 100644
index 057bcab12..000000000
--- a/plugins/field-colour/test/field_colour_test.mocha.js
+++ /dev/null
@@ -1,389 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {FieldColour, registerFieldColour} = require('../src/index');
-const {assert} = require('chai');
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldColour', function () {
- setup(function () {
- registerFieldColour();
- this.jsdomCleanup = require('jsdom-global')(
- '
',
- );
- });
-
- teardown(function () {
- this.jsdomCleanup();
- });
-
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- {title: 'NaN', value: NaN},
- {title: 'Non-Parsable String', value: 'bad-string'},
- {title: 'Integer', value: 1},
- {title: 'Float', value: 1.5},
- {title: 'Infinity', value: Infinity},
- {title: 'Negative Infinity', value: -Infinity},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- {
- title: '#AAAAAA',
- value: '#AAAAAA',
- expectedValue: '#aaaaaa',
- expectedText: '#aaa',
- },
- {
- title: '#aaaaaa',
- value: '#aaaaaa',
- expectedValue: '#aaaaaa',
- expectedText: '#aaa',
- },
- {
- title: '#AAAA00',
- value: '#AAAA00',
- expectedValue: '#aaaa00',
- expectedText: '#aa0',
- },
- {
- title: '#aaaA00',
- value: '#aaaA00',
- expectedValue: '#aaaa00',
- expectedText: '#aa0',
- },
- {
- title: '#BCBCBC',
- value: '#BCBCBC',
- expectedValue: '#bcbcbc',
- expectedText: '#bcbcbc',
- },
- {
- title: '#bcbcbc',
- value: '#bcbcbc',
- expectedValue: '#bcbcbc',
- expectedText: '#bcbcbc',
- },
- {
- title: '#AA0',
- value: '#AA0',
- expectedValue: '#aaaa00',
- expectedText: '#aa0',
- },
- {
- title: '#aa0',
- value: '#aa0',
- expectedValue: '#aaaa00',
- expectedText: '#aa0',
- },
- {
- title: 'rgb(170, 170, 0)',
- value: 'rgb(170, 170, 0)',
- expectedValue: '#aaaa00',
- expectedText: '#aa0',
- },
- {
- title: 'red',
- value: 'red',
- expectedValue: '#ff0000',
- expectedText: '#f00',
- },
- ];
- const addArgsAndJson = function (testCase) {
- testCase.args = [testCase.value];
- testCase.json = {colour: testCase.value};
- };
- invalidValueTestCases.forEach(addArgsAndJson);
- validValueTestCases.forEach(addArgsAndJson);
-
- /**
- * The expected default value for the field being tested.
- * @type {*}
- */
- const defaultFieldValue = FieldColour.prototype.DEFAULT_VALUE;
-
- /**
- * The expected default text for the field being tested.
- * @type {*}
- */
- const defaultTextValue = (function () {
- let expectedText = defaultFieldValue;
- const m = defaultFieldValue.match(/^#(.)\1(.)\2(.)\3$/);
- if (m) {
- expectedText = '#' + m[1] + m[2] + m[3];
- }
- return expectedText;
- })();
- /**
- * Asserts that the field property values are set to default.
- * @param {!FieldColour} field The field to check.
- */
- const assertFieldDefault = function (field) {
- assertFieldValue(field, defaultFieldValue, defaultTextValue);
- };
-
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldColour} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertFieldValue(field, testCase.expectedValue, testCase.expectedText);
- };
-
- runConstructorSuiteTests(
- FieldColour,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldColour,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- suite('setValue', function () {
- /**
- * Create a mock block that may be used as the source block for a field.
- * @returns {!Object} Mock block.
- */
- function createBlockMock() {
- return {
- id: 'test',
- rendered: false,
- workspace: {
- rendered: false,
- },
- renameVarById: Blockly.Block.prototype.renameVarById,
- updateVarName: Blockly.Block.prototype.updateVarName,
- isShadow: () => false,
- isDeadOrDying: () => false,
- };
- }
-
- suite('Empty -> New Value', function () {
- setup(function () {
- this.field = new FieldColour();
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- defaultFieldValue,
- defaultTextValue,
- );
- test('With source block', function () {
- this.field.setSourceBlock(createBlockMock());
- this.field.setValue('#bcbcbc');
- assertFieldValue(this.field, '#bcbcbc', '#bcbcbc');
- });
- });
- suite('Value -> New Value', function () {
- setup(function () {
- this.field = new FieldColour('#aaaaaa');
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- '#aaaaaa',
- '#aaa',
- );
- test('With source block', function () {
- this.field.setSourceBlock(createBlockMock());
- this.field.setValue('#bcbcbc');
- assertFieldValue(this.field, '#bcbcbc', '#bcbcbc');
- });
- });
- });
-
- suite('Validators', function () {
- setup(function () {
- this.field = new FieldColour('#aaaaaa');
- });
- const testSuites = [
- {
- title: 'Null Validator',
- validator: function () {
- return null;
- },
- value: '#000000',
- expectedValue: '#aaaaaa',
- expectedText: '#aaa',
- },
- {
- title: 'Force Full Red Validator',
- validator: function (newValue) {
- return '#ff' + newValue.substr(3, 4);
- },
- value: '#000000',
- expectedValue: '#ff0000',
- expectedText: '#f00',
- },
- {
- title: 'Returns Undefined Validator',
- validator: function () {},
- value: '#000000',
- expectedValue: '#000000',
- expectedText: '#000',
- },
- ];
- testSuites.forEach(function (suiteInfo) {
- suite(suiteInfo.title, function () {
- setup(function () {
- this.field.setValidator(suiteInfo.validator);
- });
- test('New Value', function () {
- this.field.setValue(suiteInfo.value);
- assertFieldValue(
- this.field,
- suiteInfo.expectedValue,
- suiteInfo.expectedText,
- );
- });
- });
- });
- });
-
- suite('Customizations', function () {
- suite('Colours and Titles', function () {
- /**
- * Verify that the list of colours and titles are as expected.
- * @param {!FieldColour} field Field to test.
- * @param {!Array[string]} expectedColours Array of colour names.
- * @param {!Array[string]} expectedTitles Array of title names.
- */
- function assertColoursAndTitles(field, expectedColours, expectedTitles) {
- const options = field.getOptions();
- const actualColours = options.map((option) =>
- Blockly.utils.colour.parse(option[0].style.backgroundColor),
- );
- const actualTitles = options
- .map((option) => option[0].title)
- .filter((title) => !!title);
- assert.equal(String(actualColours), String(expectedColours));
- assert.equal(String(actualTitles), String(expectedTitles));
- }
- test('JS Constructor', function () {
- const field = new FieldColour('#aaaaaa', null, {
- colourOptions: ['#aaaaaa'],
- colourTitles: ['grey'],
- });
- assertColoursAndTitles(field, ['#aaaaaa'], ['grey']);
- });
- test('JSON Definition', function () {
- const field = FieldColour.fromJson({
- colour: '#aaaaaa',
- colourOptions: ['#aaaaaa'],
- colourTitles: ['grey'],
- });
- assertColoursAndTitles(field, ['#aaaaaa'], ['grey']);
- });
- test('setColours', function () {
- const field = new FieldColour();
- field.setColours(['#aaaaaa'], ['grey']);
- assertColoursAndTitles(field, ['#aaaaaa'], ['grey']);
- });
- test('Titles Undefined', function () {
- const field = new FieldColour();
- field.setColours(['#aaaaaa']);
- assertColoursAndTitles(field, ['#aaaaaa'], []);
- });
- test('Some Titles Undefined', function () {
- const field = new FieldColour();
- field.setColours(['#aaaaaa', '#ff0000'], ['grey']);
- assertColoursAndTitles(field, ['#aaaaaa', '#ff0000'], ['grey']);
- });
- });
-
- suite('Columns', function () {
- /**
- * Verify that the number of columns is as expected.
- * @param {!FieldColour} field Field to test.
- * @param {number} expectedColumns Number of columns field should have.
- */
- function assertColumns(field, expectedColumns) {
- const actualColumns = field.columns || FieldColour.COLUMNS;
- assert.equal(actualColumns, expectedColumns);
- }
- test('JS Constructor', function () {
- const field = new FieldColour('#ffffff', null, {columns: 3});
- assertColumns(field, 3);
- });
- test('JSON Definition', function () {
- const field = FieldColour.fromJson({
- colour: '#ffffff',
- columns: 3,
- });
- assertColumns(field, 3);
- });
- test('setColumns', function () {
- const field = new FieldColour();
- field.setColumns(3);
- assertColumns(field, 3);
- });
- });
- });
-
- suite('Serialization', function () {
- setup(function () {
- this.workspace = new Blockly.Workspace();
- Blockly.defineBlocksWithJsonArray([
- {
- type: 'row_block',
- message0: '%1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- output: null,
- },
- ]);
-
- this.assertValue = (value) => {
- const block = this.workspace.newBlock('row_block');
- const field = new FieldColour(value);
- block.getInput('INPUT').appendField(field, 'COLOUR');
- const jso = Blockly.serialization.blocks.save(block);
- assert.deepEqual(jso['fields'], {COLOUR: value});
- };
- });
-
- teardown(function () {
- this.workspace.dispose();
- });
-
- test('Three char', function () {
- this.assertValue('#001122');
- });
-
- test('Six char', function () {
- this.assertValue('#012345');
- });
- });
-});
diff --git a/plugins/field-colour/test/golden/golden.dart b/plugins/field-colour/test/golden/golden.dart
deleted file mode 100644
index 80f9f8193..000000000
--- a/plugins/field-colour/test/golden/golden.dart
+++ /dev/null
@@ -1,65 +0,0 @@
-import 'dart:math' as Math;
-
-String colour_random() {
- String hex = '0123456789abcdef';
- var rnd = new Math.Random();
- return '#${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'
- '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}'
- '${hex[rnd.nextInt(16)]}${hex[rnd.nextInt(16)]}';
-}
-
-String colour_rgb(num r, num g, num b) {
- num rn = (Math.max(Math.min(r, 100), 0) * 2.55).round();
- String rs = rn.toInt().toRadixString(16);
- rs = '0$rs';
- rs = rs.substring(rs.length - 2);
- num gn = (Math.max(Math.min(g, 100), 0) * 2.55).round();
- String gs = gn.toInt().toRadixString(16);
- gs = '0$gs';
- gs = gs.substring(gs.length - 2);
- num bn = (Math.max(Math.min(b, 100), 0) * 2.55).round();
- String bs = bn.toInt().toRadixString(16);
- bs = '0$bs';
- bs = bs.substring(bs.length - 2);
- return '#$rs$gs$bs';
-}
-
-String colour_blend(String c1, String c2, num ratio) {
- ratio = Math.max(Math.min(ratio, 1), 0);
- int r1 = int.parse('0x${c1.substring(1, 3)}');
- int g1 = int.parse('0x${c1.substring(3, 5)}');
- int b1 = int.parse('0x${c1.substring(5, 7)}');
- int r2 = int.parse('0x${c2.substring(1, 3)}');
- int g2 = int.parse('0x${c2.substring(3, 5)}');
- int b2 = int.parse('0x${c2.substring(5, 7)}');
- num rn = (r1 * (1 - ratio) + r2 * ratio).round();
- String rs = rn.toInt().toRadixString(16);
- num gn = (g1 * (1 - ratio) + g2 * ratio).round();
- String gs = gn.toInt().toRadixString(16);
- num bn = (b1 * (1 - ratio) + b2 * ratio).round();
- String bs = bn.toInt().toRadixString(16);
- rs = '0$rs';
- rs = rs.substring(rs.length - 2);
- gs = '0$gs';
- gs = gs.substring(gs.length - 2);
- bs = '0$bs';
- bs = bs.substring(bs.length - 2);
- return '#$rs$gs$bs';
-}
-
-
-main() {
- '#ff0000';
-
- '#3333ff';
-
- colour_random();
-
- colour_rgb(100, 50, 0);
-
- colour_rgb(0, 1, 20);
-
- colour_blend('#ff0000', '#3333ff', 0.5);
-
- colour_blend('#000000', '#ffffff', 0.3);
-}
\ No newline at end of file
diff --git a/plugins/field-colour/test/golden/golden.js b/plugins/field-colour/test/golden/golden.js
deleted file mode 100644
index 368b4f101..000000000
--- a/plugins/field-colour/test/golden/golden.js
+++ /dev/null
@@ -1,46 +0,0 @@
-function colourRandom() {
- var num = Math.floor(Math.random() * 0x1000000);
- return '#' + ('00000' + num.toString(16)).substr(-6);
-}
-
-function colourRgb(r, g, b) {
- r = Math.max(Math.min(Number(r), 100), 0) * 2.55;
- g = Math.max(Math.min(Number(g), 100), 0) * 2.55;
- b = Math.max(Math.min(Number(b), 100), 0) * 2.55;
- r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);
- g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);
- b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);
- return '#' + r + g + b;
-}
-
-function colourBlend(c1, c2, ratio) {
- ratio = Math.max(Math.min(Number(ratio), 1), 0);
- var r1 = parseInt(c1.substring(1, 3), 16);
- var g1 = parseInt(c1.substring(3, 5), 16);
- var b1 = parseInt(c1.substring(5, 7), 16);
- var r2 = parseInt(c2.substring(1, 3), 16);
- var g2 = parseInt(c2.substring(3, 5), 16);
- var b2 = parseInt(c2.substring(5, 7), 16);
- var r = Math.round(r1 * (1 - ratio) + r2 * ratio);
- var g = Math.round(g1 * (1 - ratio) + g2 * ratio);
- var b = Math.round(b1 * (1 - ratio) + b2 * ratio);
- r = ('0' + (r || 0).toString(16)).slice(-2);
- g = ('0' + (g || 0).toString(16)).slice(-2);
- b = ('0' + (b || 0).toString(16)).slice(-2);
- return '#' + r + g + b;
-}
-
-
-'#ff0000';
-
-'#3333ff';
-
-colourRandom();
-
-colourRgb(100, 50, 0);
-
-colourRgb(0, 1, 20);
-
-colourBlend('#ff0000', '#3333ff', 0.5);
-
-colourBlend('#000000', '#ffffff', 0.3);
diff --git a/plugins/field-colour/test/golden/golden.lua b/plugins/field-colour/test/golden/golden.lua
deleted file mode 100644
index 4fdf506d4..000000000
--- a/plugins/field-colour/test/golden/golden.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-function colour_rgb(r, g, b)
- r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)
- g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)
- b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)
- return string.format("#%02x%02x%02x", r, g, b)
-end
-
-function colour_blend(colour1, colour2, ratio)
- local r1 = tonumber(string.sub(colour1, 2, 3), 16)
- local r2 = tonumber(string.sub(colour2, 2, 3), 16)
- local g1 = tonumber(string.sub(colour1, 4, 5), 16)
- local g2 = tonumber(string.sub(colour2, 4, 5), 16)
- local b1 = tonumber(string.sub(colour1, 6, 7), 16)
- local b2 = tonumber(string.sub(colour2, 6, 7), 16)
- local ratio = math.min(1, math.max(0, ratio))
- local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)
- local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)
- local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)
- return string.format("#%02x%02x%02x", r, g, b)
-end
-
-
-local _ = '#ff0000'
-
-local _ = '#3333ff'
-
-local _ = string.format("#%06x", math.random(0, 2^24 - 1))
-
-local _ = colour_rgb(100, 50, 0)
-
-local _ = colour_rgb(0, 1, 20)
-
-local _ = colour_blend('#ff0000', '#3333ff', 0.5)
-
-local _ = colour_blend('#000000', '#ffffff', 0.3)
diff --git a/plugins/field-colour/test/golden/golden.php b/plugins/field-colour/test/golden/golden.php
deleted file mode 100644
index 9f2fde50a..000000000
--- a/plugins/field-colour/test/golden/golden.php
+++ /dev/null
@@ -1,47 +0,0 @@
-function colour_random() {
- return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
-}
-
-function colour_rgb($r, $g, $b) {
- $r = round(max(min($r, 100), 0) * 2.55);
- $g = round(max(min($g, 100), 0) * 2.55);
- $b = round(max(min($b, 100), 0) * 2.55);
- $hex = '#';
- $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
- return $hex;
-}
-
-function colour_blend($c1, $c2, $ratio) {
- $ratio = max(min($ratio, 1), 0);
- $r1 = hexdec(substr($c1, 1, 2));
- $g1 = hexdec(substr($c1, 3, 2));
- $b1 = hexdec(substr($c1, 5, 2));
- $r2 = hexdec(substr($c2, 1, 2));
- $g2 = hexdec(substr($c2, 3, 2));
- $b2 = hexdec(substr($c2, 5, 2));
- $r = round($r1 * (1 - $ratio) + $r2 * $ratio);
- $g = round($g1 * (1 - $ratio) + $g2 * $ratio);
- $b = round($b1 * (1 - $ratio) + $b2 * $ratio);
- $hex = '#';
- $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
- $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
- return $hex;
-}
-
-
-'#ff0000';
-
-'#3333ff';
-
-colour_random();
-
-colour_rgb(100, 50, 0);
-
-colour_rgb(0, 1, 20);
-
-colour_blend('#ff0000', '#3333ff', 0.5);
-
-colour_blend('#000000', '#ffffff', 0.3);
diff --git a/plugins/field-colour/test/golden/golden.py b/plugins/field-colour/test/golden/golden.py
deleted file mode 100644
index 7320b8624..000000000
--- a/plugins/field-colour/test/golden/golden.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import random
-
-def colour_rgb(r, g, b):
- r = round(min(100, max(0, r)) * 2.55)
- g = round(min(100, max(0, g)) * 2.55)
- b = round(min(100, max(0, b)) * 2.55)
- return '#%02x%02x%02x' % (r, g, b)
-
-def colour_blend(colour1, colour2, ratio):
- r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)
- g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)
- b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)
- ratio = min(1, max(0, ratio))
- r = round(r1 * (1 - ratio) + r2 * ratio)
- g = round(g1 * (1 - ratio) + g2 * ratio)
- b = round(b1 * (1 - ratio) + b2 * ratio)
- return '#%02x%02x%02x' % (r, g, b)
-
-
-'#ff0000'
-
-'#3333ff'
-
-'#%06x' % random.randint(0, 2**24 - 1)
-
-colour_rgb(100, 50, 0)
-
-colour_rgb(0, 1, 20)
-
-colour_blend('#ff0000', '#3333ff', 0.5)
-
-colour_blend('#000000', '#ffffff', 0.3)
diff --git a/plugins/field-colour/test/index.html b/plugins/field-colour/test/index.html
deleted file mode 100644
index 60fa9f5b2..000000000
--- a/plugins/field-colour/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Colour Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/field-colour/test/index.ts b/plugins/field-colour/test/index.ts
deleted file mode 100644
index 722d0629e..000000000
--- a/plugins/field-colour/test/index.ts
+++ /dev/null
@@ -1,274 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Colour field test playground.
- */
-
-import * as Blockly from 'blockly';
-import {javascriptGenerator} from 'blockly/javascript';
-import {dartGenerator} from 'blockly/dart';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-import {luaGenerator} from 'blockly/lua';
-
-import {createPlayground} from '@blockly/dev-tools';
-import {installAllBlocks as installColourBlocks} from '../src/index';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the colour field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_colour',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_colour`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_colour',
- name: 'FIELDNAME',
- colour: '#ff4040',
- colourOptions: [
- '#ff4040',
- '#ff8080',
- '#ffc0c0',
- '#4040ff',
- '#8080ff',
- '#c0c0ff',
- ],
- colourTitles: [
- 'dark pink',
- 'pink',
- 'light pink',
- 'dark blue',
- 'blue',
- 'light blue',
- ],
- columns: 3,
- alt: {
- type: 'field_label',
- text: `No field_colour`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_colour',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_colour`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_colour',
- name: 'FIELDNAME',
- colour: '#ff4040',
- colourOptions: [
- '#ff4040',
- '#ff8080',
- '#ffc0c0',
- '#4040ff',
- '#8080ff',
- '#c0c0ff',
- ],
- colourTitles: [
- 'dark pink',
- 'pink',
- 'light pink',
- 'dark blue',
- 'blue',
- 'light blue',
- ],
- columns: 3,
- alt: {
- type: 'field_label',
- text: `No field_colour`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the colour field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Exported blocks',
- },
- {
- kind: 'block',
- type: 'colour_blend',
- },
- {
- kind: 'block',
- type: 'colour_picker',
- },
- {
- kind: 'block',
- type: 'colour_random',
- },
- {
- kind: 'block',
- type: 'colour_rgb',
- },
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- ],
-};
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- installColourBlocks({
- javascript: javascriptGenerator,
- dart: dartGenerator,
- lua: luaGenerator,
- python: pythonGenerator,
- php: phpGenerator,
- });
-
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox: jsonToolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-colour/tsconfig.json b/plugins/field-colour/tsconfig.json
deleted file mode 100644
index 46b8e73f3..000000000
--- a/plugins/field-colour/tsconfig.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true,
- "lib": ["ES2020", "dom"]
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-date/.gitignore b/plugins/field-date/.gitignore
deleted file mode 100644
index 800f3a80c..000000000
--- a/plugins/field-date/.gitignore
+++ /dev/null
@@ -1,24 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-/dist
-
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
diff --git a/plugins/field-date/CHANGELOG.md b/plugins/field-date/CHANGELOG.md
deleted file mode 100644
index bb33b4584..000000000
--- a/plugins/field-date/CHANGELOG.md
+++ /dev/null
@@ -1,685 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [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
-
-* Improve accessibility of `FieldDate` ([#2698](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2698))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [10.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-date@10.0.8...@blockly/field-date@10.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-date@10.0.7...@blockly/field-date@10.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-date@10.0.6...@blockly/field-date@10.0.7) (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))
-
-
-
-## [10.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.5...@blockly/field-date@10.0.6) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.4...@blockly/field-date@10.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.3...@blockly/field-date@10.0.4) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.2...@blockly/field-date@10.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.1...@blockly/field-date@10.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@10.0.0...@blockly/field-date@10.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [10.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.16...@blockly/field-date@10.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))
-
-
-
-## [9.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.15...@blockly/field-date@9.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.14...@blockly/field-date@9.0.15) (2025-05-15)
-
-
-### Bug Fixes
-
-* Wait for an animation frame before showing the date picker ([e3b1054](https://github.com/google/blockly-samples/commit/e3b1054eb0b511aa4ab270725c989369270ee8d6))
-
-
-
-
-
-## [9.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.13...@blockly/field-date@9.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.12...@blockly/field-date@9.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.11...@blockly/field-date@9.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.10...@blockly/field-date@9.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.9...@blockly/field-date@9.0.10) (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)
-
-
-
-
-
-## [9.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.8...@blockly/field-date@9.0.9) (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))
-
-
-
-
-
-## [9.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.7...@blockly/field-date@9.0.8) (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))
-
-
-
-
-
-## [9.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.6...@blockly/field-date@9.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.5...@blockly/field-date@9.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.4...@blockly/field-date@9.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.3...@blockly/field-date@9.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.2...@blockly/field-date@9.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.1...@blockly/field-date@9.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [9.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@9.0.0...@blockly/field-date@9.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))
-
-
-
-## [9.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.17...@blockly/field-date@9.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))
-* 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))
-* remove some uses of generateFieldTextBlocks ([#2357](https://github.com/google/blockly-samples/issues/2357)) ([53b3fa4](https://github.com/google/blockly-samples/commit/53b3fa4604aabb1fc5240d41c8d1d389d4b15301))
-
-
-
-## [8.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.16...@blockly/field-date@8.0.17) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.15...@blockly/field-date@8.0.16) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.14...@blockly/field-date@8.0.15) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.13...@blockly/field-date@8.0.14) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.12...@blockly/field-date@8.0.13) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.11...@blockly/field-date@8.0.12) (2024-02-16)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.10...@blockly/field-date@8.0.11) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.9...@blockly/field-date@8.0.10) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.8...@blockly/field-date@8.0.9) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.7...@blockly/field-date@8.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.6...@blockly/field-date@8.0.7) (2023-11-02)
-
-
-### Bug Fixes
-
-* publish types for field-date ([#2049](https://github.com/google/blockly-samples/issues/2049)) ([2086712](https://github.com/google/blockly-samples/commit/20867125156005b346056080057ba95219f73b29))
-
-
-
-## [8.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.5...@blockly/field-date@8.0.6) (2023-10-30)
-
-
-### Bug Fixes
-
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [8.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.4...@blockly/field-date@8.0.5) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.3...@blockly/field-date@8.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.2...@blockly/field-date@8.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.1...@blockly/field-date@8.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@8.0.0...@blockly/field-date@8.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [8.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@7.0.1...@blockly/field-date@8.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [7.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@7.0.0...@blockly/field-date@7.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [7.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.1.2...@blockly/field-date@7.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))
-
-
-
-## [6.1.2](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.1.1...@blockly/field-date@6.1.2) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.1.0...@blockly/field-date@6.1.1) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.1.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.14...@blockly/field-date@6.1.0) (2023-05-11)
-
-
-### Features
-
-* Add angle, colour, and multiline fields. (Rebase of [#1674](https://github.com/google/blockly-samples/issues/1674)) ([#1693](https://github.com/google/blockly-samples/issues/1693)) ([1b447f4](https://github.com/google/blockly-samples/commit/1b447f41d6293f14e846b8a4d82d289a5637a99a))
-
-
-
-## [6.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.13...@blockly/field-date@6.0.14) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.12...@blockly/field-date@6.0.13) (2023-04-27)
-
-
-### Bug Fixes
-
-* Correct date field test assertions ([#1673](https://github.com/google/blockly-samples/issues/1673)) ([9974e85](https://github.com/google/blockly-samples/commit/9974e85becaa8ad17e35b588b95391c85865dafd))
-
-
-
-## [6.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.11...@blockly/field-date@6.0.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.10...@blockly/field-date@6.0.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.9...@blockly/field-date@6.0.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.8...@blockly/field-date@6.0.9) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [6.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.7...@blockly/field-date@6.0.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.6...@blockly/field-date@6.0.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.5...@blockly/field-date@6.0.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.4...@blockly/field-date@6.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.3...@blockly/field-date@6.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.2...@blockly/field-date@6.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.1...@blockly/field-date@6.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-date@6.0.0...@blockly/field-date@6.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-date@5.0.22...@blockly/field-date@6.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-* update field-date to es6 class (#1295)
-
-### Bug Fixes
-
-* references to deprecated functions in v9 ([#1313](https://github.com/google/blockly-samples/issues/1313)) ([cb2e679](https://github.com/google/blockly-samples/commit/cb2e67987e0b62a77c26adc660cc6ade1ba67954))
-* update field-date to es6 class ([#1295](https://github.com/google/blockly-samples/issues/1295)) ([9b70b03](https://github.com/google/blockly-samples/commit/9b70b0300c625c0cddc1eea241a3d2c2200344f8))
-
-
-### 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))
-
-
-
-## 5.0.22 (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))
-
-
-
-
-
-## 5.0.21 (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))
-
-
-
-
-
-## 5.0.19 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## 5.0.18 (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))
-
-
-
-
-
-## 5.0.17 (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))
-
-
-
-
-
-## 5.0.16 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/field-date
-
-
-
-
-
-## 5.0.15 (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))
-
-
-
-
-
-## 5.0.14 (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/plugins/field-date/README.md b/plugins/field-date/README.md
deleted file mode 100644
index 8b44897f6..000000000
--- a/plugins/field-date/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# @blockly/field-date [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) plugin that uses a browser default "date" input.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-date
-```
-
-### npm
-
-```
-npm install @blockly/field-date --save
-```
-
-## Usage
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldDate} from '@blockly/field-date';
-
-Blockly.Blocks['test_fields_date'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('date: ')
- .appendField(new FieldDate('2020-02-20'), 'FIELDNAME');
- },
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-date';
-
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_fields_date',
- message0: 'date: %1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- date: '2020-02-20',
- },
- ],
- },
-]);
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-date/package.json b/plugins/field-date/package.json
deleted file mode 100644
index 805c676ca..000000000
--- a/plugins/field-date/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "name": "@blockly/field-date",
- "version": "13.2.0",
- "description": "A Blockly date picker field that uses the browser's date picker.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "field-date",
- "field",
- "date",
- "datepicker"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-date#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-date"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-date/src/field_date.ts b/plugins/field-date/src/field_date.ts
deleted file mode 100644
index cf9601b30..000000000
--- a/plugins/field-date/src/field_date.ts
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plugin overview.
- */
-import * as Blockly from 'blockly/core';
-import {getLocaleDateString} from './utils';
-
-/**
- * Class for a date input field.
- */
-export class FieldDate extends Blockly.FieldTextInput {
- /**
- * Serializable fields are saved by the XML renderer, non-serializable fields
- * are not. Editable fields should also be serializable.
- */
- SERIALIZABLE = true;
-
- /**
- * Class for a date input field. Derived from the Closure library date
- * picker.
- *
- * @param value The initial value of the field. Should be in
- * 'YYYY-MM-DD' format. Defaults to the current date.
- * @param validator A function that is called to validate
- * changes to the field's value. Takes in a date string & returns a
- * validated date string ('YYYY-MM-DD' format), or null to abort the
- * change.
- * @param config A map of options used to configure the field.
- */
- constructor(
- value?: string,
- validator?: FieldDateValidator,
- config?: FieldDateConfig,
- ) {
- super(value, validator, config);
- }
-
- /**
- * Constructs a FieldDate from a JSON arg object.
- *
- * @param options A JSON object with options (date).
- * @returns The new field instance.
- * @package
- * @nocollapse
- */
- static fromJson(options: FieldDateFromJsonConfig): FieldDate {
- const {date, ...fieldDateConfig} = options;
- // `this` might be a subclass of FieldDate if that class doesn't
- // override the static fromJson method.
- return new this(date, undefined, fieldDateConfig);
- }
-
- /* eslint-disable @typescript-eslint/naming-convention */
- /**
- * Ensures that the input value is a valid date. Additionally, if the date
- * string provided includes a time, the time will be removed and the date for
- * relative to the user's timezone will be used.
- *
- * @param newValue The input value. Ex: '2023-04-28'
- * @returns A valid date string, or null if invalid.
- * @override
- */
- protected doClassValidation_(newValue?: string): string | null {
- if (!newValue) return null;
-
- const newDate = typeof newValue === 'string' ? new Date(newValue) : null;
- if (!newDate || isNaN(newDate.getTime())) return null;
-
- // NOTE: 'newValue' should be a valid date format here.
- if (isISOFormat(newValue)) return newValue;
-
- // Assume the time needs to be corrected.
- return toLocalISOString(newDate);
- }
-
- /**
- * Get the text to display on the block when the input hasn't spawned in.
- *
- * @returns The text to display on the block.
- * @override
- */
- protected getText_(): string | null {
- const value = this.getValue();
- if (!value) return null;
- // NOTE: There may be discrepancies between the text and the input based on
- // browser. For example, 'en-US' would display the text '2/14/2020', then
- // clicking in Safari on iOS would display 'Feb 14, 2020'.
- return getLocaleDateString(value);
- }
-
- /**
- * Returns a description of the type of this field for screenreaders.
- */
- override getAriaTypeName() {
- return Blockly.Msg['ARIA_TYPE_FIELD_DATE'];
- }
-
- /**
- * Returns a description of the current date for use by screenreaders.
- */
- override getAriaValue() {
- const stringValue = this.getValue();
- if (!stringValue) return super.getAriaValue();
-
- const date = new Date(stringValue);
- // Use a localized long-form description of the date, e.g. January XX, 20XX,
- // rather than a short-form/ISO version of the date which may be read out
- // with slashes or the like.
- return date.toLocaleDateString(undefined, {
- year: 'numeric',
- month: 'long',
- day: 'numeric',
- timeZone: 'UTC',
- });
- }
-
- /**
- * Renders the field. If the picker is shown make sure it has the current
- * date selected.
- */
- protected render_() {
- super.render_();
- }
-
- /**
- * Shows the inline free-text editor on top of the text along with the date
- * editor.
- *
- * @param e Optional mouse event that triggered the field to
- * open, or undefined if triggered programmatically.
- * @override
- */
- protected showEditor_(e?: Event) {
- // Pass in `true` for `quietInput` to disable modal inputs for the date
- // block without setting `this.sourceBlock_.workspace.options.modalInputs`,
- // which would impact the entire workspace.
- super.showEditor_(e, true);
-
- // Even though `quietInput` was set true, focus on the element.
- this.htmlInput_?.focus({
- preventScroll: true,
- });
- this.htmlInput_?.select();
- this.showDropdown();
- }
-
- /**
- * Updates the size of the field based on the text.
- *
- * @param margin margin to use when positioning the text element.
- * @override
- */
- protected updateSize_(margin?: number) {
- // Add margin so that the date input's datepicker icon doesn't clip with
- // the text when sized for the date.
- super.updateSize_((margin ?? 0) + 20);
- }
-
- /**
- * Shows the datepicker.
- */
- private showDropdown(): void {
- if (!this.htmlInput_) return;
- Blockly.utils.dom.addClass(this.htmlInput_, 'blocklyDateInput');
-
- // Delay showing the picker until the editor has a chance to position
- window.requestAnimationFrame(() => {
- // NOTE: HTMLInputElement.showPicker() is not available in earlier
- // TypeScript versions (like 4.7.4), so casting to `any` to be compatible
- // with dev scripts. Additionally, it's not available for date inputs for
- // Safari. For browser compatibility of showPicker, see:
- // https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/showPicker
- /* eslint-disable @typescript-eslint/no-explicit-any */
- (this.htmlInput_ as any).showPicker();
- /* eslint-enable @typescript-eslint/no-explicit-any */
- });
- }
-
- /**
- * Create the html input and set it to type date.
- *
- * @returns The newly created date input editor.
- */
- protected widgetCreate_(): HTMLInputElement {
- // NOTE: field_input should return HTMLInputElement for this.
- const htmlInput = super.widgetCreate_() as HTMLInputElement;
- htmlInput.type = 'date';
-
- return htmlInput;
- }
- /* eslint-enable @typescript-eslint/naming-convention */
-}
-
-/**
- * NOTE: There are a few minor ways to tweak the datepicker CSS, though they're
- * not consistent across browsers.
- *
- * @see{@link https://developer.mozilla.org/en-US/docs/Learn/Forms/Property_compatibility_table_for_form_controls#date_pickers}
- *
- * Below are a few ways this can be tweaked on *some* browsers:
- * Blockly.Css.register(`
- * ::-webkit-datetime-edit { }
- * ::-webkit-datetime-edit-fields-wrapper { }
- * ::-webkit-datetime-edit-text { }
- * ::-webkit-datetime-edit-month-field { }
- * ::-webkit-datetime-edit-day-field { }
- * ::-webkit-datetime-edit-year-field { }
- * ::-webkit-inner-spin-button { }
- * ::-webkit-calendar-picker-indicator { }
- * `);
- */
-if (Blockly.utils.userAgent.MAC) {
- // NOTE: By default, 4 px padding total are added within the User Agent
- // Shadow Content on Safari on MAC. Remove the padding so the inner input
- // matches the outer input's height and, by extension, the height of the text
- // node.
- Blockly.Css.register(`
-input.blocklyDateInput::-webkit-datetime-edit,
-input.blocklyDateInput::-webkit-datetime-edit-month-field,
-input.blocklyDateInput::-webkit-datetime-edit-day-field,
-input.blocklyDateInput::-webkit-datetime-edit-year-field {
- padding: 0;
-}
-`);
-}
-
-Blockly.fieldRegistry.register('field_date', FieldDate);
-
-/**
- * A config object for defining a field date.
- */
-export interface FieldDateConfig extends Blockly.FieldTextInputConfig {
- // NOTE: spellcheck is defined for FieldInput though irrelevant for FieldDate.
- spellcheck?: never;
-}
-
-/**
- * Options used to define a field date from JSON.
- */
-export interface FieldDateFromJsonConfig extends FieldDateConfig {
- date?: string;
-}
-
-export type FieldDateValidator = Blockly.FieldTextInputValidator;
-
-/**
- * Validate a string value to see if it matches the format.
- *
- * @param value The value to validate the format for.
- * @returns true if the value is in 'yyyy-mm-dd' format.
- * @example
- * isISOFormat('2000-02-20T00:00:00Z') === false
- * isISOFormat('2000-02-20') === true
- */
-export function isISOFormat(value: string): boolean {
- const valueMatch = value.match(/\d\d\d\d-\d\d-\d\d/);
- // If it matches ####-##-## and is the same as its input string,
- // then assume this is the right format
- return valueMatch !== null && valueMatch[0] === valueMatch.input;
-}
-
-/**
- * Convert the date to ISO format for the current timezone.
- *
- * @param date The date to convert to an ISO string.
- * @returns The string in 'yyyy-mm-dd' format, though for the current timezone.
- * Ex: new Date('2000-02-20')
- */
-export function toLocalISOString(date: Date) {
- // NOTE: If the date is Feb 20, 2000 at 23:00 for GMT-6, it would be
- // '2000-02-21' at GMT+0, which is what `date.toISOString()` would return.
- // For a user whose timezone is GMT-6, this should return '2000-02-20'.
- // For a user whose timezone is GMT-5, that date should return '2000-02-21'.
- return date
- .toLocaleDateString('en-US')
- .replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2')
- .replace(/-(\d)(?!\d)/g, '-0$1');
-}
-
-// NOTE: Set default here instead of in class so it's available at Field.
-FieldDate.prototype.DEFAULT_VALUE = toLocalISOString(new Date());
diff --git a/plugins/field-date/src/index.ts b/plugins/field-date/src/index.ts
deleted file mode 100644
index 480c3fe80..000000000
--- a/plugins/field-date/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field_date';
diff --git a/plugins/field-date/src/utils.ts b/plugins/field-date/src/utils.ts
deleted file mode 100644
index 7059216d2..000000000
--- a/plugins/field-date/src/utils.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Get the string formatted locally to the user.
- *
- * @param dateString A string in the format 'yyyy-mm-dd'
- * @returns the locale date string for the date.
- */
-export function getLocaleDateString(dateString: string): string {
- // NOTE: `date.toLocaleDateString()` will be the day before for western dates
- // due to an unspecified time & timezone assuming midnight at GMT+0.
- const date = new Date(dateString);
-
- // NOTE: This format varies per region.
- // Ex: "5/12/2023", "12/05/2023", "12.5.2023", "2023/5/12", "१२/५/२०२३"
- const language = navigator.language ?? 'en-US';
- // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat#using_options
- return new Intl.DateTimeFormat(language, {
- // Print the date for GMT+0 since the date object assumes midnight at GMT+0.
- timeZone: 'UTC',
- }).format(date);
-}
diff --git a/plugins/field-date/test/field_date_test.mocha.js b/plugins/field-date/test/field_date_test.mocha.js
deleted file mode 100644
index f818c08ce..000000000
--- a/plugins/field-date/test/field_date_test.mocha.js
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {assert} from 'chai';
-import {testHelpers} from '@blockly/dev-tools';
-import {FieldDate} from '../src/index';
-import {getLocaleDateString} from '../src/utils';
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-// Add polyfill for global variables needed.
-if (!global.navigator) {
- global.navigator = {
- language: 'en-US',
- };
-}
-
-suite('FieldDate', function () {
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- {title: 'NaN', value: NaN},
- {title: 'Non-Parsable String', value: 'bad'},
- {title: 'Invalid Date - Month(2020-13-20)', value: '2020-13-20'},
- {title: 'Invalid Date - Day(2020-02-32)', value: '2020-02-32'},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- {
- title: 'String',
- value: '3030-03-30',
- expectedValue: '3030-03-30',
- expectedText: '3/30/3030',
- },
- ];
- const addArgsAndJson = function (testCase) {
- testCase.args = [testCase.value];
- testCase.json = {date: testCase.value};
- };
- invalidValueTestCases.forEach(addArgsAndJson);
- validValueTestCases.forEach(addArgsAndJson);
- // Construct ISO string using current timezone.
- // Cannot use toISOString() because it returns in UTC.
- const defaultFieldValue = new Date()
- .toLocaleDateString('en-US')
- .replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2')
- .replace(/-(\d)(?!\d)/g, '-0$1');
- // NOTE: The actual text depends on system settings of the one running it.
- const defaultFieldText = new Date().toLocaleDateString();
- const assertFieldDefault = function (field) {
- assertFieldValue(field, defaultFieldValue, defaultFieldText);
- };
-
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldDate} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertFieldValue(field, testCase.expectedValue, testCase.expectedText);
- };
-
- runConstructorSuiteTests(
- FieldDate,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldDate,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- suite('setValue', function () {
- suite('Empty -> New Value', function () {
- setup(function () {
- this.field = new FieldDate();
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- defaultFieldValue,
- defaultFieldText,
- );
- });
- suite('Value -> New Value', function () {
- const initialValue = '2020-02-20';
- const initialText = getLocaleDateString(initialValue);
- setup(function () {
- this.field = new FieldDate(initialValue);
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- initialValue,
- initialText,
- );
- });
- });
-
- suite('Validators', function () {
- setup(function () {
- this.field = new FieldDate('2020-02-20');
- });
- teardown(function () {
- this.field.setValidator(null);
- });
- suite('when validator returns null', function () {
- setup(function () {
- this.field.setValidator(() => {
- return null;
- });
- });
- test('should not set the new value', function () {
- this.field.setValue('3030-03-30');
- assertFieldValue(this.field, '2020-02-20', '2/20/2020');
- });
- });
- suite('when validator sets day to 20s', function () {
- setup(function () {
- this.field.setValidator(function (newValue) {
- return newValue.substr(0, 8) + '2' + newValue.substr(9, 1);
- });
- });
- test('should set the value to a "20s" date', function () {
- this.field.setValue('3030-03-30');
- assertFieldValue(this.field, '3030-03-20', '3/20/3030');
- });
- });
- suite('when validator returns undefined', function () {
- setup(function () {
- this.field.setValidator(() => {});
- });
- test('should set the value without changing it', function () {
- this.field.setValue('3030-03-30');
- assertFieldValue(this.field, '3030-03-30', '3/30/3030');
- });
- });
- });
-
- suite('Time Zones', function () {
- // https://nodejs.org/api/cli.html#tz
- const INITIAL_TZ = process.env.TZ;
- const TZ_STRINGS = {
- WESTERN: 'America/New_York',
- UNIVERSAL: 'Etc/Universal',
- EASTERN: 'Europe/Paris',
- };
- const TZ_OFFSET = {
- WESTERN: '-05:00',
- UNIVERSAL: '+00:00',
- EASTERN: '+01:00',
- };
-
- suite('Western', () => {
- setup(() => {
- process.env.TZ = TZ_STRINGS.WESTERN;
- });
-
- test('should return the same date when provided a date string', () => {
- const dateString = '2000-01-23';
- const fieldDate = new FieldDate(dateString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- test('should return the same date for 23:00 western datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T23:00:00' + TZ_OFFSET.WESTERN;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- test('should return the day before for 00:00 universal datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T00:00:00' + TZ_OFFSET.UNIVERSAL;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), '2000-01-22');
- });
-
- teardown(() => {
- process.env.TSZ = INITIAL_TZ;
- });
- });
-
- suite('Universal', () => {
- setup(() => {
- process.env.TZ = TZ_STRINGS.UNIVERSAL;
- });
-
- test('should return the same date when provided a date string', () => {
- const dateString = '2000-01-23';
- const fieldDate = new FieldDate(dateString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- test('should return the day after for 23:00 western datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T23:00:00' + TZ_OFFSET.WESTERN;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), '2000-01-24');
- });
-
- test('should return the same date for 00:00 universal datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T00:00:00' + TZ_OFFSET.UNIVERSAL;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- teardown(() => {
- process.env.TSZ = INITIAL_TZ;
- });
- });
-
- suite('Eastern', () => {
- setup(() => {
- process.env.TZ = TZ_STRINGS.EASTERN;
- });
-
- test('should return the same date when provided a date string', () => {
- const dateString = '2000-01-23';
- const fieldDate = new FieldDate(dateString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- test('should return the day after for 23:00 universal datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T23:00:00' + TZ_OFFSET.UNIVERSAL;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), '2000-01-24');
- });
-
- test('should return the same date for 00:00 eastern datetime', () => {
- const dateString = '2000-01-23';
- const dateTimeString = dateString + 'T00:00:00' + TZ_OFFSET.EASTERN;
- const fieldDate = new FieldDate(dateTimeString);
- assert.equal(fieldDate.getValue(), dateString);
- });
-
- teardown(() => {
- process.env.TSZ = INITIAL_TZ;
- });
- });
- });
-});
diff --git a/plugins/field-date/test/index.html b/plugins/field-date/test/index.html
deleted file mode 100644
index 1f568ca99..000000000
--- a/plugins/field-date/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Date Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/field-date/test/index.ts b/plugins/field-date/test/index.ts
deleted file mode 100644
index 050763dab..000000000
--- a/plugins/field-date/test/index.ts
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Plugin test.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the date field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_date`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- date: '2020-02-20',
- alt: {
- type: 'field_label',
- text: `No field_date`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- alt: {
- type: 'field_label',
- text: `No field_date`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- date: '2020-02-20',
- alt: {
- type: 'field_label',
- text: `No field_date`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
- {
- type: 'test_custom_field_values_and_tooltip',
- message0: 'block %1',
- args0: [
- {
- type: 'field_date',
- name: 'FIELDNAME',
- date: '2021-03-13',
- tooltip: 'This date block has a tooltip!',
- alt: {
- type: 'field_label',
- text: `No field_date`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the date field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_tooltip',
- },
- ],
-};
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox: jsonToolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- // NOTE: Will need to update @blockly/dev-tools package JSON to keep it's
- // version of Blockly in sync with this package's. Both call for ^9.0.0,
- // though the package-locks result in each installing different versions.
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-date/tsconfig.json b/plugins/field-date/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-date/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-dependent-dropdown/CHANGELOG.md b/plugins/field-dependent-dropdown/CHANGELOG.md
deleted file mode 100644
index fe7c2a383..000000000
--- a/plugins/field-dependent-dropdown/CHANGELOG.md
+++ /dev/null
@@ -1,508 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-### ⚠ BREAKING CHANGES
-
-* make field-multilineinput keyboard navigable and accessible (#2729)
-* Bump Blockly dependency to v13 (#2704)
-
-### Features
-
-* make field-multilineinput keyboard navigable and accessible ([#2729](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2729))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [5.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.9...@blockly/field-dependent-dropdown@5.0.10) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.8...@blockly/field-dependent-dropdown@5.0.9) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.7...@blockly/field-dependent-dropdown@5.0.8) (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))
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.6...@blockly/field-dependent-dropdown@5.0.7) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.5...@blockly/field-dependent-dropdown@5.0.6) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.4...@blockly/field-dependent-dropdown@5.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.3...@blockly/field-dependent-dropdown@5.0.4) (2025-10-30)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.2...@blockly/field-dependent-dropdown@5.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.1...@blockly/field-dependent-dropdown@5.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@5.0.0...@blockly/field-dependent-dropdown@5.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.16...@blockly/field-dependent-dropdown@5.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))
-
-
-
-## [4.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.15...@blockly/field-dependent-dropdown@4.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.14...@blockly/field-dependent-dropdown@4.0.15) (2025-05-15)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.13...@blockly/field-dependent-dropdown@4.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.12...@blockly/field-dependent-dropdown@4.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.11...@blockly/field-dependent-dropdown@4.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.10...@blockly/field-dependent-dropdown@4.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.9...@blockly/field-dependent-dropdown@4.0.10) (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)
-
-
-
-
-
-## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.8...@blockly/field-dependent-dropdown@4.0.9) (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))
-
-
-
-
-
-## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.7...@blockly/field-dependent-dropdown@4.0.8) (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))
-
-
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.6...@blockly/field-dependent-dropdown@4.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.5...@blockly/field-dependent-dropdown@4.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.4...@blockly/field-dependent-dropdown@4.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.3...@blockly/field-dependent-dropdown@4.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.2...@blockly/field-dependent-dropdown@4.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.1...@blockly/field-dependent-dropdown@4.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@4.0.0...@blockly/field-dependent-dropdown@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/field-dependent-dropdown@3.0.17...@blockly/field-dependent-dropdown@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.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.16...@blockly/field-dependent-dropdown@3.0.17) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.15...@blockly/field-dependent-dropdown@3.0.16) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.14...@blockly/field-dependent-dropdown@3.0.15) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.13...@blockly/field-dependent-dropdown@3.0.14) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.12...@blockly/field-dependent-dropdown@3.0.13) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.11...@blockly/field-dependent-dropdown@3.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.10...@blockly/field-dependent-dropdown@3.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.9...@blockly/field-dependent-dropdown@3.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.8...@blockly/field-dependent-dropdown@3.0.9) (2023-11-16)
-
-
-### Bug Fixes
-
-* resolved 15 ESLint warnings ([#2065](https://github.com/google/blockly-samples/issues/2065)) ([2436337](https://github.com/google/blockly-samples/commit/243633746542bb1518fe2893c0421a5a6f79fd32))
-
-
-
-## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.7...@blockly/field-dependent-dropdown@3.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.6...@blockly/field-dependent-dropdown@3.0.7) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.5...@blockly/field-dependent-dropdown@3.0.6) (2023-10-30)
-
-
-### Bug Fixes
-
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* Publish types for field-dependent-dropdown ([#1961](https://github.com/google/blockly-samples/issues/1961)) ([9c96dbe](https://github.com/google/blockly-samples/commit/9c96dbeea63b71ce0f5e8be7b8acaf44e77fc8ed))
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.4...@blockly/field-dependent-dropdown@3.0.5) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.3...@blockly/field-dependent-dropdown@3.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.2...@blockly/field-dependent-dropdown@3.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.1...@blockly/field-dependent-dropdown@3.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@3.0.0...@blockly/field-dependent-dropdown@3.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@2.0.1...@blockly/field-dependent-dropdown@3.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@2.0.0...@blockly/field-dependent-dropdown@2.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.5...@blockly/field-dependent-dropdown@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))
-
-
-### Bug Fixes
-
-* renaming build problems ([7087469](https://github.com/google/blockly-samples/commit/7087469ccdaf27e040cd67a386c9284aa6b1cd67))
-
-
-
-## [1.1.5](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.4...@blockly/field-dependent-dropdown@1.1.5) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [1.1.4](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.3...@blockly/field-dependent-dropdown@1.1.4) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [1.1.3](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.2...@blockly/field-dependent-dropdown@1.1.3) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [1.1.2](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.1...@blockly/field-dependent-dropdown@1.1.2) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## [1.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-dependent-dropdown@1.1.0...@blockly/field-dependent-dropdown@1.1.1) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/field-dependent-dropdown
-
-
-
-
-
-## 1.1.0 (2023-03-23)
-
-
-### Features
-
-* Create plugin for dependent dropdown fields. ([#1555](https://github.com/google/blockly-samples/issues/1555)) ([1c473d6](https://github.com/google/blockly-samples/commit/1c473d6b2c4aa3754cf332c07585af60342537ef))
diff --git a/plugins/field-dependent-dropdown/README.md b/plugins/field-dependent-dropdown/README.md
deleted file mode 100644
index 0b342767d..000000000
--- a/plugins/field-dependent-dropdown/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# @blockly/field-dependent-dropdown [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) dropdown field where the options depend on the value of a parent field.
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-dependent-dropdown
-```
-
-### npm
-
-```
-npm install @blockly/field-dependent-dropdown --save
-```
-
-## Usage
-
-This plugin adds a field type `FieldDependentDropdown` that is an extension of `Blockly.FieldDropdown` and is registered as `'field_dependent_dropdown'` for the JSON API. You can associate it with a parent field that is attached to the same block, along with a mapping from the parent field's possible values to the desired menu options for this child field. Whenever the parent field's value changes, this field will automatically change its own available options to the options that correspond to the new parent value. You can also provide a set of default options that will be used if the parent field's value doesn't match any of the keys in your option mapping.
-
-These changes are recorded properly in the undo history, and the fields can be [serialized and later deserialized](https://developers.google.com/blockly/guides/configure/web/serialization) while preserving their options, values, and validity. You can also create chains of dependent dropdowns that depend on other dependent dropdowns.
-
-Note that the parent field must be attached to the block before the child field, and the child field will attach a validator function to the parent field to intercept changes to its value. If you want to add your own [custom field validator](https://developers.google.com/blockly/guides/create-custom-blocks/fields/validators) to the parent field, you need to use [the JavaScript API to define your block](https://developers.google.com/blockly/guides/create-custom-blocks/define/json-and-js) and [pass your validator to the parent field's constructor](https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/dropdown#creating_a_dropdown_validator). If you try to set the parent's validator later, you'll overwrite the one added by this plugin.
-
-To create a dependent dropdown, you'll need to add this field type to a block definition, and add that block to your toolbox. See below for an example of defining a block that uses this field.
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-dependent-dropdown'; // Import with side effects.
-
-Blockly.defineBlocksWithJsonArray([
- {
- 'type': 'dependent_dropdown_example',
- 'message0': 'Category %1 Animal %2',
- 'args0': [
- {
- 'type': 'field_dropdown',
- 'name': 'ANIMAL_CATEGORY',
- 'options': [['Mammal', 'mammal'], ['Bird', 'bird'], ['Cryptid', 'cryptid']]
- },
- {
- 'type': 'field_dependent_dropdown',
- 'name': 'ANIMAL',
- 'parentName': 'ANIMAL_CATEGORY',
- 'optionMapping': {
- 'mammal': [['Dog', 'dog'], ['Cat', 'cat'], ['Hamster', 'hamster']],
- 'bird': [['Parakeet', 'parakeet'], ['Canary', 'canary']]
- }
- 'defaultOptions': [['None available', 'noneAvailable']],
- }
- ]
- }
-]);
-```
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldDependentDropdown} from '@blockly/field-dependent-dropdown';
-
-Blockly.Blocks['dependent_dropdown_example'] = {
- init: function () {
- const parentFieldName = 'ANIMAL_CATEGORY';
- const childFieldName = 'ANIMAL';
- const parentOptions = [
- ['Mammal', 'mammal'],
- ['Bird', 'bird'],
- ['Cryptid', 'cryptid'],
- ];
- const optionMapping = {
- mammal: [
- ['Dog', 'dog'],
- ['Cat', 'cat'],
- ['Hamster', 'hamster'],
- ],
- bird: [
- ['Parakeet', 'parakeet'],
- ['Canary', 'canary'],
- ],
- };
- const defaultOptions = [['None available', 'noneAvailable']];
- this.appendDummyInput()
- .appendField('Category')
- .appendField(new Blockly.FieldDropdown(parentOptions), parentFieldName)
- .appendField('Animal')
- .appendField(
- new FieldDependentDropdown(
- parentFieldName,
- optionMapping,
- defaultOptions,
- ),
- childFieldName,
- );
- },
-};
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-dependent-dropdown/package.json b/plugins/field-dependent-dropdown/package.json
deleted file mode 100644
index bb7e11f74..000000000
--- a/plugins/field-dependent-dropdown/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "name": "@blockly/field-dependent-dropdown",
- "version": "13.2.0",
- "description": "A Blockly dropdown field that automatically updates its available options depending on the value of another field.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "colour",
- "field",
- "hsv",
- "slider"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-dependent-dropdown#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-dependent-dropdown"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-dependent-dropdown/src/dependent_dropdown_options_change.ts b/plugins/field-dependent-dropdown/src/dependent_dropdown_options_change.ts
deleted file mode 100644
index ec8efd5ed..000000000
--- a/plugins/field-dependent-dropdown/src/dependent_dropdown_options_change.ts
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview An event representing when a dependent dropdown field changes
- * state.
- */
-
-import * as Blockly from 'blockly/core';
-import type {FieldDependentDropdown} from './field_dependent_dropdown';
-
-/**
- * A deep equality comparison between the two provided arrays recursively
- * comparing any child elements that are also arrays.
- *
- * @param a The first array to compare.
- * @param b The second array to compare.
- * @returns Whether the arrays are deeply equivalent.
- */
-function arraysAreEquivalent(a: T[], b: T[]): boolean {
- return (
- a.length === b.length &&
- a.every((aElement, index) => {
- const bElement = b[index];
- if (Array.isArray(aElement) && Array.isArray(bElement)) {
- return arraysAreEquivalent(aElement, bElement);
- }
- return aElement === bElement;
- })
- );
-}
-
-/** The structure of a serialized DependentDropdownOptionsChange. */
-export interface DependentDropdownOptionsChangeJson
- extends Blockly.Events.BlockBaseJson {
- name: string;
- newValue: string;
- oldValue: string;
- oldOptions: Blockly.MenuOption[];
- newOptions: Blockly.MenuOption[];
-}
-
-/**
- * A change event representing a simultaneous change to a dropdown field's
- * options and value. The old value must be one of the old options, and the new
- * value must be one of the new options. Unlike a normal value change event,
- * it's possible for this event to change the value to something that wasn't
- * previously one of the valid options--in either direction--by also changing
- * the options at the same time.
- */
-export class DependentDropdownOptionsChange extends Blockly.Events.BlockBase {
- /** The name to register with Blockly for the type of event. */
-
- static readonly EVENT_TYPE: string = 'dropdown_options_change';
-
- /** The name of the change event type for registering with Blockly. */
- readonly type = DependentDropdownOptionsChange.EVENT_TYPE;
-
- /** The name of the field that changed. */
- name?: string;
-
- /** The original value of the field. */
- oldValue?: string;
-
- /** The new value of the field. */
- newValue?: string;
-
- /** The original available options for the dropdown field. */
- oldOptions?: Blockly.MenuOption[];
-
- /** The new available options for the dropdown field. */
- newOptions?: Blockly.MenuOption[];
-
- /**
- * Construct a new DependentDropdownOptionsChange.
- *
- * @param block The changed block. Undefined for a blank event.
- * @param name Name of the field affected.
- * @param oldValue Previous value of field.
- * @param newValue New value of field.
- * @param oldOptions Previous options for the dropdown.
- * @param newOptions New options for the dropdown.
- */
- constructor(
- block?: Blockly.Block,
- name?: string,
- oldValue?: string,
- newValue?: string,
- oldOptions?: Blockly.MenuOption[],
- newOptions?: Blockly.MenuOption[],
- ) {
- super(block);
-
- if (
- !block ||
- !name ||
- !oldValue ||
- !newValue ||
- !oldOptions ||
- !newOptions
- ) {
- // Blank event to be populated by fromJson.
- return;
- }
-
- this.name = name;
- this.oldValue = oldValue;
- this.newValue = newValue;
- this.oldOptions = oldOptions;
- this.newOptions = newOptions;
- }
-
- /**
- * Encode the event as JSON.
- *
- * @returns JSON representation.
- */
- toJson(): DependentDropdownOptionsChangeJson {
- const json = super.toJson() as DependentDropdownOptionsChangeJson;
- if (
- !this.name ||
- !this.oldValue ||
- !this.newValue ||
- !this.oldOptions ||
- !this.newOptions
- ) {
- throw new Error(
- 'The changed element is undefined. Either pass all needed ' +
- 'parameters to the constructor, or call fromJson.',
- );
- }
- json['name'] = this.name;
- json['oldValue'] = this.oldValue;
- json['newValue'] = this.newValue;
- json['oldOptions'] = this.oldOptions;
- json['newOptions'] = this.newOptions;
- return json;
- }
-
- /**
- * Decode the JSON event.
- *
- * @param json JSON representation.
- * @param workspace
- * @param event
- * @returns The deserialized event.
- */
- static fromJson(
- json: DependentDropdownOptionsChangeJson,
- workspace: Blockly.Workspace,
- /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
- event?: any,
- ): DependentDropdownOptionsChange {
- const newEvent = super.fromJson(
- json,
- workspace,
- event,
- ) as DependentDropdownOptionsChange;
- newEvent.name = json['name'];
- newEvent.oldValue = json['oldValue'];
- newEvent.newValue = json['newValue'];
- newEvent.oldOptions = json['oldOptions'];
- newEvent.newOptions = json['newOptions'];
- return newEvent;
- }
-
- /**
- * Does this event leave all state as it was before?
- *
- * @returns False if something changed.
- */
- isNull(): boolean {
- const valuesAreEqual = this.oldValue === this.newValue;
- const optionsAreEquivalent =
- this.oldOptions === this.newOptions ||
- (Array.isArray(this.oldOptions) &&
- Array.isArray(this.newOptions) &&
- arraysAreEquivalent(this.oldOptions, this.newOptions));
- return valuesAreEqual && optionsAreEquivalent;
- }
-
- /**
- * Run a change event.
- *
- * @param forward True if run forward, false if run backward (undo).
- */
- run(forward: boolean): void {
- if (
- !this.blockId ||
- !this.name ||
- !this.oldValue ||
- !this.newValue ||
- !this.oldOptions ||
- !this.newOptions
- ) {
- console.warn("Can't run uninitialized event.");
- return;
- }
- const workspace = this.getEventWorkspace_();
- const block = workspace.getBlockById(this.blockId);
- if (!block) {
- console.warn("Can't change non-existent block: " + this.blockId);
- return;
- }
-
- const dropdown = block.getField(this.name) as FieldDependentDropdown;
- if (!dropdown) {
- console.warn("Can't change non-existent dropdown field: " + this.name);
- return;
- }
-
- const value = forward ? this.newValue : this.oldValue;
- const options = forward ? this.newOptions : this.oldOptions;
-
- // Record the options on the dropdown for the option generator to access.
- dropdown.dependencyData.derivedOptions = options;
-
- // Re-run the option generator to update the options on the dropdown.
- dropdown.getOptions(false);
-
- // Set the value to one of the now-available options.
- dropdown.setValue(value);
- }
-}
-
-Blockly.registry.register(
- Blockly.registry.Type.EVENT,
- DependentDropdownOptionsChange.EVENT_TYPE,
- DependentDropdownOptionsChange,
-);
diff --git a/plugins/field-dependent-dropdown/src/field_dependent_dropdown.ts b/plugins/field-dependent-dropdown/src/field_dependent_dropdown.ts
deleted file mode 100644
index e2348bcd4..000000000
--- a/plugins/field-dependent-dropdown/src/field_dependent_dropdown.ts
+++ /dev/null
@@ -1,319 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview A Blockly dropdown menu field where the options can change
- * depending on the value of another field.
- */
-
-import * as Blockly from 'blockly/core';
-import {DependentDropdownOptionsChange} from './dependent_dropdown_options_change';
-
-/** The type of the mapping from parent value to child options. */
-export interface ChildOptionMapping {
- [key: string]: Blockly.MenuOption[];
-}
-
-// This type isn't exported from Blockly so we have to derive it from the API.
-type FieldConfig = Exclude<
- ConstructorParameters[2],
- undefined
->;
-
-/** fromJson config for a dependent dropdown field. */
-export interface FieldDependentDropdownFromJsonConfig extends FieldConfig {
- parentName: string;
- optionMapping: ChildOptionMapping;
- defaultOptions?: Blockly.MenuOption[];
-}
-
-/**
- * A structure for managing data needed by the menu generator of a
- * FieldDependentDropdown.
- */
-interface DependencyData {
- /**
- * A reference to the parent field of an associated dependent dropdown. Absent
- * until the parent field is initialized. This field's value determines the
- * available options of the child field.
- */
- parentField?: Blockly.Field;
-
- /**
- * The child field's currently available menu options based on the current
- * value of the parent field. Absent until the parent field is initialized.
- */
- derivedOptions?: Blockly.MenuOption[];
-}
-
-/**
- * A dropdown field that automatically updates its own options based on a
- * mapping from a parent field's value. The parent field must be attached to the
- * block before this child field.
- *
- * When this field is attached to a block, it will find the parent field and
- * attach a validator to the parent field that intercepts changes to its value
- * to update the options on this field. If the new validator is later removed\
- * or replaced, then this dependent field will no longer function.
- */
-export class FieldDependentDropdown extends Blockly.FieldDropdown {
- /**
- * Contains data used by this dropdown field's menu generator.
- *
- * The menu generator cannot refer directly to this FieldDependentDropdown
- * instance, because it must be created before calling the super constructor
- * when the "this" reference is not yet valid. This helper structure is used
- * instead.
- *
- * This is public so that the DependentDropdownOptionsChangeJson event can
- * update it while undoing/redoing.
- */
- dependencyData: DependencyData;
-
- /** The name of the field that determines this field's options. */
- private parentName: string;
-
- /**
- * The mapping from the parent field's value to this field's intended
- * available options. The keys are strings representing the parent's possible
- * values, and the values are the corresponding options to use in this child
- * field.
- */
- private optionMapping: ChildOptionMapping;
-
- /**
- * An optional fallback set of options to use if the parent field's value does
- * not match any of the keys in optionMapping.
- */
- private defaultOptions?: Blockly.MenuOption[];
-
- /**
- * Constructs a new FieldDependentDropdown.
- *
- * @param parentName The name of the parent field whose value determines this
- * field's available options.
- * @param optionMapping A mapping from the possible values of the parent field
- * to the corresponding available options of this child field. The keys are
- * the possible values of the parent field, and the values are the
- * corresponding arrays of options for this child field.
- * @param defaultOptions An optional fallback set of options to use if the
- * parent field's value does not match any of the keys in optionMapping.
- * @param validator An optional function that is called to validate changes to
- * this field's value.
- * @param config An optional map of general options used to configure the
- * field, such as a tooltip.
- */
- constructor(
- parentName: string,
- optionMapping: ChildOptionMapping,
- defaultOptions?: Blockly.MenuOption[],
- validator?: Blockly.FieldValidator,
- config?: FieldConfig,
- ) {
- // A menu generator needs to be passed to the super constructor, but it
- // needs to be able to reference data that hasn't been populated yet. We're
- // not allowed to refer to "this" in this constructor before calling
- // "super", so let's make separate structure to hold data relevant to the
- // menu generator and populate that later.
- const dependencyData: DependencyData = {};
-
- // A menu option generator function for this child field that reads the
- // derived options in the dependency data if available.
- const menuGenerator: Blockly.MenuGeneratorFunction = () => {
- // If derivedOptions has been initialized, use that.
- if (dependencyData.derivedOptions) {
- return dependencyData.derivedOptions;
- }
-
- // Fall back on the options corresponding to the parent field's current
- // value (which is fine when initializing but may be out of date when
- // making changes since the parent field's validator function triggers
- // this function before the parent field's value is updated).
-
- // If the parent field exists, and its value is a key in the provided
- // option mapping, use the corresponding options.
- if (dependencyData.parentField) {
- const value = dependencyData.parentField.getValue();
- if (value) {
- const options = optionMapping[value];
- if (options) {
- return options;
- }
- }
- }
-
- if (defaultOptions) {
- return defaultOptions;
- }
-
- // Fall back on basic default options.
- return [['', '']];
- };
-
- super(menuGenerator, validator, config);
- this.parentName = parentName;
- this.optionMapping = optionMapping;
- this.defaultOptions = defaultOptions;
- this.dependencyData = dependencyData;
- }
-
- /**
- * Constructs a FieldDependentDropdown from a JSON arg object.
- *
- * @param options A JSON object providing "parentName" and "optionMapping".
- * @returns The new field instance.
- */
- static fromJson(
- options: FieldDependentDropdownFromJsonConfig,
- ): FieldDependentDropdown {
- return new FieldDependentDropdown(
- options['parentName'],
- options['optionMapping'],
- options['defaultOptions'],
- undefined,
- options,
- );
- }
-
- /**
- * Attach this field to a block.
- *
- * @param block The block containing this field.
- */
- setSourceBlock(block: Blockly.Block) {
- super.setSourceBlock(block);
-
- const parentField: Blockly.Field | null = block.getField(
- this.parentName,
- );
-
- if (!parentField) {
- throw new Error(
- 'Could not find a parent field with the name ' +
- this.parentName +
- ' for the dependent dropdown.',
- );
- }
-
- this.dependencyData.parentField = parentField;
-
- const oldValidator = parentField.getValidator();
-
- // A validator function for the parent field that has the side effect of
- // updating the options of this child dropdown field based on the new value
- // of the parent field whenever it changes. The validator function is a good
- // place to do this because it is called immediately while deserializing
- // workspaces before the following fields are deserialized, so when the
- // child value is deserialized the appropriate options will already be
- // available. If the parent already had a validator function, it will be
- // composed with this one and the new value returned from it will be the
- // basis for determining the new available options.
- parentField.setValidator((newValue) => {
- if (oldValidator) {
- const validatedValue = oldValidator(newValue);
- // If a validator returns null, that means the new value is invalid and
- // the change should be canceled.
- if (validatedValue === null) {
- return null;
- }
- // If a validator returns undefined, that means no change. Otherwise,
- // use the returned value as the new value.
- if (validatedValue !== undefined) {
- newValue = validatedValue;
- }
- }
- this.updateOptionsBasedOnNewValue(newValue);
- return newValue;
- });
- this.updateOptionsBasedOnNewValue(parentField.getValue() ?? undefined);
- }
-
- /**
- * Updates the options of this child dropdown field based on the new value of
- * the parent field.
- *
- * @param newValue The newly assigned value.
- */
- private updateOptionsBasedOnNewValue(newValue: string | undefined): void {
- if (newValue == undefined) {
- return;
- }
-
- const block = this.getSourceBlock();
- if (!block) {
- throw new Error(
- 'Could not validate a field that is not attached to a block: ' +
- this.name,
- );
- }
-
- const oldChildValue = this.getValue();
- const oldChildOptions = this.getOptions(false);
- let newChildOptions = this.optionMapping[newValue];
- if (!newChildOptions) {
- if (this.defaultOptions) {
- newChildOptions = this.defaultOptions;
- } else {
- console.warn(
- 'Could not find child options for the parent value: ' + newValue,
- );
- return;
- }
- }
-
- // If the child field's value is still available in the new options, keep
- // it, otherwise change the field's value to the first available option.
- const newOptionsIncludeOldValue =
- newChildOptions.find((option) => option[1] == oldChildValue) != undefined;
- const newChildValue = newOptionsIncludeOldValue
- ? oldChildValue
- : newChildOptions[0][1];
-
- // Record the options so that the option generator can access them.
- this.dependencyData.derivedOptions = newChildOptions;
-
- // Re-run the option generator to update the options on the dropdown.
- this.getOptions(false);
-
- // Update this child field's value without broadcasting the normal change
- // event. The normal value change event can't be properly undone, because
- // the old value may not be one of the currently valid options, so a custom
- // change event will be broadcast instead that handles swapping the options
- // and the value at the same time.
- Blockly.Events.disable();
- this.setValue(newChildValue);
- Blockly.Events.enable();
-
- if (Blockly.Events.getRecordUndo()) {
- if (!Blockly.Events.getGroup()) {
- // Start a change group before the change event. The change event for
- // the parent field value will be created after this function returns
- // and will be part of the same group.
- Blockly.Events.setGroup(true);
- // Clear the change group later, after all related events have been
- // broadcast, but before the user performs any more actions.
- setTimeout(() => Blockly.Events.setGroup(false));
- }
-
- // Record that the child field's options and value have changed.
- Blockly.Events.fire(
- new DependentDropdownOptionsChange(
- block,
- this.name,
- oldChildValue ?? undefined,
- newChildValue ?? undefined,
- oldChildOptions,
- newChildOptions,
- ),
- );
- }
- }
-}
-
-Blockly.fieldRegistry.register(
- 'field_dependent_dropdown',
- FieldDependentDropdown,
-);
diff --git a/plugins/field-dependent-dropdown/src/index.ts b/plugins/field-dependent-dropdown/src/index.ts
deleted file mode 100644
index e837ff51f..000000000
--- a/plugins/field-dependent-dropdown/src/index.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-export * from './field_dependent_dropdown';
diff --git a/plugins/field-dependent-dropdown/test/field_dependent_dropdown.mocha.js b/plugins/field-dependent-dropdown/test/field_dependent_dropdown.mocha.js
deleted file mode 100644
index 61d32499a..000000000
--- a/plugins/field-dependent-dropdown/test/field_dependent_dropdown.mocha.js
+++ /dev/null
@@ -1,302 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const chai = require('chai');
-const sinon = require('sinon');
-const Blockly = require('blockly');
-require('./field_dependent_dropdown_test_block');
-
-const assert = chai.assert;
-
-suite('fieldDependentDropdown', function () {
- setup(function () {
- this.workspace = new Blockly.Workspace();
- this.clock = sinon.useFakeTimers();
- });
-
- teardown(function () {
- this.workspace.dispose();
- // Finish any remaining queued events then dispose the sinon environment.
- this.clock.runAll();
- this.clock.restore();
- });
-
- test('Changing a parent value changes the child options', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ['Shared', 'shared'],
- ]);
- parentDropdown.setValue('b');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['B1', 'b1'],
- ['B2', 'b2'],
- ['Shared', 'shared'],
- ]);
- });
-
- test('Changing a parent value changes the child value', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- assert.equal(childDropdown.getValue(), 'a1');
- parentDropdown.setValue('b');
- assert.equal(childDropdown.getValue(), 'b1');
- });
-
- test('Changing a parent value preserves shared child value', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- childDropdown.setValue('shared');
- parentDropdown.setValue('b');
- assert.equal(childDropdown.getValue(), 'shared');
- });
-
- test('Changing a parent value changes the grandchild options', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.deepEqual(grandchildDropdown.getOptions(true), [
- ['A11', 'a11'],
- ['A12', 'a12'],
- ]);
- parentDropdown.setValue('b');
- assert.deepEqual(grandchildDropdown.getOptions(true), [
- ['B11', 'b11'],
- ['B12', 'b12'],
- ]);
- });
-
- test('Changing a parent value changes the grandchild value', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.equal(grandchildDropdown.getValue(), 'a11');
- parentDropdown.setValue('b');
- assert.equal(grandchildDropdown.getValue(), 'b11');
- });
-
- test('Uses default options if parent field not in mapping', function () {
- const block = this.workspace.newBlock(
- 'dependent_dropdown_default_options_test',
- );
- const parentTextInput = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['Default Option', 'defaultOption'],
- ]);
- parentTextInput.setValue('a');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ]);
- parentTextInput.setValue('b');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['Default Option', 'defaultOption'],
- ]);
- });
-
- test('Parent field user validator composes with new validator', function () {
- const block = this.workspace.newBlock('dependent_dropdown_validation_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- assert.equal(parentDropdown.getValue(), 'initial');
- assert.equal(childDropdown.getValue(), 'initial1');
- parentDropdown.setValue('invalid');
- assert.equal(parentDropdown.getValue(), 'valid');
- assert.equal(childDropdown.getValue(), 'valid1');
- });
-
- test('undoing parent change undoes child and grandchild options', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- parentDropdown.setValue('b');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['B1', 'b1'],
- ['B2', 'b2'],
- ['Shared', 'shared'],
- ]);
- assert.deepEqual(grandchildDropdown.getOptions(true), [
- ['B11', 'b11'],
- ['B12', 'b12'],
- ]);
- // Wait for the change events to get fired and recorded in history.
- this.clock.runAll();
- this.workspace.undo(false);
- assert.deepEqual(childDropdown.getOptions(true), [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ['Shared', 'shared'],
- ]);
- assert.deepEqual(grandchildDropdown.getOptions(true), [
- ['A11', 'a11'],
- ['A12', 'a12'],
- ]);
- });
-
- test('undoing parent change undoes child and grandchild values', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- parentDropdown.setValue('b');
- assert.equal(childDropdown.getValue(), 'b1');
- assert.equal(grandchildDropdown.getValue(), 'b11');
- // Wait for the change events to get fired and recorded in history.
- this.clock.runAll();
- this.workspace.undo(false);
- assert.equal(childDropdown.getValue(), 'a1');
- assert.equal(grandchildDropdown.getValue(), 'a11');
- });
-
- test('redoing parent change redoes child options', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- parentDropdown.setValue('b');
- // Wait for the change events to get fired and recorded in history.
- this.clock.runAll();
- this.workspace.undo(false);
- assert.deepEqual(childDropdown.getOptions(true), [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ['Shared', 'shared'],
- ]);
- this.workspace.undo(true);
- assert.deepEqual(childDropdown.getOptions(true), [
- ['B1', 'b1'],
- ['B2', 'b2'],
- ['Shared', 'shared'],
- ]);
- });
-
- test('redoing parent change redoes child values', function () {
- const block = this.workspace.newBlock('dependent_dropdown_test');
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- parentDropdown.setValue('b');
- // Wait for the change events to get fired and recorded in history.
- this.clock.runAll();
- this.workspace.undo(false);
- assert.equal(childDropdown.getValue(), 'a1');
- this.workspace.undo(true);
- assert.equal(childDropdown.getValue(), 'b1');
- });
-
- test('deserialized values affect available options', function () {
- const serializedWorkspace = {
- blocks: {
- blocks: [
- {
- type: 'dependent_dropdown_test',
- fields: {
- PARENT_FIELD: 'b',
- CHILD_FIELD: 'b2',
- GRANDCHILD_FIELD: 'b21',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(serializedWorkspace, this.workspace);
- const block = this.workspace.getBlocksByType(
- 'dependent_dropdown_test',
- false,
- )[0];
- const childDropdown = block.getField('CHILD_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.deepEqual(childDropdown.getOptions(true), [
- ['B1', 'b1'],
- ['B2', 'b2'],
- ['Shared', 'shared'],
- ]);
- assert.deepEqual(grandchildDropdown.getOptions(true), [
- ['B21', 'b21'],
- ['B22', 'b22'],
- ]);
- });
-
- test('deserializing preserves values not in default options', function () {
- const serializedWorkspace = {
- blocks: {
- blocks: [
- {
- type: 'dependent_dropdown_test',
- fields: {
- PARENT_FIELD: 'b',
- CHILD_FIELD: 'b2',
- GRANDCHILD_FIELD: 'b21',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(serializedWorkspace, this.workspace);
- const block = this.workspace.getBlocksByType(
- 'dependent_dropdown_test',
- false,
- )[0];
- const parentDropdown = block.getField('PARENT_FIELD');
- const childDropdown = block.getField('CHILD_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.equal(parentDropdown.getValue(), 'b');
- assert.equal(childDropdown.getValue(), 'b2');
- assert.equal(grandchildDropdown.getValue(), 'b21');
- });
-
- test('deserializing invalid value replaces with valid value', function () {
- const serializedWorkspace = {
- blocks: {
- blocks: [
- {
- type: 'dependent_dropdown_test',
- fields: {
- PARENT_FIELD: 'b',
- CHILD_FIELD: 'a2',
- GRANDCHILD_FIELD: 'b21',
- },
- },
- ],
- },
- };
- Blockly.serialization.workspaces.load(serializedWorkspace, this.workspace);
- const block = this.workspace.getBlocksByType(
- 'dependent_dropdown_test',
- false,
- )[0];
- const childDropdown = block.getField('CHILD_FIELD');
- const grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.equal(childDropdown.getValue(), 'b1');
- assert.equal(grandchildDropdown.getValue(), 'b11');
- });
-
- test('round trip serialization/deserialization preserves values', function () {
- let block = this.workspace.newBlock('dependent_dropdown_test');
- let parentDropdown = block.getField('PARENT_FIELD');
- let childDropdown = block.getField('CHILD_FIELD');
- let grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- parentDropdown.setValue('b');
- childDropdown.setValue('b2');
- grandchildDropdown.setValue('b21');
- const serializedWorkspace = Blockly.serialization.workspaces.save(
- this.workspace,
- );
- Blockly.serialization.workspaces.load(serializedWorkspace, this.workspace);
- block = this.workspace.getBlocksByType('dependent_dropdown_test', false)[0];
- parentDropdown = block.getField('PARENT_FIELD');
- childDropdown = block.getField('CHILD_FIELD');
- grandchildDropdown = block.getField('GRANDCHILD_FIELD');
- assert.equal(parentDropdown.getValue(), 'b');
- assert.equal(childDropdown.getValue(), 'b2');
- assert.equal(grandchildDropdown.getValue(), 'b21');
- });
-});
diff --git a/plugins/field-dependent-dropdown/test/field_dependent_dropdown_test_block.ts b/plugins/field-dependent-dropdown/test/field_dependent_dropdown_test_block.ts
deleted file mode 100644
index 2cf7c1804..000000000
--- a/plugins/field-dependent-dropdown/test/field_dependent_dropdown_test_block.ts
+++ /dev/null
@@ -1,130 +0,0 @@
-import * as Blockly from 'blockly';
-import {ChildOptionMapping, FieldDependentDropdown} from '../src/index';
-
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'dependent_dropdown_test',
- message0: 'Parent %1 Child %2 Grandchild %3',
- args0: [
- {
- type: 'field_dropdown',
- name: 'PARENT_FIELD',
- options: [
- ['A', 'a'],
- ['B', 'b'],
- ],
- },
- {
- type: 'field_dependent_dropdown',
- name: 'CHILD_FIELD',
- parentName: 'PARENT_FIELD',
- optionMapping: {
- a: [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ['Shared', 'shared'],
- ],
- b: [
- ['B1', 'b1'],
- ['B2', 'b2'],
- ['Shared', 'shared'],
- ],
- },
- },
- {
- type: 'field_dependent_dropdown',
- name: 'GRANDCHILD_FIELD',
- parentName: 'CHILD_FIELD',
- optionMapping: {
- a1: [
- ['A11', 'a11'],
- ['A12', 'a12'],
- ],
- a2: [
- ['A21', 'a21'],
- ['A22', 'a22'],
- ],
- b1: [
- ['B11', 'b11'],
- ['B12', 'b12'],
- ],
- b2: [
- ['B21', 'b21'],
- ['B22', 'b22'],
- ],
- shared: [['Only', 'only']],
- },
- },
- ],
- colour: 100,
- },
- {
- type: 'dependent_dropdown_default_options_test',
- message0: 'Parent %1 Child %2',
- args0: [
- {
- type: 'field_input',
- name: 'PARENT_FIELD',
- },
- {
- type: 'field_dependent_dropdown',
- name: 'CHILD_FIELD',
- parentName: 'PARENT_FIELD',
- optionMapping: {
- a: [
- ['A1', 'a1'],
- ['A2', 'a2'],
- ],
- },
- defaultOptions: [['Default Option', 'defaultOption']],
- },
- ],
- colour: 100,
- },
-]);
-
-Blockly.Blocks['dependent_dropdown_validation_test'] = {
- init: function () {
- const parentFieldName = 'PARENT_FIELD';
- const childFieldName = 'CHILD_FIELD';
- const parentOptions: Blockly.MenuOption[] = [
- ['Initial', 'initial'],
- ['Invalid', 'invalid'],
- ['Valid', 'valid'],
- ];
- const dependentOptions: ChildOptionMapping = {
- initial: [
- ['Initial1', 'initial1'],
- ['Initial2', 'initial2'],
- ],
- invalid: [
- ['Invalid1', 'invalid1'],
- ['Invalid2', 'invalid2'],
- ],
- valid: [
- ['Valid1', 'valid1'],
- ['Valid2', 'valid2'],
- ],
- };
- const parentValidator: Blockly.FieldDropdownValidator = function (
- newValue,
- ) {
- if (newValue == 'invalid') {
- return 'valid';
- }
- return undefined;
- };
- this.appendDummyInput()
- .appendField('Parent')
- .appendField(
- new Blockly.FieldDropdown(parentOptions, parentValidator),
- parentFieldName,
- )
- .appendField('Child')
- .appendField(
- new FieldDependentDropdown(parentFieldName, dependentOptions),
- childFieldName,
- );
- this.setColour(100);
- },
-};
diff --git a/plugins/field-dependent-dropdown/test/index.html b/plugins/field-dependent-dropdown/test/index.html
deleted file mode 100644
index eb2b560a7..000000000
--- a/plugins/field-dependent-dropdown/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Dependent Dropdown Field Playground
-
-
-
-
-
-
-
-
diff --git a/plugins/field-dependent-dropdown/test/index.ts b/plugins/field-dependent-dropdown/test/index.ts
deleted file mode 100644
index c69b2e98c..000000000
--- a/plugins/field-dependent-dropdown/test/index.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Dependent dropdown field test playground.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import './field_dependent_dropdown_test_block';
-
-const toolbox: Blockly.utils.toolbox.ToolboxDefinition = {
- kind: 'flyoutToolbox',
- contents: [
- {
- kind: 'block',
- type: 'dependent_dropdown_test',
- fields: {
- /* eslint-disable @typescript-eslint/naming-convention */
- PARENT_FIELD: 'b',
- CHILD_FIELD: 'b2',
- GRANDCHILD_FIELD: 'b21',
- /* eslint-enable @typescript-eslint/naming-convention */
- },
- },
- {
- kind: 'block',
- type: 'dependent_dropdown_default_options_test',
- },
- {
- kind: 'block',
- type: 'dependent_dropdown_validation_test',
- },
- ],
-};
-
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.WorkspaceSvg {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-dependent-dropdown/tsconfig.json b/plugins/field-dependent-dropdown/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-dependent-dropdown/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-grid-dropdown/CHANGELOG.md b/plugins/field-grid-dropdown/CHANGELOG.md
deleted file mode 100644
index 900fcadeb..000000000
--- a/plugins/field-grid-dropdown/CHANGELOG.md
+++ /dev/null
@@ -1,693 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-### Features
-
-* **field-grid-dropdown:** wrap vertical keyboard focus across columns
-
-### Bug Fixes
-
-* **field-grid-dropdown:** announce as a grid popup instead of a listbox
-* FieldGridDropdown recomputeAriaContext no longer throws an error ([#2741](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2741))
-
-
-## [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
-
-* Improve accessibility of grid and colour fields ([#2724](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2724))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.10](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.9...@blockly/field-grid-dropdown@6.0.10) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.8...@blockly/field-grid-dropdown@6.0.9) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.7...@blockly/field-grid-dropdown@6.0.8) (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))
-
-
-
-## [6.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.6...@blockly/field-grid-dropdown@6.0.7) (2026-01-05)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.5...@blockly/field-grid-dropdown@6.0.6) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.4...@blockly/field-grid-dropdown@6.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.3...@blockly/field-grid-dropdown@6.0.4) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.2...@blockly/field-grid-dropdown@6.0.3) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.1...@blockly/field-grid-dropdown@6.0.2) (2025-07-03)
-
-
-### Bug Fixes
-
-* prevent Enter/Space from propagating from Grid ([#2570](https://github.com/google/blockly-samples/issues/2570)) ([25ee5a9](https://github.com/google/blockly-samples/commit/25ee5a9a750d819c9dbf00d6513f3b9c6fd302fe))
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@6.0.0...@blockly/field-grid-dropdown@6.0.1) (2025-05-22)
-
-
-### Bug Fixes
-
-* **field-grid-dropdown:** add overflow:auto to enable scroll in grid dropdown container ([#2543](https://github.com/google/blockly-samples/issues/2543)) ([f38078d](https://github.com/google/blockly-samples/commit/f38078d6449e40903a4725b14d57aabf414e5bf5))
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.16...@blockly/field-grid-dropdown@6.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))
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.15...@blockly/field-grid-dropdown@5.0.16) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.14...@blockly/field-grid-dropdown@5.0.15) (2025-05-15)
-
-
-### Bug Fixes
-
-* **FieldGridDropdown:** Handle presence of HTMLElement in MenuOptions ([43bdfab](https://github.com/google/blockly-samples/commit/43bdfabeb658331d3991430ec92589ba415dac75))
-* Fix the field-grid-dropdown tests. ([452051e](https://github.com/google/blockly-samples/commit/452051e02520803e7cf85e63e0bfb8191a838a98))
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.13...@blockly/field-grid-dropdown@5.0.14) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.12...@blockly/field-grid-dropdown@5.0.13) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.11...@blockly/field-grid-dropdown@5.0.12) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.10...@blockly/field-grid-dropdown@5.0.11) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.9...@blockly/field-grid-dropdown@5.0.10) (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)
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.8...@blockly/field-grid-dropdown@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.7...@blockly/field-grid-dropdown@5.0.8) (2024-08-22)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.6...@blockly/field-grid-dropdown@5.0.7) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.5...@blockly/field-grid-dropdown@5.0.6) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.4...@blockly/field-grid-dropdown@5.0.5) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.3...@blockly/field-grid-dropdown@5.0.4) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.2...@blockly/field-grid-dropdown@5.0.3) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.1...@blockly/field-grid-dropdown@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@5.0.0...@blockly/field-grid-dropdown@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.16...@blockly/field-grid-dropdown@5.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))
-* 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))
-* remove some uses of generateFieldTextBlocks ([#2357](https://github.com/google/blockly-samples/issues/2357)) ([53b3fa4](https://github.com/google/blockly-samples/commit/53b3fa4604aabb1fc5240d41c8d1d389d4b15301))
-
-
-
-## [4.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.15...@blockly/field-grid-dropdown@4.0.16) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.14...@blockly/field-grid-dropdown@4.0.15) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.13...@blockly/field-grid-dropdown@4.0.14) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.12...@blockly/field-grid-dropdown@4.0.13) (2024-04-04)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.11...@blockly/field-grid-dropdown@4.0.12) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.10...@blockly/field-grid-dropdown@4.0.11) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.9...@blockly/field-grid-dropdown@4.0.10) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.8...@blockly/field-grid-dropdown@4.0.9) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.7...@blockly/field-grid-dropdown@4.0.8) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.6...@blockly/field-grid-dropdown@4.0.7) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.5...@blockly/field-grid-dropdown@4.0.6) (2023-10-30)
-
-
-### Bug Fixes
-
-* add the type property to the package.json next to the "main" property: ([#1955](https://github.com/google/blockly-samples/issues/1955)) ([abc713b](https://github.com/google/blockly-samples/commit/abc713b5f3c2941dd4e3a6cbde9060a19b80d189))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [4.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.4...@blockly/field-grid-dropdown@4.0.5) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.3...@blockly/field-grid-dropdown@4.0.4) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.2...@blockly/field-grid-dropdown@4.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.1...@blockly/field-grid-dropdown@4.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@4.0.0...@blockly/field-grid-dropdown@4.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@3.0.1...@blockly/field-grid-dropdown@4.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@3.0.0...@blockly/field-grid-dropdown@3.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.18...@blockly/field-grid-dropdown@3.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))
-
-
-
-## [2.0.18](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.17...@blockly/field-grid-dropdown@2.0.18) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.16...@blockly/field-grid-dropdown@2.0.17) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.15...@blockly/field-grid-dropdown@2.0.16) (2023-05-11)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.14...@blockly/field-grid-dropdown@2.0.15) (2023-05-04)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.13...@blockly/field-grid-dropdown@2.0.14) (2023-04-27)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.12...@blockly/field-grid-dropdown@2.0.13) (2023-04-13)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.11...@blockly/field-grid-dropdown@2.0.12) (2023-03-23)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.10...@blockly/field-grid-dropdown@2.0.11) (2023-03-09)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.9...@blockly/field-grid-dropdown@2.0.10) (2023-03-02)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.8...@blockly/field-grid-dropdown@2.0.9) (2023-02-23)
-
-
-### Bug Fixes
-
-* remove prepublishOnly scripts ([#1579](https://github.com/google/blockly-samples/issues/1579)) ([27da6cd](https://github.com/google/blockly-samples/commit/27da6cd04c38f6ba417f4e7446bb6218c475448d))
-
-
-
-## [2.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.7...@blockly/field-grid-dropdown@2.0.8) (2023-02-23)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.6...@blockly/field-grid-dropdown@2.0.7) (2023-02-16)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.5...@blockly/field-grid-dropdown@2.0.6) (2023-02-09)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.4...@blockly/field-grid-dropdown@2.0.5) (2023-01-26)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.3...@blockly/field-grid-dropdown@2.0.4) (2023-01-05)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.2...@blockly/field-grid-dropdown@2.0.3) (2022-12-15)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.1...@blockly/field-grid-dropdown@2.0.2) (2022-10-27)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@2.0.0...@blockly/field-grid-dropdown@2.0.1) (2022-10-13)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-grid-dropdown@1.0.47...@blockly/field-grid-dropdown@2.0.0) (2022-10-05)
-
-
-### ⚠ BREAKING CHANGES
-
-* update peer and devDependencies of all plugins to require Blockly v9 (#1314)
-
-### Bug Fixes
-
-* 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))
-
-
-
-## 1.0.47 (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.0.46 (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.0.44 (2022-07-21)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## 1.0.43 (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.0.42 (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.0.41 (2022-06-21)
-
-**Note:** Version bump only for package @blockly/field-grid-dropdown
-
-
-
-
-
-## 1.0.40 (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.0.39 (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/plugins/field-grid-dropdown/README.md b/plugins/field-grid-dropdown/README.md
deleted file mode 100644
index 90b8dd6ac..000000000
--- a/plugins/field-grid-dropdown/README.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# @blockly/field-grid-dropdown [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) dropdown field with grid layout.
-
-
-
-
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-grid-dropdown
-```
-
-### npm
-
-```
-npm install @blockly/field-grid-dropdown --save
-```
-
-## Usage
-
-This field accepts the same parameters as the [Blockly.FieldDropdown](https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/dropdown#creation)
-in Blockly core. The config object bag passed into this field accepts additional optional parameters:
-
-- `"columns"` to specify the number of columns in the dropdown field (must be an integer greater than 0).
- If not provided, the default is 3 columns.
-- `"primaryColour"` to specify the colour of the dropdown (must be a string CSS colour). If not provided,
- the dropdown color will match the primary colour of the parent block.
-- `"borderColour"` to specify the colour of the border of the dropdown (must be a string CSS colour). If
- not provided, the border colour will match the tertiary colour of the parent block.
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {FieldGridDropdown} from '@blockly/field-grid-dropdown';
-Blockly.Blocks['test_field_grid_dropdown'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('grid dropdown: ')
- .appendField(
- new FieldGridDropdown([
- ['A', 'A'],
- ['B', 'B'],
- ['C', 'C'],
- ['D', 'D'],
- ['E', 'E'],
- ['F', 'F'],
- ['G', 'G'],
- ['H', 'H'],
- ]),
- 'FIELDNAME',
- );
- },
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import '@blockly/field-grid-dropdown';
-Blockly.defineBlocksWithJsonArray([
- {
- type: 'test_field_grid_dropdown',
- message0: 'template: %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [
- ['A', 'A'],
- ['B', 'B'],
- ['C', 'C'],
- ['D', 'D'],
- ['E', 'E'],
- ['F', 'F'],
- ['G', 'G'],
- ['H', 'H'],
- ],
- },
- ],
- },
-]);
-```
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-grid-dropdown/package.json b/plugins/field-grid-dropdown/package.json
deleted file mode 100644
index 40299c9ba..000000000
--- a/plugins/field-grid-dropdown/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "name": "@blockly/field-grid-dropdown",
- "version": "13.2.0",
- "description": "A Blockly dropdown field with grid layout.",
- "scripts": {
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "npm run build && blockly-scripts predeploy",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "blockly-plugin",
- "blockly-field",
- "grid-dropdown"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-grid-dropdown#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-grid-dropdown"
- },
- "license": "Apache 2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-grid-dropdown/readme-media/dropdown-images.png b/plugins/field-grid-dropdown/readme-media/dropdown-images.png
deleted file mode 100644
index c5d091dd1..000000000
Binary files a/plugins/field-grid-dropdown/readme-media/dropdown-images.png and /dev/null differ
diff --git a/plugins/field-grid-dropdown/readme-media/dropdown.png b/plugins/field-grid-dropdown/readme-media/dropdown.png
deleted file mode 100644
index 62fad4e36..000000000
Binary files a/plugins/field-grid-dropdown/readme-media/dropdown.png and /dev/null differ
diff --git a/plugins/field-grid-dropdown/src/grid.ts b/plugins/field-grid-dropdown/src/grid.ts
deleted file mode 100644
index 3266c6113..000000000
--- a/plugins/field-grid-dropdown/src/grid.ts
+++ /dev/null
@@ -1,391 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {
- browserEvents,
- common,
- FieldDropdown,
- ImageProperties,
- MenuOption,
- utils,
- WorkspaceSvg,
-} from 'blockly/core';
-import {GridItem} from './grid_item';
-
-/**
- * Class for managing a group of items displayed in a grid.
- */
-export class Grid {
- /** Mapping from grid item ID to index in the items list. */
- private itemIndices = new Map();
-
- /** List of items displayed in this grid. */
- private items = new Array();
-
- /** Root DOM element of this grid. */
- private root: HTMLDivElement;
-
- /** Identifier for keydown handler to be unregistered in dispose(). */
- private keyDownHandler: browserEvents.Data | null = null;
-
- /** Identifier for pointermove handler to be unregistered in dispose(). */
- private pointerMoveHandler: browserEvents.Data | null = null;
-
- /** Function to be called when an item in this grid is selected. */
- private selectionCallback?: (selectedItem: GridItem) => void;
-
- /**
- * Creates a new Grid instance.
- *
- * @param container The parent element of this grid in the DOM.
- * @param options A list of MenuOption objects representing the items to be
- * shown in this grid.
- * @param columns The number of columns to display items in.
- * @param rtl True if this grid is being shown in a right-to-left environment.
- * @param selectionCallback Function to be called when an item in the grid is
- * selected.
- */
- constructor(
- container: HTMLElement,
- options: MenuOption[],
- private readonly columns: number,
- private readonly rtl: boolean,
- selectionCallback: (selectedItem: GridItem) => void,
- ) {
- this.selectionCallback = selectionCallback;
-
- this.root = document.createElement('div');
- this.root.className = 'blocklyFieldGrid';
- this.root.tabIndex = 0;
- utils.aria.setRole(this.root, utils.aria.Role.GRID);
- container.appendChild(this.root);
-
- this.populateItems(options);
-
- this.keyDownHandler = browserEvents.conditionalBind(
- this.root,
- 'keydown',
- this,
- this.onKeyDown,
- );
-
- this.pointerMoveHandler = browserEvents.conditionalBind(
- this.root,
- 'pointermove',
- this,
- this.onPointerMove,
- true,
- );
-
- if (columns >= 1) {
- this.columns = columns;
- this.root.style.setProperty('--grid-columns', `${this.columns}`);
- } else {
- throw new Error(`Number of columns must be >= 1; got ${columns}`);
- }
- }
-
- /**
- * Creates grid items in the DOM given a list of model objects.
- *
- * @param options A list of grid item model objects.
- */
- private populateItems(options: MenuOption[]) {
- let row = document.createElement('div');
- for (const [index, item] of options.entries()) {
- // TODO(#2507): Don't just ignore separators.
- if (item === FieldDropdown.SEPARATOR) continue;
-
- if (index % this.columns === 0) {
- row = document.createElement('div');
- row.className = 'blocklyFieldGridRow';
- utils.aria.setRole(row, utils.aria.Role.ROW);
- this.root.appendChild(row);
- }
-
- const [label, value, ariaLabel] = item;
- const content = (() => {
- if (isImageProperties(label)) {
- // Convert ImageProperties to an HTMLImageElement.
- const image = new Image(label.width, label.height);
- image.src = label.src;
- image.alt = label.alt || '';
- return image;
- }
- return label;
- })();
-
- const gridItem = new GridItem(
- row,
- content,
- value,
- ariaLabel,
- (selectedItem: GridItem) => {
- this.setSelectedValue(selectedItem.getValue());
- this.selectionCallback?.(selectedItem);
- },
- );
- this.itemIndices.set(gridItem.getId(), this.itemIndices.size);
- this.items.push(gridItem);
- }
- }
-
- /**
- * Disposes of this grid.
- */
- dispose() {
- this.selectionCallback = undefined;
- for (const item of this.items) {
- item.dispose();
- }
- this.itemIndices.clear();
- this.items.length = 0;
- if (this.keyDownHandler) {
- browserEvents.unbind(this.keyDownHandler);
- this.keyDownHandler = null;
- }
-
- if (this.pointerMoveHandler) {
- browserEvents.unbind(this.pointerMoveHandler);
- this.pointerMoveHandler = null;
- }
- this.root.remove();
- }
-
- /**
- * Handles a keydown event in the grid, generally by moving focus.
- *
- * @param e The keydown event to handle.
- */
- private onKeyDown(e: KeyboardEvent) {
- if (
- !this.items.length ||
- e.shiftKey ||
- e.ctrlKey ||
- e.metaKey ||
- e.altKey
- ) {
- return;
- }
-
- switch (e.key) {
- case 'ArrowUp':
- this.moveFocus(-1, true, false);
- break;
- case 'ArrowDown':
- this.moveFocus(1, true, false);
- break;
- case 'ArrowLeft':
- this.moveFocus(-1 * (this.rtl ? -1 : 1), true, true);
- break;
- case 'ArrowRight':
- this.moveFocus(1 * (this.rtl ? -1 : 1), true, true);
- break;
- case 'PageUp':
- case 'Home':
- this.moveFocus(0, false, true);
- break;
- case 'PageDown':
- case 'End':
- this.moveFocus(this.items.length - 1, false, true);
- break;
- case 'Enter':
- case 'Space':
- // Handled via GridItem click handler, so we want its default but it
- // must not propagate.
- e.stopPropagation();
- return;
- default:
- // Not a key the grid is interested in.
- return;
- }
- // The grid used this key, don't let it have secondary effects.
- e.preventDefault();
- e.stopPropagation();
- }
-
- /**
- * Handles a pointermove event in the grid by focusing the hovered item.
- *
- * @param e The pointermove event to handle.
- */
- private onPointerMove(e: PointerEvent) {
- // Don't highlight grid items on "pointermove" if the pointer didn't
- // actually move (but the content under it did due to e.g. scrolling into
- // view), or if the target isn't an Element, which should never happen, but
- // TS needs to be reassured of that.
- if (!(e.movementX || e.movementY) || !(e.target instanceof Element)) return;
-
- const gridItem = e.target.closest('.blocklyFieldGridItem');
- if (!gridItem) return;
-
- const targetId = gridItem.id;
- const targetIndex = this.itemIndices.get(targetId);
- if (targetIndex === undefined) return;
- this.moveFocus(targetIndex, false, true);
- }
-
- /**
- * Selects the item with the given value in the grid.
- *
- * @param value The value of the grid item to select.
- */
- setSelectedValue(value: string) {
- for (const [index, item] of this.items.entries()) {
- const selected = item.getValue() === value;
- item.setSelected(selected);
- if (selected) {
- this.moveFocus(index, false, true);
- }
- }
- }
-
- /**
- * Moves browser focus to the grid item at the given index.
- *
- * @param movementIndex The absolute or directionally relative index of the
- * item to focus.
- * @param relative True to interpret the index as relative to the currently
- * focused item, false to move focus to it as an absolute value.
- * @param horizontal True for a left/right move. False for an up/down move.
- * Vertical moves wrap to the next/previous column at column edges, but
- * do not wrap around the ends of the grid.
- */
- private moveFocus(
- movementIndex: number,
- relative: boolean,
- horizontal: boolean,
- ) {
- let targetIndex = movementIndex;
-
- if (relative) {
- const focusedItem = this.getFocusedItem();
- if (!focusedItem) return;
- const currentIndex = this.indexOfItem(focusedItem);
-
- if (horizontal) {
- targetIndex += currentIndex;
- } else {
- targetIndex = this.getVerticalTargetIndex(currentIndex, movementIndex);
- }
- }
-
- const targetItem = this.itemAtIndex(targetIndex);
- if (!targetItem) {
- const workspace = common.getMainWorkspace();
- if (workspace instanceof WorkspaceSvg) {
- workspace.getAudioManager().playErrorBeep();
- }
- return;
- }
-
- targetItem.focus();
- utils.aria.setState(
- this.root,
- utils.aria.State.ACTIVEDESCENDANT,
- targetItem.getId(),
- );
- }
-
- /**
- * Returns the index to focus after a vertical move from the given index.
- *
- * Prefers moving within the same column. At a column edge, wraps to the
- * first/last item of the adjacent column. Returns an out-of-bounds index
- * when movement is blocked at the start or end of the grid.
- *
- * @param currentIndex The currently focused item index.
- * @param direction 1 to move down, -1 to move up.
- * @returns The target item index.
- */
- private getVerticalTargetIndex(
- currentIndex: number,
- direction: number,
- ): number {
- // First try moving to the vertically adjacent item in the same column.
- const column = currentIndex % this.columns;
- const row = Math.floor(currentIndex / this.columns);
- const targetIndex = (row + direction) * this.columns + column;
-
- if (this.itemAtIndex(targetIndex)) {
- return targetIndex;
- }
-
- // We are past this column's edge, so wrap to the adjacent column.
- const targetColumn = column + direction;
- if (targetColumn < 0 || targetColumn >= this.columns) {
- return targetIndex;
- }
-
- const columnItems = this.items.filter(
- (item, i) => i % this.columns === targetColumn,
- );
- const item =
- direction > 0 ? columnItems[0] : columnItems[columnItems.length - 1];
- return this.indexOfItem(item);
- }
-
- /**
- * Returns the index of the given item within the grid.
- *
- * @param item The item to return the index of.
- * @returns The index of the given item within the grid.
- */
- private indexOfItem(item: GridItem): number {
- return this.itemIndices.get(item.getId()) ?? -1;
- }
-
- /**
- * Returns the GridItem object at the given index in the grid.
- *
- * @param index The index to retrieve the grid item at.
- * @returns The GridItem at the given index, or undefined if the index is
- * invalid.
- */
- private itemAtIndex(index: number): GridItem | undefined {
- return this.items[index];
- }
-
- /**
- * Returns the currently focused grid item, if any.
- *
- * @returns The focused grid item, or undefined if no item is focused.
- */
- private getFocusedItem(): GridItem | undefined {
- const element =
- this.root.querySelector('.blocklyFieldGridItem:focus') ??
- this.root.querySelector('.blocklyFieldGridItem');
- if (!element || !element.id) return undefined;
-
- const index = this.itemIndices.get(element.id);
- if (index === undefined) return undefined;
-
- return this.itemAtIndex(index);
- }
-}
-
-/**
- * Returns whether or not an object conforms to the ImageProperties
- * interface.
- *
- * @param obj The object to test.
- * @returns True iff the object conforms to ImageProperties.
- */
-// eslint-disable-next-line @typescript-eslint/no-explicit-any
-function isImageProperties(obj: any): obj is ImageProperties {
- return (
- obj &&
- typeof obj === 'object' &&
- 'src' in obj &&
- typeof obj.src === 'string' &&
- 'alt' in obj &&
- typeof obj.alt === 'string' &&
- 'width' in obj &&
- typeof obj.width === 'number' &&
- 'height' in obj &&
- typeof obj.height === 'number'
- );
-}
diff --git a/plugins/field-grid-dropdown/src/grid_item.ts b/plugins/field-grid-dropdown/src/grid_item.ts
deleted file mode 100644
index 3d78842b5..000000000
--- a/plugins/field-grid-dropdown/src/grid_item.ts
+++ /dev/null
@@ -1,198 +0,0 @@
-/**
- * @license
- * Copyright 2025 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {browserEvents, utils} from 'blockly/core';
-
-/**
- * Class representing an item in a grid.
- */
-export class GridItem {
- /** The DOM element for the grid item. */
- private element: HTMLButtonElement;
-
- /** Identifier for a click handler to unregister during dispose(). */
- private clickHandler: browserEvents.Data | null;
-
- /** Callback to invoke when this item is selected. */
- private selectionCallback: ((selectedItem: GridItem) => void) | null;
-
- /** Whether or not this item is currently selected. */
- private selected = false;
-
- /**
- * Creates a new GridItem.
- *
- * @param container The parent element of this grid item in the DOM.
- * @param content The content to display in this grid item.
- * @param value The programmatic value of this grid item.
- * @param ariaLabel An accessibility label that describes the contents of this
- * grid item to screenreaders.
- * @param selectionCallback Function to call when this item is selected.
- */
- constructor(
- container: HTMLElement,
- content: string | HTMLElement,
- private readonly value: string,
- ariaLabel: string | undefined,
- selectionCallback: (selectedItem: GridItem) => void,
- ) {
- this.selectionCallback = selectionCallback;
-
- const cell = document.createElement('div');
- utils.aria.setRole(cell, utils.aria.Role.GRIDCELL);
-
- this.element = document.createElement('button');
- this.element.id = utils.idGenerator.getNextUniqueId();
- this.element.className = 'blocklyFieldGridItem';
- this.clickHandler = browserEvents.conditionalBind(
- this.element,
- 'click',
- this,
- this.onClick,
- true,
- );
- cell.appendChild(this.element);
- container.appendChild(cell);
-
- const contentDom =
- typeof content === 'string' ? document.createTextNode(content) : content;
- this.element.appendChild(contentDom);
-
- if (ariaLabel) {
- utils.aria.setState(this.element, utils.aria.State.LABEL, ariaLabel);
- }
- }
-
- /**
- * Disposes of this grid item.
- */
- dispose() {
- this.selectionCallback = null;
- this.element.remove();
- if (this.clickHandler) {
- browserEvents.unbind(this.clickHandler);
- this.clickHandler = null;
- }
- }
-
- /**
- * Gets the unique (within the grid) ID for this grid item.
- *
- * @returns This item's unique ID.
- */
- getId(): string {
- return this.element.id;
- }
-
- /**
- * Gets the value associated with this grid item.
- *
- * @returns Value associated with this grid item.
- */
- getValue(): string {
- return this.value;
- }
-
- /**
- * Returns whether or not this grid item is selected.
- *
- * @returns True if this grid item is selected, otherwise false.
- */
- isSelected() {
- return this.selected;
- }
-
- /**
- * Sets whether or not this grid item is selected.
- *
- * @param selected True if this grid item should be selected, otherwise false.
- */
- setSelected(selected: boolean) {
- this.selected = selected;
- utils.aria.setState(this.element, utils.aria.State.SELECTED, this.selected);
- this.element.classList.toggle(
- 'blocklyFieldGridItemSelected',
- this.selected,
- );
- if (this.isSelected()) {
- this.focus();
- }
- }
-
- /**
- * Handles clicks on this grid item by marking it as selected.
- */
- private onClick() {
- this.setSelected(true);
- this.selectionCallback?.(this);
- }
-
- /**
- * Makes this grid item the browser focus target, and scrolls it into view
- * if needed.
- */
- focus() {
- // Focus the element, but don't scroll the document since that's too
- // aggressive.
- this.element.focus({preventScroll: true});
-
- const scrollingParent = this.element.offsetParent;
- if (!scrollingParent) return;
- const offsetTop = this.element.offsetTop;
- const scrollTop = scrollingParent.scrollTop;
- const spacing = this.getInterItemSpacing();
-
- // Scroll the element into view if it's offscreen above the grid's viewport.
- if (offsetTop < scrollTop) {
- scrollingParent.scrollTo(0, offsetTop - spacing);
- } else if (
- offsetTop + this.element.offsetHeight >
- scrollTop + scrollingParent.clientHeight
- ) {
- // Scroll into view if this item is below the grid's viewport.
- scrollingParent.scrollBy(
- 0,
- offsetTop +
- this.element.clientHeight -
- (scrollTop + scrollingParent.clientHeight) +
- spacing,
- );
- }
- }
-
- /**
- * Returns the vertical spacing between grid items in pixels.
- *
- * This value can be specified by the user in CSS, so we can't just use a
- * hardcoded value. Moreover, while we could check our computed style, the
- * grid gap can be specified in several units. Instead, this somewhat hackily
- * finds all the sibling items in this grid and loops through them until it
- * encounters one with a different vertical location from its predecessor,
- * then computes the effective gap based on their relative position and
- * height.
- *
- * @returns The vertical distance between items in this grid.
- */
- private getInterItemSpacing() {
- const grid = this.element.closest('.blocklyFieldGrid');
- if (!grid) return 0;
-
- const items = [
- ...grid.querySelectorAll('.blocklyFieldGridItem'),
- ] as HTMLElement[];
- if (!items.length) return 0;
-
- const initialTop = items[0].offsetTop;
- const initialHeight = items[0].offsetHeight;
- for (const item of items) {
- if (item.offsetTop !== initialTop) {
- return item.offsetTop - initialHeight - initialTop;
- }
- }
-
- return 0;
- }
-}
diff --git a/plugins/field-grid-dropdown/src/index.ts b/plugins/field-grid-dropdown/src/index.ts
deleted file mode 100644
index f0c881045..000000000
--- a/plugins/field-grid-dropdown/src/index.ts
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Grid dropdown field.
- * @author kozbial@google.com (Monica Kozbial)
- */
-
-import * as Blockly from 'blockly/core';
-import {Grid} from './grid';
-import type {GridItem} from './grid_item';
-
-/**
- * A config object for defining a field grid dropdown.
- */
-export interface FieldGridDropdownConfig extends Blockly.FieldDropdownConfig {
- columns?: string | number;
- primaryColour?: string;
- borderColour?: string;
-}
-
-/**
- * Construct a FieldGridDropdown from a JSON arg object.
- */
-export interface FieldGridDropdownFromJsonConfig extends FieldGridDropdownConfig {
- options?: Blockly.MenuGenerator;
-}
-
-type FieldGridDropdownValidator = Blockly.FieldDropdownValidator;
-
-/**
- * Grid dropdown field.
- */
-export class FieldGridDropdown extends Blockly.FieldDropdown {
- /**
- * The number of columns in the dropdown grid. Must be an integer value
- * greater than 0. Defaults to 3.
- */
- private columns = 3;
-
- private primaryColour?: string;
-
- private borderColour?: string;
-
- /** Object representing the grid of choices shown in the dropdown. */
- private grid: Grid | null = null;
-
- protected override ariaTypeName = Blockly.Msg['ARIA_TYPE_FIELD_GRID'];
-
- /**
- * Class for an grid dropdown field.
- *
- * @param menuGenerator A non-empty array of options for a dropdown list,
- * or a function which generates these options.
- * @param validator A function that is called to validate
- * changes to the field's value. Takes in a language-neutral dropdown
- * option & returns a validated language-neutral dropdown option, or null
- * to abort the change.
- * @param config A map of options used to configure the field.
- * See the [field creation documentation]{@link
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/dropdown#creation}
- * for a list of properties this parameter supports.
- * @extends {Blockly.Field}
- * @constructor
- * @throws {TypeError} If `menuGenerator` options are incorrectly structured.
- */
- constructor(
- menuGenerator: Blockly.MenuGenerator,
- validator?: FieldGridDropdownValidator,
- config?: FieldGridDropdownConfig,
- ) {
- super(menuGenerator, validator, config);
-
- if (config?.columns) {
- this.setColumns(parseInt(`${config.columns}`));
- }
-
- if (config && config.primaryColour) {
- this.primaryColour = config.primaryColour;
- }
-
- if (config && config.borderColour) {
- this.borderColour = config.borderColour;
- }
- }
-
- /**
- * Constructs a FieldGridDropdown from a JSON arg object.
- *
- * @param config A JSON object with options.
- * @returns The new field instance.
- * @package
- * @nocollapse
- */
- static fromJson(config: FieldGridDropdownFromJsonConfig) {
- if (!config.options) {
- throw new Error(
- 'options are required for the dropdown field. The ' +
- 'options property must be assigned an array of ' +
- '[humanReadableValue, languageNeutralValue] tuples.',
- );
- }
- // `this` might be a subclass of FieldDropdown if that class doesn't
- // override the static fromJson method.
- return new this(config.options, undefined, config);
- }
-
- /**
- * Sets the number of columns on the grid. Updates the styling to reflect.
- *
- * @param columns The number of columns. Is rounded to
- * an integer value and must be greater than 0. Invalid
- * values are ignored.
- */
- setColumns(columns: number) {
- if (!isNaN(columns) && columns >= 1) {
- this.columns = columns;
- // If the field is currently being shown, reload the grid.
- if (
- Blockly.DropDownDiv.getOwner() === this &&
- Blockly.DropDownDiv.isVisible()
- ) {
- this.grid?.dispose();
- this.showEditor_();
- }
- }
- }
-
- /**
- * Updates the ARIA roles and label for this field.
- */
- override recomputeAriaContext(): boolean {
- const shouldCustomize = super.recomputeAriaContext();
- if (!shouldCustomize) return false;
- const focusableElement = this.getFocusableElement();
- Blockly.utils.aria.setState(
- focusableElement,
- Blockly.utils.aria.State.HASPOPUP,
- 'grid',
- );
- Blockly.utils.aria.setState(
- focusableElement,
- Blockly.utils.aria.State.EXPANDED,
- !!this.grid,
- );
- return true;
- }
-
- /* eslint-disable @typescript-eslint/naming-convention */
- /**
- * Create a dropdown menu under the text.
- *
- * @param e Optional mouse event that triggered the field to open, or
- * undefined if triggered programmatically.
- */
- protected showEditor_(e?: MouseEvent) {
- Blockly.DropDownDiv.clearContent();
- const rtl = !!this.getSourceBlock()?.workspace.RTL;
- this.grid = new Grid(
- Blockly.DropDownDiv.getContentDiv(),
- this.getOptions(false),
- this.columns,
- rtl,
- (selectedItem: GridItem) => {
- Blockly.DropDownDiv.hideIfOwner(this);
- this.setValue(selectedItem.getValue());
- },
- );
-
- Blockly.DropDownDiv.getContentDiv().classList.add(
- 'blocklyFieldGridContainer',
- );
-
- const colours = this.getColours();
- if (colours && colours.border) {
- Blockly.DropDownDiv.setColour(colours.primary, colours.border);
- }
-
- Blockly.DropDownDiv.showPositionedByField(
- this,
- this.dropdownDispose_.bind(this),
- );
-
- const selectedValue = this.getValue();
- if (selectedValue) {
- this.grid.setSelectedValue(selectedValue);
- }
- this.recomputeAriaContext();
- }
-
- /**
- * Disposes of events and DOM-references belonging to the dropdown editor.
- */
- protected override dropdownDispose_() {
- // Keep aria-expanded accurate on later recomputes.
- this.grid = null;
- super.dropdownDispose_();
- this.recomputeAriaContext();
- }
-
- /**
- * Updates the field's value to the given value.
- *
- * @param newValue The new value for this field.
- */
- protected override doValueUpdate_(newValue: string) {
- super.doValueUpdate_(newValue);
- this.grid?.setSelectedValue(newValue);
- }
-
- /**
- * Determine the colours for the dropdowndiv. The dropdown should match block
- * colour unless other colours are specified in the config.
- *
- * @returns The colours to set for the dropdowndiv.
- */
- private getColours() {
- if (this.primaryColour && this.borderColour) {
- return {
- primary: this.primaryColour,
- border: this.borderColour,
- };
- }
-
- const sourceBlock = this.getSourceBlock();
- if (!(sourceBlock instanceof Blockly.BlockSvg)) return;
-
- const colourSource = sourceBlock.isShadow()
- ? sourceBlock.getParent()
- : sourceBlock;
- if (!colourSource) return;
-
- return {
- primary: this.primaryColour ?? colourSource.getColour(),
- border: this.borderColour ?? colourSource.getColourTertiary(),
- };
- }
-}
-
-Blockly.fieldRegistry.register('field_grid_dropdown', FieldGridDropdown);
-
-/**
- * CSS for grid field.
- */
-Blockly.Css.register(`
- .blocklyFieldGridContainer {
- padding: 7px;
- overflow: auto;
- }
-
- .blocklyFieldGrid {
- display: grid;
- grid-gap: 7px;
- grid-template-columns: repeat(var(--grid-columns), min-content);
- }
-
- .blocklyFieldGrid .blocklyFieldGridItem {
- border: 1px solid rgba(1, 1, 1, 0.5);
- border-radius: 4px;
- color: white;
- min-width: auto;
- background: none;
- white-space: nowrap;
- cursor: pointer;
- padding: 6px 15px;
- }
-
- .blocklyFieldGrid .blocklyFieldGridRow {
- display: contents;
- }
-
- .blocklyFieldGrid .blocklyFieldGridItem.blocklyFieldGridItemSelected {
- background-color: rgba(1, 1, 1, 0.25);
- }
-
- .blocklyFieldGrid .blocklyFieldGridItem:focus {
- box-shadow: 0 0 0 4px hsla(0, 0%, 100%, .2);
- outline: none;
- }
- `);
diff --git a/plugins/field-grid-dropdown/test/field_test.mocha.js b/plugins/field-grid-dropdown/test/field_test.mocha.js
deleted file mode 100644
index 6ba8fa1be..000000000
--- a/plugins/field-grid-dropdown/test/field_test.mocha.js
+++ /dev/null
@@ -1,218 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {FieldGridDropdown} = require('../src/index');
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldGridDropdown', function () {
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueCreationTestCases = [
- {title: 'Undefined', args: [undefined]},
- {title: 'Array Items not Arrays', args: [undefined]},
- {
- title: 'Array Items with Invalid IDs',
- args: [
- [
- ['1', 1],
- ['2', 2],
- ['3', 3],
- ],
- ],
- },
- {
- title: 'Array Items with Invalid Content',
- args: [
- [
- [1, '1'],
- [2, '2'],
- [3, '3'],
- ],
- ],
- },
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueCreationTestCases = [
- {
- title: 'Text Dropdown',
- value: 'A',
- expectedValue: 'A',
- expectedText: 'a',
- args: [
- [
- ['a', 'A'],
- ['b', 'B'],
- ['c', 'C'],
- ],
- ],
- },
- {
- title: 'Image Dropdown',
- value: 'A',
- expectedValue: 'A',
- expectedText: 'a',
- args: [
- [
- [{src: 'scrA', alt: 'a', width: 0, height: 0}, 'A'],
- [{src: 'scrB', alt: 'b', width: 0, height: 0}, 'B'],
- [{src: 'scrC', alt: 'c', width: 0, height: 0}, 'C'],
- ],
- ],
- },
- {
- title: 'Dynamic Text Dropdown',
- value: 'A',
- expectedValue: 'A',
- expectedText: 'a',
- args: [
- () => {
- return [
- ['a', 'A'],
- ['b', 'B'],
- ['c', 'C'],
- ];
- },
- ],
- },
- {
- title: 'Dynamic Image Dropdown',
- value: 'A',
- expectedValue: 'A',
- expectedText: 'a',
- args: [
- () => {
- return [
- [{src: 'scrA', alt: 'a', width: 0, height: 0}, 'A'],
- [{src: 'scrB', alt: 'b', width: 0, height: 0}, 'B'],
- [{src: 'scrC', alt: 'c', width: 0, height: 0}, 'C'],
- ];
- },
- ],
- },
- ];
- const addJson = function (testCase) {
- testCase.json = {options: testCase.args[0]};
- };
- invalidValueCreationTestCases.forEach(addJson);
- validValueCreationTestCases.forEach(addJson);
-
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {!FieldGridDropdown} field The field to check.
- * @param {!FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertFieldValue(field, testCase.expectedValue, testCase.expectedText);
- };
-
- runConstructorSuiteTests(
- FieldGridDropdown,
- validValueCreationTestCases,
- invalidValueCreationTestCases,
- validTestCaseAssertField,
- );
-
- runFromJsonSuiteTests(
- FieldGridDropdown,
- validValueCreationTestCases,
- invalidValueCreationTestCases,
- validTestCaseAssertField,
- );
-
- /**
- * Configuration for field tests with invalid values.
- * @type {!Array}
- */
- const invalidValueSetValueTestCases = [
- {title: 'Null', value: null},
- {title: 'Undefined', value: undefined},
- {title: 'Invalid ID', value: 'bad'},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {!Array}
- */
- const validValueSetValueTestCases = [
- {title: 'Valid ID', value: 'B', expectedValue: 'B', expectedText: 'b'},
- ];
-
- suite('setValue', function () {
- setup(function () {
- this.field = new FieldGridDropdown([
- ['a', 'A'],
- ['b', 'B'],
- ['c', 'C'],
- ]);
- });
- runSetValueTests(
- validValueSetValueTestCases,
- invalidValueSetValueTestCases,
- 'A',
- 'a',
- );
- });
-
- suite('Validators', function () {
- setup(function () {
- this.dropdownField = new FieldGridDropdown([
- ['1a', '1A'],
- ['1b', '1B'],
- ['1c', '1C'],
- ['2a', '2A'],
- ['2b', '2B'],
- ['2c', '2C'],
- ]);
- });
- teardown(function () {
- this.dropdownField.setValidator(null);
- });
- suite('Null Validator', function () {
- setup(function () {
- this.dropdownField.setValidator(function () {
- return null;
- });
- });
- test('New Value', function () {
- this.dropdownField.setValue('1B');
- assertFieldValue(this.dropdownField, '1A', '1a');
- });
- });
- suite('Force 1s Validator', function () {
- setup(function () {
- this.dropdownField.setValidator(function (newValue) {
- return '1' + newValue.charAt(1);
- });
- });
- test('New Value', function () {
- this.dropdownField.setValue('2B');
- assertFieldValue(this.dropdownField, '1B', '1b');
- });
- });
- suite('Returns Undefined Validator', function () {
- setup(function () {
- this.dropdownField.setValidator(function () {});
- });
- test('New Value', function () {
- this.dropdownField.setValue('1B');
- assertFieldValue(this.dropdownField, '1B', '1b');
- });
- });
- });
-});
diff --git a/plugins/field-grid-dropdown/test/index.html b/plugins/field-grid-dropdown/test/index.html
deleted file mode 100644
index 10cd0a0c1..000000000
--- a/plugins/field-grid-dropdown/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- Blockly Field Test
-
-
-
-
-
-
-
-
diff --git a/plugins/field-grid-dropdown/test/index.ts b/plugins/field-grid-dropdown/test/index.ts
deleted file mode 100644
index 9ccc35fd8..000000000
--- a/plugins/field-grid-dropdown/test/index.ts
+++ /dev/null
@@ -1,468 +0,0 @@
-/**
- * @license
- * Copyright 2020 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Field test.
- */
-
-import * as Blockly from 'blockly';
-import {createPlayground} from '@blockly/dev-tools';
-import '../src/index';
-
-/**
- * An array of blocks that are defined only for the purposes of
- * manually and visually testing the dropdown grid field.
- */
-const testBlockDefinitions = [
- {
- type: 'test_standard_field_values',
- message0: '%1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [['A', 'A']],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values',
- message0: 'Different text length %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [
- ['A', 'A'],
- ['long text ', 'long text'],
- ['B', 'B'],
- ['C', 'C'],
- [
- 'really really really loooooong text',
- 'really really really loooooong text',
- ],
- ['D', 'D'],
- ['E', 'E'],
- ],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_long_text_list',
- message0: 'Long text list %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [
- ['A', 'A'],
- ['B', 'B'],
- ['C', 'C'],
- ['D', 'D'],
- ['E', 'E'],
- ['D', 'F'],
- ['G', 'G'],
- ['H', 'H'],
- ['I', 'I'],
- ['J', 'J'],
- ['K', 'K'],
- ['L', 'L'],
- ['M', 'M'],
- ['N', 'N'],
- ['O', 'O'],
- ['P', 'P'],
- ['Q', 'Q'],
- ['R', 'R'],
- ['S', 'S'],
- ['T', 'T'],
- ['U', 'U'],
- ['V', 'V'],
- ['W', 'W'],
- ['X', 'X'],
- ['Y', 'Y'],
- ['Z', 'Z'],
- ],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_images',
- message0: 'Images %1',
- args0: [
- {
- type: 'field_grid_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',
- ],
- ],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_4_columns',
- message0: '4 columns %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- columns: '4',
- options: [
- ['A', 'A'],
- ['B', 'B'],
- ['C', 'C'],
- ['D', 'D'],
- ['E', 'E'],
- ['F', 'F'],
- ['G', 'G'],
- ['H', 'H'],
- ],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_custom_colours',
- message0: 'Custom colours %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- primaryColour: '#783105',
- borderColour: '#d6a587',
- options: [
- ['A', 'A'],
- ['B', 'B'],
- ['C', 'C'],
- ['D', 'D'],
- ['E', 'E'],
- ['F', 'F'],
- ['G', 'G'],
- ['H', 'H'],
- ],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_standard_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [['A', 'A']],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_custom_field_values_and_label',
- message0: 'block %1',
- args0: [
- {
- type: 'field_grid_dropdown',
- name: 'FIELDNAME',
- options: [['A', 'A']],
- alt: {
- type: 'field_label',
- text: `No field_grid_dropdown`,
- },
- },
- ],
- output: null,
- style: 'math_blocks',
- },
- {
- type: 'test_parent_block',
- message0: 'parent %1',
- args0: [
- {
- type: 'input_value',
- name: 'INPUT',
- },
- ],
- previousStatement: null,
- nextStatement: null,
- style: 'loop_blocks',
- },
-];
-
-Blockly.defineBlocksWithJsonArray(testBlockDefinitions);
-
-/**
- * A test toolbox containing the exported blocks and a variety of
- * test blocks to exercise the dropdown grid field in different contexts
- * (on a shadow block, as the only field on a block, etc).
- * These are in a simple toolbox, rather than a category toolbox, so that
- * they are all instantiated every time the test page is opened.
- */
-const jsonToolbox = {
- contents: [
- {
- kind: 'label',
- text: 'Test blocks: default field values',
- },
- {
- kind: 'block',
- type: 'test_standard_field_values',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_standard_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_standard_field_values_and_label',
- },
- },
- },
- },
- {
- kind: 'label',
- text: 'Test blocks: custom field values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_long_text_list',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_images',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_4_columns',
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_custom_colours',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values',
- },
- },
- },
- },
- {
- kind: 'block',
- type: 'test_custom_field_values_and_label',
- },
- {
- kind: 'block',
- type: 'test_parent_block',
- inputs: {
- INPUT: {
- shadow: {
- type: 'test_custom_field_values_and_label',
- },
- },
- },
- },
- ],
-};
-/**
- * Create a workspace.
- *
- * @param blocklyDiv The blockly container div.
- * @param options The Blockly options.
- * @returns The created workspace.
- */
-function createWorkspace(
- blocklyDiv: HTMLElement,
- options: Blockly.BlocklyOptions,
-): Blockly.Workspace {
- const workspace = Blockly.inject(blocklyDiv, options);
- return workspace;
-}
-
-document.addEventListener('DOMContentLoaded', function () {
- const defaultOptions: Blockly.BlocklyOptions = {
- toolbox: jsonToolbox,
- };
- const rootElement = document.getElementById('root');
- if (rootElement) {
- createPlayground(rootElement, createWorkspace, defaultOptions);
- }
-});
diff --git a/plugins/field-grid-dropdown/tsconfig.json b/plugins/field-grid-dropdown/tsconfig.json
deleted file mode 100644
index 99858c525..000000000
--- a/plugins/field-grid-dropdown/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "dist",
- "declaration": true,
- "declarationMap": true,
- "sourceMap": true,
- "module": "es2015",
- "moduleResolution": "bundler",
- "target": "es6",
- "strict": true
- },
- // NOTE: `test/**/*` is automatically included in `blockly-scripts start`.
- // Only src matters for production builds.
- "include": ["src"]
-}
diff --git a/plugins/field-multilineinput/CHANGELOG.md b/plugins/field-multilineinput/CHANGELOG.md
deleted file mode 100644
index c1ab6b43f..000000000
--- a/plugins/field-multilineinput/CHANGELOG.md
+++ /dev/null
@@ -1,519 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-## [13.2.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.1.0...v13.2.0) (2026-07-28)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [13.1.0](https://github.com/RaspberryPiFoundation/blockly-samples/compare/v13.0.0...v13.1.0) (2026-06-30)
-
-### ⚠ BREAKING CHANGES
-
-* make field-multilineinput keyboard navigable and accessible (#2729)
-* Bump Blockly dependency to v13 (#2704)
-
-### Features
-
-* make field-multilineinput keyboard navigable and accessible ([#2729](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2729))
-
-### Miscellaneous Chores
-
-* Bump Blockly dependency to v13 ([#2704](https://github.com/RaspberryPiFoundation/blockly-samples/issues/2704))
-
-
-## [6.0.9](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-multilineinput@6.0.8...@blockly/field-multilineinput@6.0.9) (2026-04-09)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.8](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-multilineinput@6.0.7...@blockly/field-multilineinput@6.0.8) (2026-01-15)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.7](https://github.com/RaspberryPiFoundation/blockly-samples/compare/@blockly/field-multilineinput@6.0.6...@blockly/field-multilineinput@6.0.7) (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))
-
-
-
-## [6.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.5...@blockly/field-multilineinput@6.0.6) (2026-01-05)
-
-
-### Bug Fixes
-
-* Merge multiline text readme to with pre-v11 documentation ([#2660](https://github.com/google/blockly-samples/issues/2660)) ([c8d0bd3](https://github.com/google/blockly-samples/commit/c8d0bd3b37d7e6765e7761066c4033d422ec4470))
-
-
-
-## [6.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.4...@blockly/field-multilineinput@6.0.5) (2025-12-19)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.3...@blockly/field-multilineinput@6.0.4) (2025-12-19)
-
-
-### Bug Fixes
-
-* Use getTextWidth instead of getFastTextWidth ([#2632](https://github.com/google/blockly-samples/issues/2632)) ([affcd6e](https://github.com/google/blockly-samples/commit/affcd6ed28506c3640f3a77700640d38eec43841))
-
-
-
-## [6.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.2...@blockly/field-multilineinput@6.0.3) (2025-10-02)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.1...@blockly/field-multilineinput@6.0.2) (2025-07-17)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@6.0.0...@blockly/field-multilineinput@6.0.1) (2025-05-22)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [6.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.17...@blockly/field-multilineinput@6.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))
-
-
-
-## [5.0.17](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.16...@blockly/field-multilineinput@5.0.17) (2025-05-16)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.16](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.15...@blockly/field-multilineinput@5.0.16) (2025-05-15)
-
-
-### Bug Fixes
-
-* Fix multi-line text color by using the correct class ([91a8473](https://github.com/google/blockly-samples/commit/91a8473736b5c0cc3e04c809f4a888469bc96f77))
-
-
-### Reverts
-
-* "fix(FieldMultilineInput): Use string literal instead of Field.NBSP" ([539ae4f](https://github.com/google/blockly-samples/commit/539ae4fe4499fca3d781c29f462836ac64d45ce6))
-
-
-
-
-
-## [5.0.15](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.14...@blockly/field-multilineinput@5.0.15) (2025-02-13)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.13...@blockly/field-multilineinput@5.0.14) (2024-12-19)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.12...@blockly/field-multilineinput@5.0.13) (2024-12-03)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.11...@blockly/field-multilineinput@5.0.12) (2024-11-07)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.10...@blockly/field-multilineinput@5.0.11) (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)
-
-
-
-
-
-## [5.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.9...@blockly/field-multilineinput@5.0.10) (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))
-
-
-
-
-
-## [5.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.8...@blockly/field-multilineinput@5.0.9) (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))
-
-
-
-
-
-## [5.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.7...@blockly/field-multilineinput@5.0.8) (2024-08-08)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.6...@blockly/field-multilineinput@5.0.7) (2024-08-01)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.5...@blockly/field-multilineinput@5.0.6) (2024-07-25)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.4...@blockly/field-multilineinput@5.0.5) (2024-07-11)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.3...@blockly/field-multilineinput@5.0.4) (2024-07-04)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.2...@blockly/field-multilineinput@5.0.3) (2024-06-27)
-
-
-### Bug Fixes
-
-* **docs:** Update README for multiline field ([#2394](https://github.com/google/blockly-samples/issues/2394)) ([377d38c](https://github.com/google/blockly-samples/commit/377d38c919723861aa979bdcf210bedd474c3481))
-
-
-
-## [5.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.1...@blockly/field-multilineinput@5.0.2) (2024-06-06)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [5.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@5.0.0...@blockly/field-multilineinput@5.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))
-
-
-
-## [5.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@4.0.4...@blockly/field-multilineinput@5.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))
-* 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))
-
-
-
-## [4.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@4.0.3...@blockly/field-multilineinput@4.0.4) (2024-05-16)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [4.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@4.0.2...@blockly/field-multilineinput@4.0.3) (2024-05-09)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [4.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@4.0.1...@blockly/field-multilineinput@4.0.2) (2024-04-25)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [4.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@4.0.0...@blockly/field-multilineinput@4.0.1) (2024-04-11)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [4.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.14...@blockly/field-multilineinput@4.0.0) (2024-04-04)
-
-
-### ⚠ BREAKING CHANGES
-
-* The multiline text input field no longer registers itself on load. The developer must either manually register the field or install blocks, which will install the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-* The angle field no longer registers itself on load. The developer must manually register the field. This is part of a move to have no side effects in field and block definitions, so that tree-shaking can remove unwanted fields and blocks.
-
-### Features
-
-* add block definitions to fields ([#2299](https://github.com/google/blockly-samples/issues/2299)) ([c197af6](https://github.com/google/blockly-samples/commit/c197af6c67bc989bbdb4e83a62abc08167bcbbfe)), closes [#2162](https://github.com/google/blockly-samples/issues/2162) [#2202](https://github.com/google/blockly-samples/issues/2202) [#2221](https://github.com/google/blockly-samples/issues/2221) [#2211](https://github.com/google/blockly-samples/issues/2211) [#2220](https://github.com/google/blockly-samples/issues/2220) [#2232](https://github.com/google/blockly-samples/issues/2232) [#2233](https://github.com/google/blockly-samples/issues/2233) [#2296](https://github.com/google/blockly-samples/issues/2296)
-
-
-
-## [3.0.14](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.13...@blockly/field-multilineinput@3.0.14) (2024-03-28)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.13](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.12...@blockly/field-multilineinput@3.0.13) (2024-02-29)
-
-
-### Bug Fixes
-
-* updated field multiline to have enough width ([#2208](https://github.com/google/blockly-samples/issues/2208)) ([376691d](https://github.com/google/blockly-samples/commit/376691df5b8dad2e4bd5851f6c1d6a1fa5b6d1e3))
-
-
-
-## [3.0.12](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.11...@blockly/field-multilineinput@3.0.12) (2024-02-08)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.11](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.10...@blockly/field-multilineinput@3.0.11) (2023-12-14)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.10](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.9...@blockly/field-multilineinput@3.0.10) (2023-12-07)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.9](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.8...@blockly/field-multilineinput@3.0.9) (2023-11-09)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.8](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.7...@blockly/field-multilineinput@3.0.8) (2023-11-02)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.7](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.6...@blockly/field-multilineinput@3.0.7) (2023-10-30)
-
-
-### Bug Fixes
-
-* [#1905](https://github.com/google/blockly-samples/issues/1905) publish types for field-multiline ([#1957](https://github.com/google/blockly-samples/issues/1957)) ([4537b8c](https://github.com/google/blockly-samples/commit/4537b8c6479abf29ebb51fdccf6842c9a88e79a1))
-* **packaging:** Don't advertise non-existent ESM entrypoints ([#2022](https://github.com/google/blockly-samples/issues/2022)) ([d019198](https://github.com/google/blockly-samples/commit/d0191984399b784e2928b8fb4c58257bfa857655)), closes [#1877](https://github.com/google/blockly-samples/issues/1877)
-* update tsconfigs to publish types accurately ([df4b084](https://github.com/google/blockly-samples/commit/df4b0844af712f5025a2ec842458b828f3147676))
-* use includes rather than excludes ([40efc25](https://github.com/google/blockly-samples/commit/40efc255329e3ca476ccc247b95a2d05dd77b45e))
-
-
-
-## [3.0.6](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.5...@blockly/field-multilineinput@3.0.6) (2023-09-21)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.5](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.4...@blockly/field-multilineinput@3.0.5) (2023-09-14)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.4](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.3...@blockly/field-multilineinput@3.0.4) (2023-08-31)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.3](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.2...@blockly/field-multilineinput@3.0.3) (2023-08-17)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.2](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.1...@blockly/field-multilineinput@3.0.2) (2023-07-24)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@3.0.0...@blockly/field-multilineinput@3.0.1) (2023-07-20)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [3.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@2.0.1...@blockly/field-multilineinput@3.0.0) (2023-07-13)
-
-
-### ⚠ BREAKING CHANGES
-
-* updated `plugins/field-date` to TypeScript (#1705)
-
-### Features
-
-* updated `plugins/field-date` to TypeScript ([#1705](https://github.com/google/blockly-samples/issues/1705)) ([e5531ff](https://github.com/google/blockly-samples/commit/e5531fffe188ee361a16fe48ed126b34e51a8d30))
-
-
-
-## [2.0.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@2.0.0...@blockly/field-multilineinput@2.0.1) (2023-07-06)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [2.0.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@1.2.1...@blockly/field-multilineinput@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))
-
-
-
-## [1.2.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@1.2.0...@blockly/field-multilineinput@1.2.1) (2023-06-22)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## [1.2.0](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@1.1.1...@blockly/field-multilineinput@1.2.0) (2023-05-25)
-
-
-### Features
-
-* Revise fields ([#1700](https://github.com/google/blockly-samples/issues/1700)) ([c326f7b](https://github.com/google/blockly-samples/commit/c326f7b1ef54fe45387046c693ebd5afe2b2c571))
-
-
-
-## [1.1.1](https://github.com/google/blockly-samples/compare/@blockly/field-multilineinput@1.1.0...@blockly/field-multilineinput@1.1.1) (2023-05-18)
-
-**Note:** Version bump only for package @blockly/field-multilineinput
-
-
-
-
-
-## 1.1.0 (2023-05-11)
-
-
-### Features
-
-* Add angle, colour, and multiline fields. (Rebase of [#1674](https://github.com/google/blockly-samples/issues/1674)) ([#1693](https://github.com/google/blockly-samples/issues/1693)) ([1b447f4](https://github.com/google/blockly-samples/commit/1b447f41d6293f14e846b8a4d82d289a5637a99a))
diff --git a/plugins/field-multilineinput/README.md b/plugins/field-multilineinput/README.md
deleted file mode 100644
index 002e50a79..000000000
--- a/plugins/field-multilineinput/README.md
+++ /dev/null
@@ -1,237 +0,0 @@
-# @blockly/field-multilineinput [](https://github.com/google/blockly)
-
-A [Blockly](https://www.npmjs.com/package/blockly) multiline input field and
-associated block.
-
-#### Multiline input field
-
-
-
-#### Multiline input field with editor open
-
-
-
-#### Multiline input on collapsed block
-
-
-
-## Installation
-
-### Yarn
-
-```
-yarn add @blockly/field-multilineinput
-```
-
-### npm
-
-```
-npm install @blockly/field-multilineinput --save
-```
-
-## Usage
-
-This plugin adds a field of type `FieldMultilineInput` that is registered with
-the name `'field_multilinetext'`. It is a subclass of `Blockly.FieldInput`.
-
-This field stores a string as its value and a string as its text. Its value is
-always a valid string, while its text could be any string entered into its
-editor. Unlike a text input field, this field also supports newline characters
-entered in the editor.
-
-#### Editor keyboard shortcuts
-
-The default keyboard mapping is:
-
-| Key | Action |
-| ----------- | ------------------------------------------------- |
-| Enter | Commit the value and close the editor |
-| Shift+Enter | Insert a newline at the cursor |
-| Escape | Revert to the original value and close the editor |
-
-With `FieldMultilineInput.enterCommits = false` the mapping is swapped:
-
-| Key | Action |
-| ----------- | ------------------------------------------------- |
-| Enter | Insert a newline at the cursor |
-| Shift+Enter | Commit the value and close the editor |
-| Escape | Revert to the original value and close the editor |
-
-`enterCommits` and `showHint` are global (static) settings that apply to all
-fields. Set them once before creating your blocks:
-
-```js
-import {FieldMultilineInput} from '@blockly/field-multilineinput';
-
-FieldMultilineInput.enterCommits = false; // default: true
-FieldMultilineInput.showHint = false; // default: true
-```
-
-The constructor for this field accepts three optional parameters:
-
-- `value`: The default text. Defaults to `""`.
-- `validator`: A function that is called to validate what the user entered.
-- `config`: An object with optional properties:
- - `maxLines`: The maximum number of lines displayed before scrolling
- functionality is enabled. Defaults to `Infinity`.
- - `spellcheck`: Whether spell checking is enabled. Defaults to `true`.
- - `tooltip`: A tooltip.
-
-If you want to use only the field, you must register it with Blockly. You can
-do this by calling `registerFieldMultilineInput` before instantiating your
-blocks. If another field is registered under the same name, this field will
-overwrite it.
-
-### JavaScript
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldMultilineInput} from '@blockly/field-multilineinput';
-
-registerFieldMultilineInput();
-Blockly.Blocks['test_field_multilineinput'] = {
- init: function () {
- this.appendDummyInput()
- .appendField('multilineinput: ')
- .appendField(
- new FieldMultilineInput('some text \n with newlines'),
- 'FIELDNAME',
- );
- },
-};
-```
-
-### JSON
-
-```js
-import * as Blockly from 'blockly';
-import {registerFieldMultilineInput} from '@blockly/field-multilineinput';
-
-registerFieldMultilineInput();
-Blockly.defineBlocksWithJsonArray([
- {
- "type": "test_field_multilinetext",
- "message0": "multilineinput: %1",
- "args0": [
- {
- "type": "field_multilinetext",
- "name": "FIELDNAME",
- "text": "some text \n with newlines"
- }
- }]);
-```
-
-### Customization
-
-#### Spellcheck
-
-The `setSpellcheck` function can be used to set whether the field spellchecks
-its input text or not. Spellchecking is on by default.
-
-
-
-This applies to individual fields. If you want to modify all fields change the
-`Blockly.FieldMultilineInput.prototype.spellcheck_` property.
-
-#### Validation
-
-A multiline text input field's value is a string, so any validators must accept
-a string and return a string, `null`, or `undefined`.
-
-Here is an example of a validator that removes all 'a' characters from the
-string:
-
-```
-function(newValue) {
- return newValue.replace(/a/gm, '');
-}
-```
-
-
-
-### Serialization
-
-#### JSON
-
-The JSON for a multiline text input field looks like so:
-
-```json
-{
- "fields": {
- "FIELDNAME": "line1\nline2"
- }
-}
-```
-
-where `FIELDNAME` is a string referencing a multiline text input field, and the
-value is the value to apply to the field. The value follows the same rules as
-the constructor value.
-
-#### XML
-
-The XML for a multiline text input field looks like so:
-
-```xml
-line1 line2
-```
-
-where the field's `name` attribute contains a string referencing a multiline
-text input field, and the inner text is the value to apply to the field. The
-inner text value follows the same rules as the constructor value.
-
-### Blocks
-
-This package also provides a simple block containing a multiline input
-field. It has generators in JavaScript, Python, PHP, Lua, and Dart.
-
-You can install the block by calling `textMultiline.installBlock()`.
-This will install the block and all of its dependencies, including the
-multiline input field. When calling `installBlock` you can supply one or
-more `CodeGenerator` instances (e.g. `javascriptGenerator`), and the install
-function will also install the correct generator function for the
-corresponding language(s).
-
-```js
-import {javascriptGenerator} from 'blockly/javascript';
-import {dartGenerator} from 'blockly/dart';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-import {luaGenerator} from 'blockly/lua';
-import {textMultiline} from '@blockly/field-multilineinput';
-
-// Installs the block, the field, and all of the language generators.
-textMultiline.installBlock({
- javascript: javascriptGenerator,
- dart: dartGenerator,
- lua: luaGenerator,
- python: pythonGenerator,
- php: phpGenerator,
-});
-```
-
-### API reference
-
-Instance methods:
-
-- `setMaxLines`: Sets the maximum number of displayed lines before
- scrolling functionality is enabled.
-- `getMaxLines`: Returns the maximum number of displayed lines before
- scrolling functionality is enabled.
-- `setSpellcheck`: Sets whether spell checking is enabled.
-- `getSpellcheck`: Returns whether spell checking is enabled.
-
-Static (global) properties:
-
-- `FieldMultilineInput.enterCommits`: Whether pressing Enter commits the
- value (`true`, default) or inserts a newline (`false`). Applies to all
- fields.
-- `FieldMultilineInput.showHint`: Whether the keyboard-shortcut hint bar is
- shown in the editor. When `false`, no space is reserved for the hint bar.
- Applies to all fields.
-
-## License
-
-Apache 2.0
diff --git a/plugins/field-multilineinput/package.json b/plugins/field-multilineinput/package.json
deleted file mode 100644
index 1391bc8fe..000000000
--- a/plugins/field-multilineinput/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "name": "@blockly/field-multilineinput",
- "version": "13.2.0",
- "description": "A Blockly multilineinput field.",
- "scripts": {
- "audit:fix": "blockly-scripts auditFix",
- "build": "blockly-scripts build",
- "clean": "blockly-scripts clean",
- "lint": "eslint .",
- "predeploy": "blockly-scripts predeploy",
- "prepublishOnly": "npm run clean && npm run build",
- "start": "blockly-scripts start",
- "test": "blockly-scripts test"
- },
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "unpkg": "./dist/index.js",
- "author": "Blockly Team",
- "keywords": [
- "blockly",
- "field",
- "multilineinput"
- ],
- "homepage": "https://github.com/RaspberryPiFoundation/blockly-samples/tree/master/plugins/field-multilineinput#readme",
- "bugs": {
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples/issues"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/RaspberryPiFoundation/blockly-samples.git",
- "directory": "plugins/field-multilineinput"
- },
- "license": "Apache-2.0",
- "directories": {
- "dist": "dist",
- "src": "src"
- },
- "files": [
- "dist",
- "src"
- ],
- "devDependencies": {
- "@blockly/dev-scripts": "^13.2.0",
- "@blockly/dev-tools": "^13.2.0",
- "chai": "^6.2.2",
- "sinon": "^22.0.0",
- "typescript": "^6.0.3"
- },
- "peerDependencies": {
- "blockly": "^13.2.0"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/plugins/field-multilineinput/readme-media/collapsed.png b/plugins/field-multilineinput/readme-media/collapsed.png
deleted file mode 100644
index a227642a7..000000000
Binary files a/plugins/field-multilineinput/readme-media/collapsed.png and /dev/null differ
diff --git a/plugins/field-multilineinput/readme-media/on_block.png b/plugins/field-multilineinput/readme-media/on_block.png
deleted file mode 100644
index 6a52a4aa9..000000000
Binary files a/plugins/field-multilineinput/readme-media/on_block.png and /dev/null differ
diff --git a/plugins/field-multilineinput/readme-media/spellcheck.gif b/plugins/field-multilineinput/readme-media/spellcheck.gif
deleted file mode 100644
index 3f1ae53fa..000000000
Binary files a/plugins/field-multilineinput/readme-media/spellcheck.gif and /dev/null differ
diff --git a/plugins/field-multilineinput/readme-media/validator.gif b/plugins/field-multilineinput/readme-media/validator.gif
deleted file mode 100644
index b9e18a1dc..000000000
Binary files a/plugins/field-multilineinput/readme-media/validator.gif and /dev/null differ
diff --git a/plugins/field-multilineinput/readme-media/with_editor.png b/plugins/field-multilineinput/readme-media/with_editor.png
deleted file mode 100644
index 98dacf3a9..000000000
Binary files a/plugins/field-multilineinput/readme-media/with_editor.png and /dev/null differ
diff --git a/plugins/field-multilineinput/src/blocks/generatorsType.ts b/plugins/field-multilineinput/src/blocks/generatorsType.ts
deleted file mode 100644
index e9d2df460..000000000
--- a/plugins/field-multilineinput/src/blocks/generatorsType.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import type {JavascriptGenerator} from 'blockly/javascript';
-import type {DartGenerator} from 'blockly/dart';
-import type {LuaGenerator} from 'blockly/lua';
-import type {PhpGenerator} from 'blockly/php';
-import type {PythonGenerator} from 'blockly/python';
-
-/**
- * An object containing zero or more generators. This is passed
- * to block installation functions so that they may install
- * per-block generators on any languages they support.
- */
-export interface Generators {
- javascript?: JavascriptGenerator;
- dart?: DartGenerator;
- lua?: LuaGenerator;
- php?: PhpGenerator;
- python?: PythonGenerator;
-}
diff --git a/plugins/field-multilineinput/src/blocks/textMultiline.ts b/plugins/field-multilineinput/src/blocks/textMultiline.ts
deleted file mode 100644
index 831c79ed1..000000000
--- a/plugins/field-multilineinput/src/blocks/textMultiline.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import {Block, common as BlocklyCommon} from 'blockly/core';
-import {
- JavascriptGenerator,
- Order as JavascriptOrder,
-} from 'blockly/javascript';
-import {DartGenerator, Order as DartOrder} from 'blockly/dart';
-import {LuaGenerator, Order as LuaOrder} from 'blockly/lua';
-import {PhpGenerator, Order as PhpOrder} from 'blockly/php';
-import {PythonGenerator, Order as PythonOrder} from 'blockly/python';
-import {registerFieldMultilineInput} from '../field_multilineinput';
-import {Generators} from './generatorsType';
-
-/** The name this block is registered under. */
-export const BLOCK_NAME = 'text_multiline';
-
-// Block for multiline text input.
-const jsonDefinition = {
- type: BLOCK_NAME,
- message0: '%1 %2',
- args0: [
- {
- type: 'field_image',
- src:
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpP' +
- 'U2iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAdhgAAHYYBXaITgQAAABh0RVh0' +
- 'U29mdHdhcmUAcGFpbnQubmV0IDQuMS42/U4J6AAAAP1JREFUOE+Vks0KQUEYhjm' +
- 'RIja4ABtZ2dm5A3t3Ia6AUm7CylYuQRaUhZSlLZJiQbFAyRnPN33y01HOW08z88' +
- '73zpwzM4F3GWOCruvGIE4/rLaV+Nq1hVGMBqzhqlxgCys4wJA65xnogMHsQ5luj' +
- 'nYHTejBBCK2mE4abjCgMGhNxHgDFWjDSG07kdfVa2pZMf4ZyMAdWmpZMfYOsLiD' +
- 'MYMjlMB+K613QISRhTnITnsYg5yUd0DETmEoMlkFOeIT/A58iyK5E18BuTBfgYX' +
- 'fwNJv4P9/oEBerLylOnRhygmGdPpTTBZAPkde61lbQe4moWUvYUZYLfUNftIY4z' +
- 'wA5X2Z9AYnQrEAAAAASUVORK5CYII=',
- width: 12,
- height: 17,
- alt: '\u00B6',
- },
- {
- type: 'field_multilinetext',
- name: 'TEXT',
- text: '',
- },
- ],
- output: 'String',
- style: 'text_blocks',
- helpUrl: '%{BKY_TEXT_TEXT_HELPURL}',
- tooltip: '%{BKY_TEXT_TEXT_TOOLTIP}',
- extensions: ['parent_tooltip_when_inline'],
-};
-
-/**
- * Javascript block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The JavascriptGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toJavascript(
- block: Block,
- generator: JavascriptGenerator,
-): [string, JavascriptOrder] {
- // Text value.
- const code = generator.multiline_quote_(block.getFieldValue('TEXT'));
- const order =
- code.indexOf('+') !== -1
- ? JavascriptOrder.ADDITION
- : JavascriptOrder.ATOMIC;
- return [code, order];
-}
-
-/**
- * Dart block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The DartGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toDart(
- block: Block,
- generator: DartGenerator,
-): [string, DartOrder] {
- // Text value.
- const code = generator.multiline_quote_(block.getFieldValue('TEXT'));
- const order =
- code.indexOf('+') !== -1 ? DartOrder.ADDITIVE : DartOrder.ATOMIC;
- return [code, order];
-}
-
-/**
- * Lua block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The LuaGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toLua(
- block: Block,
- generator: LuaGenerator,
-): [string, LuaOrder] {
- // Text value.
- const code = generator.multiline_quote_(block.getFieldValue('TEXT'));
- const order =
- code.indexOf('..') !== -1 ? LuaOrder.CONCATENATION : LuaOrder.ATOMIC;
- return [code, order];
-}
-
-/**
- * PHP block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PhpGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPhp(
- block: Block,
- generator: PhpGenerator,
-): [string, PhpOrder] {
- // Text value.
- const code = generator.multiline_quote_(block.getFieldValue('TEXT'));
- const order =
- code.indexOf('.') !== -1 ? PhpOrder.STRING_CONCAT : PhpOrder.ATOMIC;
- return [code, order];
-}
-
-/**
- * Python block generator function.
- *
- * @param block The Block instance to generate code for.
- * @param generator The PythonGenerator calling the function.
- * @returns A tuple containing the code string and precedence.
- */
-export function toPython(
- block: Block,
- generator: PythonGenerator,
-): [string, PythonOrder] {
- // Text value.
- const code = generator.multiline_quote_(block.getFieldValue('TEXT'));
- const order =
- code.indexOf('+') !== -1 ? PythonOrder.ADDITIVE : PythonOrder.ATOMIC;
- return [code, order];
-}
-
-const definitionsDict = BlocklyCommon.createBlockDefinitionsFromJsonArray([
- jsonDefinition,
-]);
-
-/** The text_multiline BlockDefinition. */
-export const blockDefinition = definitionsDict[BLOCK_NAME];
-
-/**
- * Install the `text_multiline` block and all of its dependencies.
- *
- * @param gens The CodeGenerators to install per-block
- * generators on.
- */
-export function installBlock(gens: Generators = {}) {
- registerFieldMultilineInput();
- BlocklyCommon.defineBlocks(definitionsDict);
- if (gens.javascript) gens.javascript.forBlock[BLOCK_NAME] = toJavascript;
- if (gens.dart) gens.dart.forBlock[BLOCK_NAME] = toDart;
- if (gens.lua) gens.lua.forBlock[BLOCK_NAME] = toLua;
- if (gens.php) gens.php.forBlock[BLOCK_NAME] = toPhp;
- if (gens.python) gens.python.forBlock[BLOCK_NAME] = toPython;
-}
diff --git a/plugins/field-multilineinput/src/field_multilineinput.ts b/plugins/field-multilineinput/src/field_multilineinput.ts
deleted file mode 100644
index fd3f60831..000000000
--- a/plugins/field-multilineinput/src/field_multilineinput.ts
+++ /dev/null
@@ -1,781 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-/**
- * @fileoverview Multiline text input field.
- */
-
-import * as Blockly from 'blockly/core';
-
-/**
- * Class for an editable text area input field.
- */
-export class FieldMultilineInput extends Blockly.FieldTextInput {
- /**
- * Minimum editor width (in SVG/workspace units) when the field is open.
- * Prevents narrow editors when the initial text is very short.
- */
-
- static readonly EDITOR_MIN_WIDTH = 150;
-
- /**
- * The SVG group element that will contain a text element for each text row
- * when initialized.
- */
- textGroup: SVGGElement | null = null;
-
- /**
- * Defines the maximum number of lines of field.
- * If exceeded, scrolling functionality is enabled.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected maxLines_ = Infinity;
-
- /** Whether Y overflow is currently occurring. */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected isOverflowedY_ = false;
-
- /** Whether pressing Enter commits the value (default) or inserts a newline. */
- static enterCommits = true;
-
- /** Whether to show the keyboard-shortcut hint bar in the editor. */
- static showHint = true;
-
- /** The hint bar DOM element while the editor is open. */
- private hintElement: HTMLDivElement | null = null;
-
- /**
- * Cached natural width of the hint bar in px, keyed by scale.
- * Invalidated when zoom changes to avoid stale measurements.
- */
- private cachedHintWidth: {scale: number; widthPx: number} | null = null;
-
- /**
- * @param value The initial content of the field. Should cast to a string.
- * Defaults to an empty string if null or undefined. Also accepts
- * Field.SKIP_SETUP if you wish to skip setup (only used by subclasses
- * that want to handle configuration and setting the field value after
- * their own constructors have run).
- * @param validator An optional function that is called to validate any
- * constraints on what the user entered. Takes the new text as an
- * argument and returns either the accepted text, a replacement text, or
- * null to abort the change.
- * @param config A map of options used to configure the field.
- * See the [field creation documentation]{@link
- * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/multiline-text-input#creation}
- * for a list of properties this parameter supports.
- */
- constructor(
- value?: string | typeof Blockly.Field.SKIP_SETUP,
- validator?: FieldMultilineInputValidator,
- config?: FieldMultilineInputConfig,
- ) {
- super(Blockly.Field.SKIP_SETUP);
-
- if (value === Blockly.Field.SKIP_SETUP) return;
- if (config) {
- this.configure_(config);
- }
- this.setValue(value);
- if (validator) {
- this.setValidator(validator);
- }
- }
-
- /**
- * Configure the field based on the given map of options.
- *
- * @param config A map of options to configure the field based on.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override configure_(config: FieldMultilineInputConfig) {
- super.configure_(config);
- if (config.maxLines) this.setMaxLines(config.maxLines);
- }
-
- /**
- * Serializes this field's value to XML.
- * Should only be called by Blockly.Xml.
- *
- * @param fieldElement The element to populate with info about the field's
- * state.
- * @returns The element containing info about the field's state.
- */
- override toXml(fieldElement: Element): Element {
- // Replace '\n' characters with HTML-escaped equivalent '
'. This is
- // needed so the plain-text representation of the XML produced by
- // `Blockly.Xml.domToText` will appear on a single line (this is a
- // limitation of the plain-text format).
- fieldElement.textContent = (this.getValue() as string).replace(
- /\n/g,
- '
',
- );
- return fieldElement;
- }
-
- /**
- * Sets the field's value based on the given XML element. Should only be
- * called by Blockly.Xml.
- *
- * @param fieldElement The element containing info about the field's state.
- */
- override fromXml(fieldElement: Element) {
- this.setValue((fieldElement.textContent as string).replace(/
/g, '\n'));
- }
-
- /**
- * Saves this field's value.
- * This function only exists for subclasses of FieldMultilineInput which
- * predate the load/saveState API and only define to/fromXml.
- *
- * @returns The state of this field.
- */
- override saveState() {
- const legacyState = this.saveLegacyState(FieldMultilineInput);
- if (legacyState !== null) {
- return legacyState;
- }
- return this.getValue();
- }
-
- /**
- * Sets the field's value based on the given state.
- * This function only exists for subclasses of FieldMultilineInput which
- * predate the load/saveState API and only define to/fromXml.
- *
- * @param state The state of the variable to assign to this variable field.
- */
- override loadState(state: unknown) {
- if (this.loadLegacyState(Blockly.Field, state)) {
- return;
- }
- this.setValue(state);
- }
-
- /**
- * Create the block UI for this field.
- */
- override initView() {
- this.createBorderRect_();
- this.textGroup = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.G,
- {
- class: 'blocklyEditableField',
- },
- this.fieldGroup_,
- );
- if (this.fieldGroup_) {
- Blockly.utils.dom.addClass(this.fieldGroup_, 'blocklyField');
- }
- }
-
- /**
- * Get the text from this field as displayed on screen. May differ from
- * getText due to ellipsis, and other formatting.
- *
- * @returns Currently displayed text.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override getDisplayText_(): string {
- const block = this.getSourceBlock();
- if (!block) {
- throw new Error(
- 'The field has not yet been attached to its input. ' +
- 'Call appendField to attach it.',
- );
- }
- let textLines = this.getText();
- if (!textLines) {
- // Prevent the field from disappearing if empty.
- return Blockly.Field.NBSP;
- }
- const lines = textLines.split('\n');
- textLines = '';
- const displayLinesNumber = this.isOverflowedY_
- ? this.maxLines_
- : lines.length;
- for (let i = 0; i < displayLinesNumber; i++) {
- let text = lines[i];
- if (text.length > this.maxDisplayLength) {
- // Truncate displayed string and add an ellipsis ('...').
- text = text.substring(0, this.maxDisplayLength - 4) + '...';
- } else if (this.isOverflowedY_ && i === displayLinesNumber - 1) {
- text = text.substring(0, text.length - 3) + '...';
- }
- // Replace whitespace with non-breaking spaces so the text doesn't
- // collapse.
- text = text.replace(/\s/g, Blockly.Field.NBSP);
-
- textLines += text;
- if (i !== displayLinesNumber - 1) {
- textLines += '\n';
- }
- }
- if (block.RTL) {
- // The SVG is LTR, force value to be RTL.
- textLines += '\u200F';
- }
- return textLines;
- }
-
- /**
- * Called by setValue if the text input is valid. Updates the value of the
- * field, and updates the text of the field if it is not currently being
- * edited (i.e. handled by the htmlInput_). Is being redefined here to update
- * overflow state of the field.
- *
- * @param newValue The value to be saved. The default validator guarantees
- * that this is a string.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override doValueUpdate_(newValue: string) {
- super.doValueUpdate_(newValue);
- if (this.value_ !== null) {
- this.isOverflowedY_ = this.value_.split('\n').length > this.maxLines_;
- }
- }
-
- /** Updates the text of the textElement. */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override render_() {
- const block = this.getSourceBlock();
- if (!block) {
- throw new Error(
- 'The field has not yet been attached to its input. ' +
- 'Call appendField to attach it.',
- );
- }
- // Remove all text group children.
- let currentChild;
- const textGroup = this.textGroup as SVGElement;
- while ((currentChild = textGroup.firstChild)) {
- textGroup.removeChild(currentChild);
- }
-
- const constants = this.getConstants();
- // This can't happen, but TypeScript thinks it can and lint forbids `!.`.
- if (!constants) throw Error('Constants not found');
- // Add in text elements into the group.
- const lines = this.getDisplayText_().split('\n');
- let y = 0;
- for (let i = 0; i < lines.length; i++) {
- const lineHeight =
- constants.FIELD_TEXT_HEIGHT + constants.FIELD_BORDER_RECT_Y_PADDING;
- const span = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.TEXT,
- {
- class: 'blocklyText blocklyMultilineText',
- x: constants.FIELD_BORDER_RECT_X_PADDING,
- y: y + constants.FIELD_BORDER_RECT_Y_PADDING,
- dy: constants.FIELD_TEXT_BASELINE,
- },
- textGroup,
- );
- span.appendChild(document.createTextNode(lines[i]));
- y += lineHeight;
- }
-
- if (this.isBeingEdited_) {
- const htmlInput = this.htmlInput_ as HTMLElement;
- if (this.isOverflowedY_) {
- Blockly.utils.dom.addClass(
- htmlInput,
- 'blocklyHtmlTextAreaInputOverflowedY',
- );
- } else {
- Blockly.utils.dom.removeClass(
- htmlInput,
- 'blocklyHtmlTextAreaInputOverflowedY',
- );
- }
- }
-
- this.updateSize_();
-
- if (this.isBeingEdited_) {
- if (block.RTL) {
- // in RTL, we need to let the browser reflow before resizing
- // in order to get the correct bounding box of the borderRect
- // avoiding issue #2777.
- setTimeout(this.resizeEditor_.bind(this), 0);
- } else {
- this.resizeEditor_();
- }
- const htmlInput = this.htmlInput_ as HTMLElement;
- if (!this.isTextValid_) {
- Blockly.utils.dom.addClass(htmlInput, 'blocklyInvalidInput');
- Blockly.utils.aria.setState(
- htmlInput,
- Blockly.utils.aria.State.INVALID,
- true,
- );
- } else {
- Blockly.utils.dom.removeClass(htmlInput, 'blocklyInvalidInput');
- Blockly.utils.aria.setState(
- htmlInput,
- Blockly.utils.aria.State.INVALID,
- false,
- );
- }
- }
- }
-
- /** Updates the size of the field based on the text. */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override updateSize_() {
- const constants = this.getConstants();
- // This can't happen, but TypeScript thinks it can and lint forbids `!.`.
- if (!constants) throw Error('Constants not found');
- const nodes = (this.textGroup as SVGElement).childNodes;
- let totalWidth = 0;
- let totalHeight = 0;
- for (let i = 0; i < nodes.length; i++) {
- const tspan = nodes[i] as SVGTextElement;
- const textWidth = Blockly.utils.dom.getTextWidth(tspan);
- if (textWidth > totalWidth) {
- totalWidth = textWidth;
- }
- totalHeight +=
- constants.FIELD_TEXT_HEIGHT +
- (i > 0 ? constants.FIELD_BORDER_RECT_Y_PADDING : 0);
- }
- if (this.isBeingEdited_) {
- // The default width is based on the longest line in the display text,
- // but when it's being edited, width should be calculated based on the
- // absolute longest line, even if it would be truncated after editing.
- // Otherwise we would get wrong editor width when there are more
- // lines than this.maxLines_.
- const actualEditorLines = String(this.value_).split('\n');
- const dummyTextElement = Blockly.utils.dom.createSvgElement(
- Blockly.utils.Svg.TEXT,
- {class: 'blocklyText blocklyMultilineText'},
- );
-
- for (let i = 0; i < actualEditorLines.length; i++) {
- if (actualEditorLines[i].length > this.maxDisplayLength) {
- actualEditorLines[i] = actualEditorLines[i].substring(
- 0,
- this.maxDisplayLength,
- );
- }
- dummyTextElement.textContent = actualEditorLines[i];
- const lineWidth = Blockly.utils.dom.getTextWidth(dummyTextElement);
- if (lineWidth > totalWidth) {
- totalWidth = lineWidth;
- }
- }
-
- const htmlInput = this.htmlInput_ as HTMLElement;
- const scrollbarWidth = htmlInput.offsetWidth - htmlInput.clientWidth;
- totalWidth += scrollbarWidth;
-
- if (FieldMultilineInput.showHint) {
- // Reserve a row at the bottom of the editor for the keyboard hint bar.
- // The textarea's padding-bottom (set in widgetCreate_) keeps the text
- // and caret out of this reserved strip.
- totalHeight +=
- constants.FIELD_TEXT_HEIGHT + constants.FIELD_BORDER_RECT_Y_PADDING;
- }
- }
- if (this.borderRect_) {
- totalHeight += constants.FIELD_BORDER_RECT_Y_PADDING * 2;
- // NOTE: Adding 1 extra px to prevent wrapping. Based on browser zoom,
- // the rounding of the calculated value can result in the line wrapping
- // unintentionally.
- totalWidth += constants.FIELD_BORDER_RECT_X_PADDING * 2 + 1;
- }
- if (this.isBeingEdited_) {
- totalWidth = Math.max(totalWidth, FieldMultilineInput.EDITOR_MIN_WIDTH);
-
- // Measure the hint bar's natural width to make sure the editor is wide enough.
- if (FieldMultilineInput.showHint && this.hintElement?.isConnected) {
- const scale = (this.workspace_ as Blockly.WorkspaceSvg).getScale();
- if (!this.cachedHintWidth || this.cachedHintWidth.scale !== scale) {
- // Temporarily let the element size to its content to measure its
- // natural width, unaffected by the current WidgetDiv width.
- this.hintElement.style.width = 'max-content';
- const widthPx = this.hintElement.offsetWidth;
- this.hintElement.style.width = '';
- if (widthPx > 0) this.cachedHintWidth = {scale, widthPx};
- }
- if (this.cachedHintWidth) {
- totalWidth = Math.max(
- totalWidth,
- this.cachedHintWidth.widthPx / scale,
- );
- }
- }
- }
- if (this.borderRect_) {
- this.borderRect_.setAttribute('width', `${totalWidth}`);
- this.borderRect_.setAttribute('height', `${totalHeight}`);
- }
- this.size_.width = totalWidth;
- this.size_.height = totalHeight;
-
- this.positionBorderRect_();
- }
-
- /**
- * Show the inline free-text editor on top of the text.
- * Overrides the default behaviour to force rerender in order to
- * correct block size, based on editor text.
- *
- * @param e Optional mouse event that triggered the field to open, or
- * undefined if triggered programmatically.
- * @param quietInput True if editor should be created without focus.
- * Defaults to false.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- override showEditor_(e?: Event, quietInput?: boolean) {
- super.showEditor_(e, quietInput);
- this.forceRerender();
- }
-
- /**
- * Create the text input editor widget.
- *
- * @returns The newly created text input editor.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override widgetCreate_(): HTMLTextAreaElement {
- const div = Blockly.WidgetDiv.getDiv() as HTMLDivElement;
- const scale = (this.workspace_ as Blockly.WorkspaceSvg).getScale();
- const constants = this.getConstants();
- // This can't happen, but TypeScript thinks it can and lint forbids `!.`.
- if (!constants) throw Error('Constants not found');
-
- const htmlInput = document.createElement('textarea');
- htmlInput.className = 'blocklyHtmlInput blocklyHtmlTextAreaInput';
- htmlInput.setAttribute('spellcheck', String(this.spellcheck_));
- const fontSize = constants.FIELD_TEXT_FONTSIZE * scale + 'pt';
- div.style.fontSize = fontSize;
- htmlInput.style.fontSize = fontSize;
- const borderRadius = Blockly.FieldTextInput.BORDERRADIUS * scale + 'px';
- htmlInput.style.borderRadius = borderRadius;
- const paddingX = constants.FIELD_BORDER_RECT_X_PADDING * scale;
- const paddingY = (constants.FIELD_BORDER_RECT_Y_PADDING * scale) / 2;
- const lineHeight =
- constants.FIELD_TEXT_HEIGHT + constants.FIELD_BORDER_RECT_Y_PADDING;
- const hintHeightPx = Math.ceil(lineHeight * scale);
- // When the hint bar is visible it occupies one text row at the bottom;
- // pad the textarea by that row so we don't edit text underneath it.
- const paddingBottomPx = FieldMultilineInput.showHint
- ? paddingY + hintHeightPx
- : paddingY;
- htmlInput.style.padding = `${paddingY}px ${paddingX}px ${paddingBottomPx}px ${paddingX}px`;
- htmlInput.style.lineHeight = lineHeight * scale + 'px';
- div.appendChild(htmlInput);
-
- htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_);
- htmlInput.setAttribute('data-untyped-default-value', String(this.value_));
- htmlInput.setAttribute('data-old-value', '');
- if (Blockly.utils.userAgent.GECKO) {
- // In FF, ensure the browser reflows before resizing to avoid issue #2777.
- setTimeout(this.resizeEditor_.bind(this), 0);
- } else {
- this.resizeEditor_();
- }
-
- this.bindInputEvents_(htmlInput);
-
- if (FieldMultilineInput.showHint) {
- this.hintElement = this.createHint(hintHeightPx);
- this.hintElement.style.fontFamily = constants.FIELD_TEXT_FONTFAMILY;
- div.appendChild(this.hintElement);
- }
-
- return htmlInput;
- }
-
- /**
- * Creates the keyboard hint bar shown at the bottom of the editor.
- *
- * Keys are rendered as keycaps (bordered boxes).
- *
- * @param heightPx The height of the hint bar in pixels.
- * @returns The hint bar element.
- */
- private createHint(heightPx: number): HTMLDivElement {
- const shiftKey = '⇧';
- const enterKey = '⏎';
- const hint = document.createElement('div');
- hint.className = 'blocklyMultilineHint';
- hint.setAttribute('aria-hidden', 'true');
- hint.style.height = heightPx + 'px';
-
- // Plain Enter
- const enterGroup = document.createElement('div');
- enterGroup.className = 'blocklyMultilineHintGroup';
- enterGroup.appendChild(this.createHintKeycap(enterKey));
- enterGroup.appendChild(this.createHintColon());
- enterGroup.appendChild(
- this.createHintLabel(
- FieldMultilineInput.enterCommits ? 'commit' : 'newline',
- ),
- );
- hint.appendChild(enterGroup);
-
- // Modifier+Enter
- const modEnterGroup = document.createElement('div');
- modEnterGroup.className = 'blocklyMultilineHintGroup';
- modEnterGroup.appendChild(this.createHintKeycap(shiftKey));
- modEnterGroup.appendChild(this.createHintKeycap(enterKey));
- modEnterGroup.appendChild(this.createHintColon());
- modEnterGroup.appendChild(
- this.createHintLabel(
- FieldMultilineInput.enterCommits ? 'newline' : 'commit',
- ),
- );
- hint.appendChild(modEnterGroup);
-
- return hint;
- }
-
- /**
- * Creates a colon separator element used between keycaps and the action icon.
- *
- * @returns The colon element.
- */
- private createHintColon(): HTMLSpanElement {
- const colon = document.createElement('span');
- colon.className = 'blocklyMultilineHintColon';
- colon.textContent = ':';
- return colon;
- }
-
- /**
- * Creates a keycap element displaying a single key label.
- *
- * @param label The key symbol to display.
- * @returns The keycap element.
- */
- private createHintKeycap(label: string): HTMLSpanElement {
- const key = document.createElement('span');
- key.className = 'blocklyMultilineHintKey';
- key.textContent = label;
- return key;
- }
-
- /**
- * Creates a text label describing the result of a key action.
- *
- * Uses Blockly.Msg for i18n with hardcoded English fallbacks.
- *
- * @param type Either 'commit' or 'newline'.
- * @returns The label element.
- */
- private createHintLabel(type: 'commit' | 'newline'): HTMLSpanElement {
- const label = document.createElement('span');
- label.className = 'blocklyMultilineHintLabel';
- label.textContent =
- type === 'commit'
- ? Blockly.Msg['FIELD_MULTILINEINPUT_FINISH_EDITING'] || 'Finish editing'
- : Blockly.Msg['FIELD_MULTILINEINPUT_NEW_LINE'] || 'New line';
- return label;
- }
-
- /**
- * Sets the maxLines config for this field.
- *
- * @param maxLines Defines the maximum number of lines allowed, before
- * scrolling functionality is enabled.
- */
- setMaxLines(maxLines: number) {
- if (
- typeof maxLines === 'number' &&
- maxLines > 0 &&
- maxLines !== this.maxLines_
- ) {
- this.maxLines_ = maxLines;
- this.forceRerender();
- }
- }
-
- /**
- * Returns the maxLines config of this field.
- *
- * @returns The maxLines config value.
- */
- getMaxLines(): number {
- return this.maxLines_;
- }
-
- /**
- * Handle key down to the editor.
- *
- * Enter commits the value and closes the editor (matching FieldTextInput).
- * Shift+Enter inserts a newline at the cursor.
- * All other keys are handled by the parent class (Escape reverts, Tab navigates).
- *
- * @param e Keyboard event.
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- protected override onHtmlInputKeyDown_(e: KeyboardEvent) {
- if (e.key === 'Enter') {
- if (e.isComposing) {
- // Let the IME (input method editor) finalize its composition naturally;
- // don't commit or insert a newline ourselves.
- return;
- }
- const shiftPressed = e.shiftKey;
- const shouldCommit = FieldMultilineInput.enterCommits
- ? !shiftPressed
- : shiftPressed;
- if (shouldCommit) {
- super.onHtmlInputKeyDown_(e);
- } else {
- this.insertNewline();
- e.preventDefault();
- e.stopPropagation();
- }
- } else {
- super.onHtmlInputKeyDown_(e);
- }
- }
-
- /**
- * Inserts a newline character at the current cursor position in the textarea.
- *
- * The browser's default Enter-key behavior inserts a newline, but
- * Shift+Enter has no default character-insertion action, so we handle it
- * manually here. After splicing the character we dispatch an `input` event
- * to trigger Blockly's onHtmlInputChange handler (programmatic `.value`
- * assignment doesn't fire `input` on its own).
- */
- private insertNewline() {
- const htmlInput = this.htmlInput_;
- if (!htmlInput) return;
- const start = htmlInput.selectionStart ?? htmlInput.value.length;
- const end = htmlInput.selectionEnd ?? start;
- htmlInput.value =
- htmlInput.value.substring(0, start) +
- '\n' +
- htmlInput.value.substring(end);
- htmlInput.selectionStart = htmlInput.selectionEnd = start + 1;
- htmlInput.dispatchEvent(new Event('input'));
- }
-
- /**
- * Construct a FieldMultilineInput from a JSON arg object,
- * dereferencing any string table references.
- *
- * @param options A JSON object with options (text, and spellcheck).
- * @returns The new field instance.
- * @nocollapse
- */
- static override fromJson(
- options: FieldMultilineInputFromJsonConfig,
- ): FieldMultilineInput {
- const text = Blockly.utils.parsing.replaceMessageReferences(options.text);
- // `this` might be a subclass of FieldMultilineInput if that class doesn't
- // override the static fromJson method.
- return new this(text, undefined, options);
- }
-}
-
-/**
- * Register the field and any dependencies.
- */
-export function registerFieldMultilineInput() {
- Blockly.fieldRegistry.register('field_multilinetext', FieldMultilineInput);
-}
-
-/**
- * CSS for multiline field.
- */
-Blockly.Css.register(`
-.blocklyHtmlTextAreaInput {
- font-family: monospace;
- resize: none;
- overflow: hidden;
- height: 100%;
- text-align: left;
-}
-
-.blocklyHtmlTextAreaInputOverflowedY {
- overflow-y: scroll;
-}
-
-.blocklyMultilineHint {
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- display: flex;
- justify-content: space-around;
- align-items: center;
- padding: 0 4px;
- box-sizing: border-box;
- font-size: 0.85em;
- color: rgba(0, 0, 0, 0.6);
- background-color: white;
- border-top: 1px solid rgba(0, 0, 0, 0.15);
- border-radius: 0 0 4px 4px;
- user-select: none;
- pointer-events: none;
-}
-
-.blocklyMultilineHintGroup {
- display: inline-flex;
- align-items: center;
-}
-
-.blocklyMultilineHintKey {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- min-width: 1.3em;
- height: 1.3em;
- padding: 0 0.25em;
- margin: 0 0.1em;
- border: 1px solid rgba(0, 0, 0, 0.35);
- border-radius: 3px;
- background-color: #f5f5f5;
- line-height: 1;
- box-sizing: border-box;
-}
-
-.blocklyMultilineHintColon {
- margin: 0 0.15em;
-}
-
-.blocklyMultilineHintLabel {
- white-space: nowrap;
-}
-`);
-
-/**
- * Config options for the multiline input field.
- */
-export interface FieldMultilineInputConfig
- extends Blockly.FieldTextInputConfig {
- maxLines?: number;
-}
-
-/**
- * fromJson config options for the multiline input field.
- */
-export interface FieldMultilineInputFromJsonConfig extends FieldMultilineInputConfig {
- text?: string;
-}
-
-/**
- * A function that is called to validate changes to the field's value before
- * they are set.
- *
- * @see {@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/validators#return_values}
- * @param newValue The value to be validated.
- * @returns One of three instructions for setting the new value: `T`, `null`,
- * or `undefined`.
- *
- * - `T` to set this function's returned value instead of `newValue`.
- *
- * - `null` to invoke `doValueInvalid_` and not set a value.
- *
- * - `undefined` to set `newValue` as is.
- */
-export type FieldMultilineInputValidator = Blockly.FieldTextInputValidator;
diff --git a/plugins/field-multilineinput/src/index.ts b/plugins/field-multilineinput/src/index.ts
deleted file mode 100644
index 051fded12..000000000
--- a/plugins/field-multilineinput/src/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import * as textMultiline from './blocks/textMultiline';
-
-export * from './field_multilineinput';
-
-// Re-export all parts of the block definition.
-export * as textMultiline from './blocks/textMultiline';
-
-// This package currently exports a single block. More may
-// be added later.
-export const installAllBlocks = textMultiline.installBlock;
diff --git a/plugins/field-multilineinput/test/block_test.mocha.js b/plugins/field-multilineinput/test/block_test.mocha.js
deleted file mode 100644
index d60fd2cf1..000000000
--- a/plugins/field-multilineinput/test/block_test.mocha.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * @license
- * Copyright 2024 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import fs from 'fs';
-import * as Blockly from 'blockly/core';
-import * as en from 'blockly/msg/en';
-import 'blockly/blocks';
-
-import {javascriptGenerator} from 'blockly/javascript';
-import {dartGenerator} from 'blockly/dart';
-import {phpGenerator} from 'blockly/php';
-import {pythonGenerator} from 'blockly/python';
-import {luaGenerator} from 'blockly/lua';
-import {installAllBlocks} from '../src/index';
-import {assert} from 'chai';
-
-const blockJson = {
- blocks: {
- languageVersion: 0,
- blocks: [
- {
- type: 'text_print',
- inputs: {
- TEXT: {
- block: {
- type: 'text_multiline',
- fields: {
- TEXT: 'Picard said, "Beam me up!".\nO\'Brien made it so.',
- },
- },
- },
- },
- },
- ],
- },
-};
-
-/**
- * Assert that the generated code matches the golden code for the specified
- * language.
- * @param {string} suffix The suffix of the golden file.
- * @param {string} generated The generated code to compare against the
- * golden file.
- */
-function checkResult(suffix, generated) {
- const fileName = `test/golden/golden.${suffix}`;
- const goldenContents = fs.readFileSync(fileName);
- // Normalize the line feeds.
- const normalized = goldenContents.toString().replace(/(?:\r\n|\r|\n)/g, '\n');
- assert.equal(generated, normalized);
-}
-
-suite('Multiline Text Block Generators', function () {
- suiteSetup(function () {
- Blockly.setLocale(en);
- installAllBlocks({
- javascript: javascriptGenerator,
- dart: dartGenerator,
- lua: luaGenerator,
- python: pythonGenerator,
- php: phpGenerator,
- });
- });
- setup(function () {
- this.workspace = new Blockly.Workspace();
- Blockly.serialization.workspaces.load(blockJson, this.workspace);
- });
- test('JavaScript', function () {
- const generated = javascriptGenerator.workspaceToCode(this.workspace);
- checkResult('js', generated);
- });
- test('Dart', function () {
- const generated = dartGenerator.workspaceToCode(this.workspace);
- checkResult('dart', generated);
- });
- test('Lua', function () {
- const generated = luaGenerator.workspaceToCode(this.workspace);
- checkResult('lua', generated);
- });
- test('Python', function () {
- const generated = pythonGenerator.workspaceToCode(this.workspace);
- checkResult('py', generated);
- });
- test('PHP', function () {
- const generated = phpGenerator.workspaceToCode(this.workspace);
- checkResult('php', generated);
- });
- teardown(function () {
- this.workspace.dispose();
- });
-});
diff --git a/plugins/field-multilineinput/test/field_multilineinput_test.mocha.js b/plugins/field-multilineinput/test/field_multilineinput_test.mocha.js
deleted file mode 100644
index ce46e94d1..000000000
--- a/plugins/field-multilineinput/test/field_multilineinput_test.mocha.js
+++ /dev/null
@@ -1,300 +0,0 @@
-/**
- * @license
- * Copyright 2023 Google LLC
- * SPDX-License-Identifier: Apache-2.0
- */
-
-const {testHelpers} = require('@blockly/dev-tools');
-const {
- FieldMultilineInput,
- registerFieldMultilineInput,
-} = require('../src/index');
-const Blockly = require('blockly');
-const {assert} = require('chai');
-const sinon = require('sinon');
-
-const {
- assertFieldValue,
- FieldCreationTestCase,
- FieldValueTestCase,
- runConstructorSuiteTests,
- runFromJsonSuiteTests,
- runSetValueTests,
-} = testHelpers;
-
-suite('FieldMultilineInput', function () {
- setup(function () {
- registerFieldMultilineInput();
- });
- /**
- * Configuration for field tests with invalid values.
- * @type {Array}
- */
- const invalidValueTestCases = [
- {title: 'Undefined', value: undefined},
- {title: 'Null', value: null},
- ];
- /**
- * Configuration for field tests with valid values.
- * @type {Array}
- */
- const validValueTestCases = [
- {title: 'Empty string', value: '', expectedValue: ''},
- {title: 'String no newline', value: 'value', expectedValue: 'value'},
- {
- title: 'String with newline',
- value: 'bark bark\n bark bark bark\n bark bar bark bark\n',
- expectedValue: 'bark bark\n bark bark bark\n bark bar bark bark\n',
- },
- {title: 'Boolean true', value: true, expectedValue: 'true'},
- {title: 'Boolean false', value: false, expectedValue: 'false'},
- {title: 'Number (Truthy)', value: 1, expectedValue: '1'},
- {title: 'Number (Falsy)', value: 0, expectedValue: '0'},
- {title: 'NaN', value: NaN, expectedValue: 'NaN'},
- ];
- const addArgsAndJson = function (testCase) {
- testCase.args = [testCase.value];
- testCase.json = {text: testCase.value};
- };
- invalidValueTestCases.forEach(addArgsAndJson);
- validValueTestCases.forEach(addArgsAndJson);
-
- /**
- * The expected default value for the field being tested.
- * @type {*}
- */
- const defaultFieldValue = '';
- /**
- * Asserts that the field property values are set to default.
- * @param {!FieldMultilineInput} field The field to check.
- */
- const assertFieldDefault = function (field) {
- assertFieldValue(field, defaultFieldValue);
- };
-
- /**
- * Asserts that the field properties are correct based on the test case.
- * @param {FieldMultilineInput} field The field to check.
- * @param {FieldValueTestCase} testCase The test case.
- */
- const validTestCaseAssertField = function (field, testCase) {
- assertFieldValue(field, testCase.expectedValue);
- };
-
- runConstructorSuiteTests(
- FieldMultilineInput,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- runFromJsonSuiteTests(
- FieldMultilineInput,
- validValueTestCases,
- invalidValueTestCases,
- validTestCaseAssertField,
- assertFieldDefault,
- );
-
- suite('setValue', function () {
- suite('Empty -> New Value', function () {
- setup(function () {
- this.field = new FieldMultilineInput();
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- defaultFieldValue,
- );
- });
- suite('Value -> New Value', function () {
- const initialValue = 'oldValue';
- setup(function () {
- this.field = new FieldMultilineInput(initialValue);
- });
- runSetValueTests(
- validValueTestCases,
- invalidValueTestCases,
- initialValue,
- );
- });
- });
-
- suite('Keyboard behavior', function () {
- /**
- * Dispatches a keydown event on the editor's textarea, setting the
- * cursor/selection beforehand.
- * @param {!HTMLTextAreaElement} textarea The editor's textarea.
- * @param {!Object} options KeyboardEvent options (key, shiftKey, etc.).
- * @param {number} [selectionStart] Optional selection start to set first.
- * @param {number} [selectionEnd] Optional selection end to set first.
- */
- const pressKey = function (
- textarea,
- options,
- selectionStart,
- selectionEnd,
- ) {
- if (selectionStart !== undefined) {
- textarea.selectionStart = selectionStart;
- textarea.selectionEnd = selectionEnd ?? selectionStart;
- }
- textarea.dispatchEvent(
- new KeyboardEvent('keydown', {
- bubbles: true,
- cancelable: true,
- ...options,
- }),
- );
- };
-
- setup(function () {
- this.jsdomCleanup = require('jsdom-global')(
- '
',
- );
- // See https://github.com/RaspberryPiFoundation/blockly-samples/issues/2528.
- global.SVGElement = window.SVGElement;
- // Blockly's focus handling constructs FocusEvent, which jsdom exposes on
- // window but not as a global.
- global.FocusEvent = window.FocusEvent;
- // jsdom doesn't provide requestAnimationFrame/cancelAnimationFrame, which
- // block rendering relies on. Route them through (faked) timers so they
- // exist and can be flushed deterministically in teardown.
- this.clock = sinon.useFakeTimers();
- window.requestAnimationFrame = (cb) => setTimeout(cb, 0);
- window.cancelAnimationFrame = (id) => clearTimeout(id);
- this.workspace = Blockly.inject('blocklyDiv');
-
- if (!Blockly.Blocks['multiline_block']) {
- Blockly.defineBlocksWithJsonArray([
- {
- type: 'multiline_block',
- message0: '%1',
- args0: [
- {type: 'field_multilinetext', name: 'FIELD', text: 'hello'},
- ],
- },
- ]);
- }
- this.block = this.workspace.newBlock('multiline_block');
- this.block.initSvg();
- this.block.render();
- this.field = this.block.getField('FIELD');
-
- // Open the editor so we exercise the real